Sqoop1.4.6安装与使用(二)

来源:互联网 发布:360浏览器使用js脚本 编辑:程序博客网 时间:2024/05/17 00:51

转载请注明出处: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 123456bin/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 0