Sqoop1.4.6安装与使用(二)

30 篇文章 0 订阅
20 篇文章 0 订阅

转载请注明出处:http://blog.csdn.net/u012842205/article/details/53378703


本文接上一篇博客,主要叙述使用Sqoop1.4.6从Oracle导入HBase的操作过程和一些坑。请确保所有安装组件能正常使用,且相互兼容。Sqoop1.4.6的安装和环境配置请参看上一篇博客。本文主要涉及Sqoop1的具体使用,其中难免有错,欢迎指正!


1 环境说明

操作系统: Ubuntu 16.04 x86_64

Apache Hadoop: 2.7.3

Apache Zookeeper: 3.4.8

Apache Sqoop: 1.4.6

Oracle JDBC: 1.8.0_101

Oracle DB: 10.2.0.1.0 (10g)

Apache HBase: 1.2.2


2 Sqoop工具简介

Sqoop的功能主要是调用各个定义好的工具,完成导入工作。这也是Sqoop的设计思路,各个主要功能抽象成具体工具类。此处只介绍本文会用到的一些工具,其他工具请参看Sqoop1.4.6 官方文档

(1)import工具

这个工具用于将数据从一个结构化数据源(本文是Oracle)导入数据到分布式大数据平台(本文是HBase)。只要指定一些描述数据源和分布式平台的参数即可。

(2)list-tables和list-databases工具

这个工具主要用于枚举数据源的table和db,一般我用它作简单的连通性测试。


3 参数介绍

这里介绍Oracle数据源与HBase所需要传入给Sqoop的一些参数。其他参数未在本文涉及范围内的,将不作介绍,请参看Sqoop1.4.6 官方文档

(1)Oracle选项

选项释意示例
--connect指定Oracle JDBC的链接字符串jdbc:oracle:thin:@192.168.1.10:1521:DB_TEST
--username数据库链接用户名ORACLE_USER
--driverJDBC driver名称oracle.jdbc.driver.OracleDriver
--password数据库链接密码123456
--table指定要导入的数据源tabletb_testing
--columns指定要导入的table中哪些列,不指定则默认所有列导入col1,clo2,clo3,col4
--null-string当某个列的字段为null时,指定代替字符串"The value's null"
--where指定导入过程中的where语句"T1.tagId in (1,2,3)"
--query用于指定导入数据的查询语句,具体见下文"select * from tb_testing \$CONDITIONS"
--split-by指定并行导入时用于进行并行(split)操作所依据的列,如主键。具体见下文。"id"
-m指定map导入作业的数量(并行多少个map),默认4,具体见下文4

注意:以上选项也可以直接用于其他关系型数据库,支持JDBC规范的链接,比如MySQL、PostgreSQL等

(2)HBase选项

选项释意示例
--hbase-table指定导入数据到哪个HBase表,Sqoop根据这个选项确定数据目的地是HBase"nm:TargetTB"
--column-family指定要导入数据到哪个列簇,每次作业只能导入一个列簇,不能指定多个。cf1
--hbase-create-table指定这个选项,若HBase中没有表和列簇,Sqoop作业将自动创建。 
--hbase-row-key指定作为rowkey的关系型数据库的列,多个列或混合列请用号隔开createtime,GUID

4 作业

(1)JDBC包

从Oracle导入HBase将使用Oracle的JDBC Driver包,请将这个包放置在CLASSPATH中,或者直接复制到$SQOOP_HOME/lib下,sqoop作业启动前会自动将此路劲下所有包加载到虚拟机。

(2)数据源连通性

导入作业前,最好进行数据源连通性检测,上文提到,可以使用list-tables和list-databases工具完成:

bin/sqoop list-tables --connect jdbc:oracle:thin:@192.168.1.10:1521:DB_TEST --username ORACLE_USER --password 123456

bin/sqoop list-databases --connect jdbc:oracle:thin:@192.168.1.10:1521:DB_TEST --username ORACLE_USER --password 123456

注意: 这里直接明文写出password不安全,可以直接使用控制台输入,在命令最后使用-P即可,这样不需要直接指定password,也可以读文件中的密码,这部分不在本文范围,请自行查看Sqoop1.4.6 官方文档


(3)数据导入作业

完成上一步连通性测试后,可以指定作业开始导入工作。调用也很简单,将Oracle和HBase相关参数设置好,即可导入。 下面是一些导出作业示例。

a) 从oracle数据库导入HBase,这里HBase表指定了nm作为namespace,列簇是info。

bin/sqoop import --connect jdbc:oracle:thin:@192.168.33.148:1521:DB_TEST  --username ORACLE_USER --null-string 'nullvalue'  \
--hbase-table nm:table1 --column-family info --hbase-row-key "create_date,id" --query  \
"select create_date,id,name,desc,pic,gender,age from ORACLE_USER.USER_INFO WHERE \$CONDITIONS" --split-by id  \
-m 4 -P
注意,指定--query时必须加上WHERE \$CONDITIONS,这个CONDITIONS变量由Sqoop自己去设置,不需我们从外部输入,这个where也是为了并行执行导入作业。 另注意,指定了--query,则其他的--table, --columns, --where将被忽略,不会起作用

b) 从Oracle导入数据到HBase,这里指定了并行16个map,并指定了where子句。

bin/sqoop import --connect jdbc:oracle:thin:@192.168.33.148:1521:DB_TEST  --username ORACLE_USER --hbase-table DeviceInfo   \
--column-family dev --table TB_DEV_INFO --hbase-row-key "GUID" --split-by GUID -m 16  \
--columns "GUID,device_name,device_desc,device_producer,addr,create_time" --where "create_time > '20160501000000'"-P
--split-by指定用id列的值作为多个并行map作业的拆分依据。也即是说,若欲导入数据的主键集合为(1,2,3,4,5,6,7,8,9,10),则在并行为2的情况下,将拆分成(1,2,3,4,5)和(6,7,8,9,10),分裂成两个map作业去执行。所以指定的--split-by一定要是所有数据记录唯一的。

-m 指定分裂多少个map并行,默认是4,在没有指定--split-by或无法指定的情况下,这个参数必须为1,因为map无法分裂。

--hbase-row-key 指定以哪些列的值作为hbase数据记录的rowkey,本例指定了两个列, create_date和id, 生成的rowkey将用下划线把两个列值连接起来,如: 20160123112300_1。 前面是create_date, 后面就是id了,中间是下划线。而这个连接符貌似是不能用户指定的。起码我没有在官方文档上看到。


5 一些问题

导入Oracle时,有些问题值得注意,也是一些坑:

(1)Oracle的表名必须大写(--table TB_DEV_INFO);

(2)用户名必须大写字母(--username ORACLE_USER);

(3)组合行键参数中的字段名都必须大写(--hbase-row-key "GUID,NAME");

(4)作为组合行键的几个字段都不能有null值,否则会报错,请执行该语句前先确认, 也可以使用--null-value指定。

(5)sqoop不会导入值为null的字段。

很多时候会出现异常Could not insert row with null value for row-key column,这时候多半是上面几种情况。



  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值