笔者总结下Sqoop初学习过程中的一些经验,与大家分享和讨论下。首先,在网上找了些零碎的资料了解皮毛后,直接参阅官方的文档地址
http://archive.cloudera.com/cdh/3/sqoop/SqoopUserGuide.html
。然后,通过manual文件来获取更多的信息,命令如下代码所示。最后,在网上搜索到一些实例,但是这些实例不一定适合我的工作环境,所以需要测试和修改,得到适合自己的环境的命令。
笔者的应用环境是DB2数据和Hive数据之间传数据。大家用sqoop会比较关心两个选项import、export,本文主要总结这两个选项。考虑Hive数据库中的表的类型可以是不带分区和带分区,在import数据到Hive的时候会有所不一样,总结的内容也分块叙述。命令中的一些参数选项,可以写入到一个options file,这样可以规范管理和增加命令的复用率,但是本文为了展示直观,直接将命令全部写一起。
一、从DB2导入Hive数据库
1. Hive上无分区表
对于没有分区的表,可以直接将DB2数据导入到Hive库的表中,无需指定partition,是最简单的,命令如下:
2. Hive上单个分区表
对于Hive库中有分区,而分区是单个分区的,需要用--hive-partition-key KEY --hive-partition-value KEY_VALUE两个命令组合,命令如下(没有找到合适表的测试),所以这个仅供参考。
3. Hive上多个分区表
由于--hive-partition-key KEY --hive-partition-value KEY_VALUE不支持传入多个分区键,至少笔者搜索和测试的结果显示是如此。所以,多分区的表只能绕弯的入到Hive库中,这里提供的一个建议方法是:
二、从Hive库导入DB2库
先将Hive数据库内的表,导出到HDFS上。其实这里笔者困惑于两者同在HDFS上,区别在哪里,可能跟Hive的普通表、外部表、分区表这个概念有一定的类似理解方式吧。再用sqoop工具导入到DB2数据库,这里,笔者暂时没有测试通过,是否可以用Hive实体表的存放位置做--export-dir的参数,后续测试一下。下面给出一个建议方法:
三、options file的使用方法
将繁琐的命令进行规范化,并添加相应的注释,这就是options file来做的事情。举一个简单的例子:
[Bash shell]
纯文本查看
复制代码
1
2
3
|
$sqoop help
$sqoop
import
--help
$sqoop
export
--help
|
笔者的应用环境是DB2数据和Hive数据之间传数据。大家用sqoop会比较关心两个选项import、export,本文主要总结这两个选项。考虑Hive数据库中的表的类型可以是不带分区和带分区,在import数据到Hive的时候会有所不一样,总结的内容也分块叙述。命令中的一些参数选项,可以写入到一个options file,这样可以规范管理和增加命令的复用率,但是本文为了展示直观,直接将命令全部写一起。
一、从DB2导入Hive数据库
1. Hive上无分区表
对于没有分区的表,可以直接将DB2数据导入到Hive库的表中,无需指定partition,是最简单的,命令如下:
[Bash shell]
纯文本查看
复制代码
1
2
3
4
|
$sqoop
import
--hive-
import
--connect jdbc:db2:
//10
.000.000.000:60000
/DB_NAME
--username username --password password \
--outdir
/home/ocdc/bin/app/sqoop_ouput_files
--table DB2_TABNAME --hive-table HIVE_TABNAME -m 1 --target-
dir
'/TODB2_PATH/'
\
--fields-terminated-by
"\t"
--lines-terminated-by
"\n"
--delete-target-
dir
--null-string
''
--null-non-string
''
\
-- --default-character-
set
=utf-8
|
2. Hive上单个分区表
对于Hive库中有分区,而分区是单个分区的,需要用--hive-partition-key KEY --hive-partition-value KEY_VALUE两个命令组合,命令如下(没有找到合适表的测试),所以这个仅供参考。
[Bash shell]
纯文本查看
复制代码
1
2
3
|
$sqoop
import
--hive-
import
--connect jdbc:db2:
//10
.000.000.000:60000
/DB_NAME
--username username --password password --outdir
/home/ocdc/bin/app/sqoop_ouput_files
\
--table DB2_TABNAME --hive-table HIVE_TABNAME -m 1 --target-
dir
'/TODB2_PATH/DB2_TABNAME/'
--fields-terminated-by
"\t"
--lines-terminated-by
"\n"
\
--hive-partition-key KEY --hive-partition-value KEY_VALUE --delete-target-
dir
--null-string
''
--null-non-string
''
-- --default-character-
set
=utf-8
|
3. Hive上多个分区表
由于--hive-partition-key KEY --hive-partition-value KEY_VALUE不支持传入多个分区键,至少笔者搜索和测试的结果显示是如此。所以,多分区的表只能绕弯的入到Hive库中,这里提供的一个建议方法是:
[Bash shell]
纯文本查看
复制代码
01
02
03
04
05
06
07
08
09
10
|
# add partition for dst table
$hive -e
"alter table HIVE_TABNAME add partition (month_id='201410',day_id='20141007',hour_id='2014100700');"
# sqoop import data to hdfs
$sqoop
import
--connect jdbc:db2:
//10
.000.000.000:60000
/DB_NAME
--username username --password password -m 1 --outdir
/home/ocdc/bin/app/sqoop_ouput_files
\
$--table DB2_TABNAME --target-
dir
"/TODB2_PATH"
--fields-terminated-by
'\t'
--null-string
''
--null-non-string
''
--delete-target-
dir
\
$-- --default-character-
set
=utf-8
# hive load data into table
$hive -e
"set mapred.job.ocdc.priority=100;load data inpath '/TODB2_PATH/part-m-00000' overwrite into table HIVE_TABNAME partition (month_id=${MONTH_ID},day_id=${DAY_ID}, hour_id=${DAY_ID}${HOUR_ID});"
|
二、从Hive库导入DB2库
先将Hive数据库内的表,导出到HDFS上。其实这里笔者困惑于两者同在HDFS上,区别在哪里,可能跟Hive的普通表、外部表、分区表这个概念有一定的类似理解方式吧。再用sqoop工具导入到DB2数据库,这里,笔者暂时没有测试通过,是否可以用Hive实体表的存放位置做--export-dir的参数,后续测试一下。下面给出一个建议方法:
[Bash shell]
纯文本查看
复制代码
1
2
3
4
|
$hive -e
"insert overwrite directory '/TODB2_PATH/${OP_TIME}${TAB_NAME}/' select * from ${TAB_NAME} where month_id=${OP_TIME}"
$sqoop
export
--connect jdbc:db2:
//10
.000.000.000:60000
/DB_NAME
--username username --password password \
$--outdir
/home/ocdc/bin/app/sqoop_ouput_files
--table ${DST_SCHEMA}.${TMP_TAB_NAME} \
$--
export
-
dir
"/TODB2_PATH/${OP_TIME}${TAB_NAME}/000000_0"
--input-null-string
''
--input-null-non-string
''
|
三、options file的使用方法
将繁琐的命令进行规范化,并添加相应的注释,这就是options file来做的事情。举一个简单的例子:
[Bash shell]
纯文本查看
复制代码
01
02
03
04
05
06
07
08
09
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
|
# options_file.opt
# This is a sqoop import options file.
# call it like:
# sqoop --options-file /home/ocdc/bin/app/sqoop_option_files/options_file.opt --table DB2_TABNAME \
# --export-dir '/TODB2_PATH/DB2_TABNAME' --input-null-non-string '' --input-null-string ''
# Specifies the tool being invoked
export
# Connect parameter and value
# default connect to 155
--connect
jdbc:db2:
//10
.000.000.000:60000
/DB_NAME
--username
username
--password
password
# Output directory for generated code
# in order to remove them cyclical.
--outdir
/home/ocdc/bin/app/sqoop_ouput_files
# Sets the field separator character
--fields-terminated-by
"\0001"
# Sets the end-of-line character
--lines-terminated-by
"\n"
|