文档章节

Sqoop将mysql数据导入hbase的血与泪

goldbin
 goldbin
发布于 2017/07/26 16:08
字数 1319
阅读 80
收藏 0

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 id -m 1

一切看着都很正常,接下来开始执行命令,报如下错误:

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 id 中的id,必须在–columns中显示。  --columns ID,GOODS_NAME, GOODS_PRICE

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 id,goods_name,goods_price 
--hbase-create-table --hbase-table t_goods --column-family cf 
--hbase-row-key id --where "id >= 5" -m 1

注意:这里有个小问题:记得将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 ID,GOODS_NAME,GOODS_PRICE 
--hbase-create-table --hbase-table t_goods --column-family cf 
--hbase-row-key ID --where "ID >= 5" -m 1

终于见到久违的页面:

 

查看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 ID,GOODS_NAME,GOODS_PRICE

--hbase-create-table

--hbase-table test_goods

--column-family cf

--hbase-row-key ID

--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 ID,GOODS_NAME,GOODS_PRICE 
--hbase-create-table --hbase-table t_goods --column-family cf 
--hbase-row-key ID --incremental lastmodified --check-column U_DATE 
--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 ID,GOODS_NAME,GOODS_PRICE 
--hbase-create-table --hbase-table t_goods --column-family cf 
--hbase-row-key ID -m 1

设置定时执行以上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

© 著作权归作者所有

goldbin
粉丝 0
博文 13
码字总数 26896
作品 0
海淀
CTO(技术副总裁)
私信 提问
sqoop导入数据到Base并同步hive与impala

使用Sqoop从MySQL导入数据到Hive和HBase 及近期感悟 基础环境 Sqool和Hive、HBase简介 测试Sqoop 使用Sqoop从MySQL导入数据到Hive 使用Sqoop从MySQL导入数据到HBase 关于Sqoop2 综上所述 其他...

hblt-j
2018/07/20
193
0
Sqoop数据导入到HBase遇上的问题及解决方法

  【IT168 技术】运行bin/sqoop import --connect jdbc:mysql://ip:port/database --username * --password **--hbase-bulkload --hbase-create-table --column-family info --hbase-row-k......

中国大数据
2018/05/31
0
0
sqoop 完成与关系型数据库的互导

一.安装SQOOP后可使用如下命令列出mysql数据库中的所有数据库,与检验是否安装成功。 # sqoop list-databases --connect jdbc:mysql://localhost:3306/ --username root --password 123456 ...

gulf
2018/06/26
58
0
sqoop从关系型数据库导数据到hdfs和hbase上

本人最近弄了些sqoop导数据方法和命令,关于批量导入和一般导入,在本机器上linux环境运行正常; (一)Oracle导入到hdfs上 sqoop import --connect jdbc:oracle:thin:@ip:端口号:databaseNa...

可爱的ZLZLZL
2012/12/20
4.7K
0
sqoop1.4.6 to hbase1.2 in hue4.1躺坑总结

一、sqoop1.4.6 to hbase1.2 in hue4.1 CM安装 cdh 5.15.x,因想用简单的sqoop1所以parce装的sqoop1 client,经测试报:SQOOPCONFDIR找不到,mysql drive no find ,检查发现安装目录和classpa...

hblt-j
2018/07/31
825
2

没有更多内容

加载失败,请刷新页面

加载更多

OSChina 周四乱弹 —— 当你简历注水但还是找到了工作

Osc乱弹歌单(2019)请戳(这里) 【今日歌曲】 @花间小酌 :#今日歌曲推荐# 分享成龙的单曲《男儿当自强》。 《男儿当自强》- 成龙 手机党少年们想听歌,请使劲儿戳(这里) @hxg2016 :刚在...

小小编辑
今天
2.8K
22
靠写代码赚钱的一些门路

作者 @mezod 译者 @josephchang10 如今,通过自己的代码去赚钱变得越来越简单,不过对很多人来说依然还是很难,因为他们不知道有哪些门路。 今天给大家分享一个精彩的 GitHub 库,这个库整理...

高级农民工
昨天
4
0
用好项目管理工具,人人都可以成为项目经理

现在市面上的项目管理工具越来越多了,但是大多数都是一些协同工具或轻量项目管理工具。如果是多团队、跨部门使用或者企业级的项目管理,从管理思想到工具运用,需要适应企业的业务流程体系,...

cs平台
昨天
12
0
只需一步,在Spring Boot中统一Restful API返回值格式与统一处理异常

统一返回值 在前后端分离大行其道的今天,有一个统一的返回值格式不仅能使我们的接口看起来更漂亮,而且还可以使前端可以统一处理很多东西,避免很多问题的产生。 比较通用的返回值格式如下:...

晓月寒丶
昨天
69
0
区块链应用到供应链上的好处和实际案例

区块链可以解决供应链中的很多问题,例如记录以及追踪产品。那么使用区块链应用到各产品供应链上到底有什么好处?猎头悬赏平台解优人才网小编给大家做个简单的分享: 使用区块链的最突出的优...

猎头悬赏平台
昨天
32
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部