我们在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地址的参数。
————————————————
版权声明:本文为CSDN博主「沉默的迷茫」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/pttaoge/article/details/83902233