设为首页 收藏本站
查看: 771|回复: 0

[经验分享] Sqoop将mysql数据导入hbase的血与泪

[复制链接]

尚未签到

发表于 2017-12-13 06:07:29 | 显示全部楼层 |阅读模式
  Sqoop将mysql数据导入hbase的血与泪(整整搞了大半天)

  版权声明:本文为yunshuxueyuan原创文章。
  如需转载请标明出处: https://my.oschina.net/yunshuxueyuan/blog
  QQ技术交流群:299142667
  一、 问题如何产生
  庞老师只讲解了mysql和hdfs,mysq与hive的数据互导,因此决定研究一下将mysql数据直接导入hbase,这时出现了一系列问题。
  心酸史:

  二、 开始具体解决问题
  需求:(将以下这张表数据导入mysql)

  由此,编写如下sqoop导入命令
  

sqoop import -D sqoop.hbase.add.row.key=true --connect  
jdbc:mysql:
//192.168.1.9/spider --username root --password root  
--table test_goods --hbase-create-table --hbase-table t_goods  
  
--column-family cf --hbase-row-key>  


http://www.cnblogs.com/sxt-zkys/p/data:image/gif;base64,R0lGODlhAQABAPABAP///wAAACH5BAEKAAAALAAAAAABAAEAAAICRAEAOw==http://www.cnblogs.com/sxt-zkys/p/data:image/gif;base64,R0lGODlhAQABAPABAP///wAAACH5BAEKAAAALAAAAAABAAEAAAICRAEAOw==
  一切看着都很正常,接下来开始执行命令,报如下错误:
  1、
  

Error during import: No primary key could be found for table *  

  报错原因就是指定的mysql表名不是大写,所以mysql表名必须大写
  2、
  

Could not insert row with null value for row-key column  


  报错原因是没有指定mysql的列名,所以必须指定列名,并且hbase-row-key>  3、
  

Error parsing arguments for import Unrecognized argument  

  报错原因是在指定mysql的列名时,用逗号隔开的时候我多加了空格,所以在Columns后显示的列名只能用逗号隔开,不要带空格。
  将以上三个问题排除后:我的最新导入命令变为如下:
  

sqoop import -D sqoop.hbase.add.row.key=true --connect  
jdbc:mysql:
//192.168.1.9:3306/spider --username root --password root
  
--table TEST_GOODS --columns>  
--hbase-create-table --hbase-table t_goods --column-family cf

  
--hbase-row-key>  

  注意:这里有个小问题:记得将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,进行最终的测试!
  最终执行的导入命令如下:(完整的导入命令)
  

sqoop import -D sqoop.hbase.add.row.key=true --connect  
jdbc:mysql:
//192.168.1.9:3306/spider --username root --password root
  
--table TEST_GOODS --columns>  
--hbase-create-table --hbase-table t_goods --column-family cf
  
--hbase-row-key>  


http://www.cnblogs.com/sxt-zkys/p/data:image/gif;base64,R0lGODlhAQABAPABAP///wAAACH5BAEKAAAALAAAAAABAAEAAAICRAEAOw==http://www.cnblogs.com/sxt-zkys/p/data:image/gif;base64,R0lGODlhAQABAPABAP///wAAACH5BAEKAAAALAAAAAABAAEAAAICRAEAOw==
  终于见到久违的页面:

  查看hbase,数据已经成功导入

  最后我将命令写入一个xxx文件,通过sqoop –options-file xxx 执行导入命令
  错误写法如下:
  

import  

  
-D sqoop.hbase.add.row.key=true
  

  
--connect jdbc:mysql://192.168.1.9:3306/spider
  

  
--username root
  

  
--password root
  

  
--table TEST_GOODS
  


  
--columns>  

  
--hbase-create-table
  

  
--hbase-table test_goods
  

  
--column-family cf
  


  
--hbase-row-key>  

  
--where "ID >= 5"
  

  
-m 1
  

  错误原因:参数的名称和参数的值没有进行回车换行
  正确写法:
  

