之前公司有个项目,通过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
-m : sqoop实际也是mapreduce,这个-m就是值map的个数。默认是4