用sqoop将oracle数据导入Hbase 使用笔记

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/qq_21398167/article/details/72732236

网上已经有很多关于这方面的资料,但是我在使用过程中也遇见了不少问题

1. sqoop 的环境我没有自己搭建  直接用的公司的

2. oracle 小白怕把公司环境弄坏了,自己用容器搭建了一个

docker pull docker.io/wnameless/oracle-xe-11g

docker run -d -p 2022:22 -p 1521:1521 -p 8080:8080 --name oracle wnameless/oracle-xe-11g

创建表,用户,插入数据,oracle数据库就算准备好了

SQL> select * from student;


        ID NAME                        AGE
---------- -------------------- ----------
         1 zy01                         10
         2 zy02                         10
         3 zy03                         10

3. 测试连通性

# sqoop list-tables --connect jdbc:oracle:thin:@122.18.10.114:1521:xe --username test --password test111


ERROR sqoop.Sqoop: Got exception running Sqoop: java.lang.RuntimeException: Could not load db driver class: oracle.jdbc.OracleDriver

解决办法  需要有ojdbc6.jar,放在$SQOOP_HOME/lib里

 ERROR sqoop.Sqoop: Got exception running Sqoop: java.lang.NullPointerException

这个错误主要就是没有连接成功,检查一下,用户名,密码,防火墙什么的,笔者是因为网络根本就不通。。。。

到这里就能成功返回 所以的表

4. 然后开始数据迁移

简介及部分重要参数介绍

Sqoop除了能够将数据从关系型数据库导入到HDFS和Hive中,还能够导入到HBase表中。

--hbase-table:通过指定--hbase-table参数值,指明将数据导入到HBase表中,而不是HDFS上的一个目录。输入表中的每一行将会被转换成一个HBase Put操作的输出表的一行。--hbase-row-key:你可以使用--hbase-row-key参数,手动的指定row key。默认的情况下,Sqoop会将split-by 列作为HBase rowkey列。如果没有指定split-by值,它将会试图识别关系表的关键字。

如果源表是组合关键字,--hbase-row-key 参数后面值是用逗号分隔的组合关键字属性的列表,在这样种情况下,通过合并组合关键字属性的值来产生HBase的Row key,每个值之间使用下划线分隔开来。

--column-family:必须指定--column-family参数,每一个输出列都会被放到同一个family列族中。 --hbase-create-table:如果HBase中的目标表和列族不存在,如果你使用该参数,Sqoop在运行任务的时候会根据HBase的默认配置,首先创建目标表和列族。

注意一:当源表中是组合关键字的时候,必须手动指定--hbase-row-key参数,Sqoop才能将数据导入到HBase中,否则不行。注意二:如果HBase中的目标表和列族不存在,如果没加--hbase-create-table参数,Sqoop job将会报错误退出运行。所以你在将数据从源表导入到HBase之前,需要首先在HBase中创建目标表和其对应的列族。

# sqoop import --append --connect jdbc:oracle:thin:@122.18.10.114:1521:xe --username test --password test111 --m 1 --table STUDENT --columns ID,NAME,AGE --hbase-create-table --hbase-table student --hbase-row-key ID --column-family deptinfo

报错   ERROR db.DBRecordReader: Top level exception: 
java.sql.SQLSyntaxErrorException: ORA-00904: "age": invalid identifier

解决办法  把表名和字段名字用大写 (笔者开始用的小写)

成功以后进入 hbase查看

hbase(main):001:0> scan 'student'
ROW                         COLUMN+CELL                                                                    
 1                          column=deptinfo:AGE, timestamp=1495704288610, value=10                         
 1                          column=deptinfo:NAME, timestamp=1495704288610, value=zy01                      
 2                          column=deptinfo:AGE, timestamp=1495704288610, value=10                         
 2                          column=deptinfo:NAME, timestamp=1495704288610, value=zy02                      
 3                          column=deptinfo:AGE, timestamp=1495704288610, value=10                         
 3                          column=deptinfo:NAME, timestamp=1495704288610, value=zy03                      
3 row(s) in 0.3250 seconds

参考文档

http://www.aichengxu.com/oracle/9929535.htm

http://blog.csdn.net/liuxingjiaofu/article/details/6953701

http://www.cnblogs.com/byrhuangqiang/p/3922594.html

猜你喜欢

转载自blog.csdn.net/qq_21398167/article/details/72732236