sqoop使用metastore进行增量数据抽取

       我们在sqoop抽取数据,肯定会 遇到这么个场景,我们肯定会用到一个调度工具来执行sqoop脚本,这时我们如果想在别的客户端也能调用该sqoop脚本,那么我们就需要使用sqoop提供的metastore,metastore它本质是一个hsql内存级数据库,sqoop通过它达到几个客户端共享sqoop脚本的信息,从而使别的客户端也能调用除自己本身创建的sqoop脚本。

   在使用metastore之前,我们需要选择一台机器放置metastore,比如我们选择master机器

打开master机器的sqoop-site.xml文件。 cd  $SQOOP_HOME/conf/sqoop-site.xml 加入下面的配置


<property>
    <name>sqoop.metastore.server.location</name>
    <!--数据存放的目录-->
    <value>/usr/local/sqoop/tmp/sqoop-metastore/shared.db</value>
    <description>Path to the shared metastore database files.
    If this is not set, it will be placed in ~/.sqoop/.
    </description>
</property>

<property>
    <name>sqoop.metastore.server.port</name>
    <!--client访问的端口-->
    <value>16000</value>
    <description>Port that this metastore should listen on.
    </description>
 </property>

然后再在其他机器的sqoop-site.xml文件加入下面的配置

<property>
    <name>sqoop.metastore.client.autoconnect.url</name>
    <value>jdbc:hsqldb:hsql://master:16000/sqoop</value>
 </property>

最后在启动master的metastore     sqoop metastore &,启动成功后,我们能通过jps命令看到一个sqoop应用已经启动

之后我们就是创建一个sqoop job并将其保存进metastore里面。

创建之前我们先在mysql库里面建一张测试表

CREATE TABLE `customer` (
`customer_number`  int(11) NOT NULL AUTO_INCREMENT COMMENT '客户编号,主键' ,
`customer_name`  varchar(50) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL COMMENT '客户名称' ,
`customer_street_address`  varchar(50) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL COMMENT '客户住址' ,
`customer_zip_code`  int(11) NULL DEFAULT NULL COMMENT '邮编' ,
`customer_city`  varchar(30) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL COMMENT '所在城市' ,
`customer_state`  varchar(2) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL COMMENT '所在省份' ,
`times`  timestamp NULL DEFAULT NULL ON UPDATE CURRENT_TIMESTAMP ,
PRIMARY KEY (`customer_number`)
)
ENGINE=MyISAM
DEFAULT CHARACTER SET=utf8 COLLATE=utf8_general_ci
AUTO_INCREMENT=9
CHECKSUM=0
ROW_FORMAT=DYNAMIC
DELAY_KEY_WRITE=0
;

INSERT INTO `customer` VALUES (1, 'really large customers', '7500 louise dr.', 17050, 'mechanicsburg', 'pa', '2018-10-10 14:48:29');
INSERT INTO `customer` VALUES (2, 'small stores', '2500 woodland st.', 17055, 'pittsburgh', 'pa', '2018-10-10 13:48:35');
INSERT INTO `customer` VALUES (3, 'medium retailers', '1111 ritter rd.', 17055, 'pittsburgh', 'pa', '2018-10-10 10:48:40');
INSERT INTO `customer` VALUES (4, 'good companies', '9500 scott st.', 17050, 'mechanicsburg', 'pa', '2018-10-6 12:48:48');
INSERT INTO `customer` VALUES (5, 'wonderful shops', '3333 rossmoyne rd.', 17050, 'mechanicsburg', 'pa', '2018-10-10 17:48:55');
INSERT INTO `customer` VALUES (6, 'loyal clients', '7070 ritter rd.', 17055, 'pittsburgh', 'pa', '2018-10-2 14:49:00');
INSERT INTO `customer` VALUES (7, 'distinguished partners', '9999 scott st.', 17050, 'mechanicsburg', 'pa', '2018-10-8 14:49:06');

编写sqoop脚本

[hdfs@master root]$ sqoop job --create customertest --meta-connect jdbc:hsqldb:hsql://master:16000/sqoop  -- import --connect jdbc:mysql://hostname:3306/test  --query "select * from customer  where \$CONDITIONS" --username root --password root --target-dir /data/customer --check-column customer_number --incremental append --last-value 1 -m 1

该sqoop脚本我是采用append的方式 来处理增量数据,每次获得增量数据,我直接另外生成一个小文件保存下来,如果是使用lastModify ,那么增量数据它会根据和并列合并到一个文件里面中。

append

–incremental append基于递增列的增量导入(将递增列值大于阈值的所有数据增量导入Hadoop)
–check-column递增列
–last-value阈值(int)

lastmodified

–incremental lastmodified 基于时间列的增量导入(将时间列大于等于阈值的所有数据增量导入Hadoop)
–check-column递增列
–last-value阈值(int)
–merge-key 合并列(主键,合并键值相同的记录)

如果你是lastmodified,那么就必须有个合并列,同时如果操作的文件比较大,那么使用lastmodified就有点慢了,使用append也有个坏处,如果小文件过多了,会影响外部表读取数据的数据,所以这个都大家自己去掌握吧。

之后我们使用sqoop job -list来查看创建的job,我们当时是在master机器上创建的,现在我们可以在segment01机器来查看 我们之前创建的job

最后在执行这个job

因为我们再每个客户端的配置文件中有配置metastore的属性,所以我们再执行该job时,可以直接省略指定metastore地址的参数。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值