Hadoop平台上用Sqoop在Hive和DB2数据库之间传输数据的实践和总结

来源:互联网 发布:中英文双语小说 软件 编辑:程序博客网 时间:2024/05/17 03:52
笔者总结下Sqoop初学习过程中的一些经验,与大家分享和讨论下。首先,在网上找了些零碎的资料了解皮毛后,直接参阅官方的文档地址http://archive.cloudera.com/cdh/3/sqoop/SqoopUserGuide.html 。然后,通过manual文件来获取更多的信息,命令如下代码所示。最后,在网上搜索到一些实例,但是这些实例不一定适合我的工作环境,所以需要测试和修改,得到适合自己的环境的命令。

[Bash shell] 纯文本查看 复制代码
?
1
2
3
$sqoop help
$sqoopimport--help
$sqoopexport--help

  笔者的应用环境是DB2数据和Hive数据之间传数据。大家用sqoop会比较关心两个选项import、export,本文主要总结这两个选项。考虑Hive数据库中的表的类型可以是不带分区和带分区,在import数据到Hive的时候会有所不一样,总结的内容也分块叙述。命令中的一些参数选项,可以写入到一个options file,这样可以规范管理和增加命令的复用率,但是本文为了展示直观,直接将命令全部写一起。

一、从DB2导入Hive数据库

1. Hive上无分区表
  对于没有分区的表,可以直接将DB2数据导入到Hive库的表中,无需指定partition,是最简单的,命令如下:
[Bash shell] 纯文本查看 复制代码
?
1
2
3
4
$sqoopimport--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
$sqoopimport--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
$sqoopimport--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}"
$sqoopexport--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"
0 0
原创粉丝点击