Sqoop将mysql数据导入hbase的血与泪(整整搞了大半天) java
版权声明:本文为yunshuxueyuan原创文章。
如需转载请标明出处: https://my.oschina.net/yunshuxueyuan/blog
QQ技术交流群:299142667mysql
1、 问题如何产生linux
庞老师只讲解了mysql和hdfs,mysq与hive的数据互导,所以决定研究一下将mysql数据直接导入hbase,这时出现了一系列问题。sql
心酸史:数据库
2、 开始具体解决问题并发
需求:(将如下这张表数据导入mysql)app
由此,编写以下sqoop导入命令分布式
一切看着都很正常,接下来开始执行命令,报以下错误:ide
一、oop
报错缘由就是指定的mysql表名不是大写,因此mysql表名必须大写
二、
报错缘由是没有指定mysql的列名,因此必须指定列名,而且hbase-row-key id 中的id,必须在–columns中显示。 --columns ID,GOODS_NAME, GOODS_PRICE
三、
报错缘由是在指定mysql的列名时,用逗号隔开的时候我多加了空格,因此在Columns后显示的列名只能用逗号隔开,不要带空格。
将以上三个问题排除后:个人最新导入命令变为以下:
注意:这里有个小问题:记得将id>=5引发来
再次执行导入命令:出现以下状况(卡了好长时间)
发下map执行完成了,可是也就只卡在这里不动了,mapreduce任务一直在后台起着,一段时间后死掉,在这期间不停的执行导入命令和杀掉mapreduce的job
hadoop job -list 查看mapreduce 的job列表
hadoop job -kill job_id 杀死某个Job
通过长时间的测试,忽然意识到当前用的是Hbase伪分布式,一会儿恍然大悟:
缘由:由于当前环境为hbase的伪分布式,因此hbase的数据是存在本地磁盘上的,
而且由自带的zookeeper进行管理。而将mysql数据导入hbase的原理其实就是将数据导入hdfs,因此要想导入成功,存放hbase的数据地址应该在hdfs上才能够。因此如何解决这个问题,我想你们知道了,那就是开启hbase彻底分布式。
通过一顿折腾将虚拟机回复到hbase彻底分布式的快照,安装好sqoop,进行最终的测试!
最终执行的导入命令以下:(完整的导入命令)
终于见到久违的页面:
查看hbase,数据已经成功导入
最后我将命令写入一个xxx文件,经过sqoop –options-file xxx 执行导入命令
错误写法以下:
错误缘由:参数的名称和参数的值没有进行回车换行
正确写法:
注:参数含义解释
-D sqoop.hbase.add.row.key=true 是否将rowkey相关字段写入列族中,默认为false,默认状况下你将在列族中看不到任何row key中的字段。注意,该参数必须放在import以后。
--connect 数据库链接字符串
--username –password mysql数据库的用户名密码
--table Test_Goods表名,注意大写
--hbase-create-table 若是hbase中该表不存在则建立
--hbase-table 对应的hbase表名
--hbase-row-key hbase表中的rowkey,注意格式
--column-family hbase表的列族
--where 导入是mysql表的where条件,写法和sql中同样
--split-by CREATE_TIME 默认状况下sqoop使用4个并发执行任务,须要制订split的列,若是不想使用并发,能够用参数 --m 1
到此,bug解决完成!!!
3、知识拓展,定时增量导入
一、Sqoop增量导入
--incremental lastmodified 增量导入支持两种模式 append 递增的列;lastmodified时间戳。
--check-column 增量导入时参考的列
--last-value 最小值,这个例子中表示导入2017-06-27到今天的值
二、Sqoop job:
设置定时执行以上sqoop job
使用linux定时器:crontab -e
例如天天执行
0 0 * * * /opt/local/sqoop-1.4.6/bin/sqoop job ….
--exec testjob01