import  

  
-D
  

  
sqoop.hbase.add.row.key=true
  

  
--connect
  

  
jdbc:mysql://192.168.1.9:3306/spider
  

  
--username
  

  
root
  

  
--password
  

  
root
  

  
--table
  

  
TEST_GOODS
  

  
--columns
  

  
ID,GOODS_NAME,GOODS_PRICE
  

  
--hbase-create-table
  

  
--hbase-table
  

  
tt_goods
  

  
--column-family
  

  
cf
  

  
--hbase-row-key
  

  
ID
  

  
--where
  

  
ID>=5
  

  
-m
  

  
1
  

  注:参数含义解释
  -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解决完成!!!
  三、知识拓展,定时增量导入
  1、Sqoop增量导入
  

sqoop import -D sqoop.hbase.add.row.key=true --connect  
jdbc:mysql:
//192.168.1.9:3306/spider --username root --password root
  
--table TEST_GOODS --columns>  
--hbase-create-table --hbase-table t_goods --column-family cf

  
--hbase-row-key>  
--last-value '2017-06-27' --split-by U_DATE
  

  --incremental lastmodified 增量导入支持两种模式 append 递增的列;lastmodified时间戳。
  --check-column 增量导入时参考的列
  --last-value 最小值,这个例子中表示导入2017-06-27到今天的值
  2、Sqoop job:
  

sqoop job --create testjob01 --import --connect  
jdbc:mysql:
//192.168.1.9:3306/spider --username root --password root
  
--table TEST_GOODS --columns>  
--hbase-create-table --hbase-table t_goods --column-family cf

  
--hbase-row-key>  

  设置定时执行以上sqoop job
  使用linux定时器:crontab -e
  例如每天执行
  0 0 * * * /opt/local/sqoop-1.4.6/bin/sqoop job ….
  --exec testjob01

  版权声明:本文为yunshuxueyuan原创文章。
  如需转载请标明出处: https://my.oschina.net/yunshuxueyuan/blog
  QQ技术交流群:299142667

运维网声明 1、欢迎大家加入本站运维交流群:群②:261659950 群⑤:202807635 群⑦870801961 群⑧679858003
2、本站所有主题由该帖子作者发表,该帖子作者与运维网享有帖子相关版权
3、所有作品的著作权均归原作者享有,请您和我们一样尊重他人的著作权等合法权益。如果您对作品感到满意,请购买正版
4、禁止制作、复制、发布和传播具有反动、淫秽、色情、暴力、凶杀等内容的信息,一经发现立即删除。若您因此触犯法律,一切后果自负,我们对此不承担任何责任
5、所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其内容的准确性、可靠性、正当性、安全性、合法性等负责,亦不承担任何法律责任
6、所有作品仅供您个人学习、研究或欣赏,不得用于商业或者其他用途,否则,一切后果均由您自己承担,我们对此不承担任何法律责任
7、如涉及侵犯版权等问题,请您及时通知我们,我们将立即采取措施予以解决
8、联系人Email:admin@iyunv.com 网址:www.yunweiku.com

所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其承担任何法律责任,如涉及侵犯版权等问题,请您及时通知我们,我们将立即处理,联系人Email:kefu@iyunv.com,QQ:1061981298 本贴地址:https://www.yunweiku.com/thread-423510-1-1.html 上篇帖子: mysql分布式数据库中间件对比 下篇帖子: Spring Boot访问mysql(JPA方式)最简单配置
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

扫码加入运维网微信交流群X

扫码加入运维网微信交流群

扫描二维码加入运维网微信交流群,最新一手资源尽在官方微信交流群!快快加入我们吧...

扫描微信二维码查看详情

客服E-mail:kefu@iyunv.com 客服QQ:1061981298


QQ群⑦:运维网交流群⑦ QQ群⑧:运维网交流群⑧ k8s群:运维网kubernetes交流群


提醒:禁止发布任何违反国家法律、法规的言论与图片等内容;本站内容均来自个人观点与网络等信息,非本站认同之观点.


本站大部分资源是网友从网上搜集分享而来,其版权均归原作者及其网站所有,我们尊重他人的合法权益,如有内容侵犯您的合法权益,请及时与我们联系进行核实删除!



合作伙伴: 青云cloud

快速回复 返回顶部 返回列表