sqoop将oracle导入到hbase经验之谈

之前公司有个项目,通过sqoop,将oracle的数据导入到hbase。整个过程出现过很多问题,现在我将我导入的过程跟遇到的问题和解决方法写下来,希望能帮助大家

  • 测试连接

先测试sqoop是否能连接到oracle

sqoop list-tables --connect jdbc:oracle:thin:@ip:1521:*** --username *** --password ***

如果能成功,将会列出oracle中的表

  • hbase建立表
create 'tablename',{NAME=>'familyname',COMPRESSION=>'SNAPPY'},{SPLITS => ['a','b'']}

注释 :
SNAPPY : 是hbase中比较好的压缩算法,可以节省很大的空间
SPLITS : hbase预分区,就是为了表中的数据均匀分布各个分区。防止热点问题。hbase建表默认是一个分区的。关于SPLITS,大家可以参考

http://blog.csdn.net/luyee2010/article/details/9284925
http://www.tuicool.com/articles/jMjIbe

  • 导数据
sqoop import --connect jdbc:oracle:thin:@ip:*** --username *** --password *** --table TABLENAME --hbase-table *** --hbase-bulkload --column-family family --hbase-row-key id --split-by id -m 40 --columns id,name,age

导入过程问题即解决
问题1:
–table TABLENAME
表名必须大写, 否则报错 :
Error during import: No primary key could be found for table *

问题2:
–hbase-row-key id 中的id,必须在–columns中显示,否则报错:
Could not insert row with null value for row-key column

问题3:
–columns id,name,age, 后面列的显示,列名跟逗号之间必须没有空格,否则报错:
Error parsing arguments for import
Unrecognized argument

问题4
Oracle中的表,必须有主键,不然会报错。如果确实没有主键,则需要加上 –split-by id。oracle中哪个列作为hbase的rowkey,则–split-by后面跟上什么,我这里是用id

参数解释

hbase-bulkload : hbase中快速将数据导入hbase的功能。快速的原因,可以参考hbase官网介绍:第69节 : 69. Bulk Loading
http://hbase.apache.org/book.html#arch.bulk.load

hbase-bulkload 参数遇到的问题 : 我在导入大量数据时,例如上亿数据时,有时程序执行成功了,hdfs的hbase目录里面相对应的表也有文件。但是hbase就是查不出数据。然后去掉这个参数重新导入,就可以查询数据了。网上也具体找不出原因。可能sqoop对这个参数有bug。还不够完善,所以在导入大批量数据时,最好暂时不用这个参数。小数据还可以使用。我的 sqoop 版本是 1.5.2

-m : sqoop实际也是mapreduce,这个-m就是值map的个数。默认是4
这里写图片描述

你可能感兴趣的:(sqoop)