分享

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

xuanxufeng 2016-3-16 16:49:09 发表于 总结型 [显示全部楼层] 回帖奖励 阅读模式 关闭右栏 1 18997
本帖最后由 xuanxufeng 于 2016-3-16 16:55 编辑

问题导读


1.如何将DB2导入Hive数据库?
2.有分区和无分区二者有什么区别?
3.如何从Hive库导入DB2库?








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

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

一、从DB2导入Hive数据库

1. Hive上无分区表
  对于没有分区的表,可以直接将DB2数据导入到Hive库的表中,无需指定partition,是最简单的,命令如下:
[mw_shl_code=bash,true] $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[/mw_shl_code]

2. Hive上单个分区表
  对于Hive库中有分区,而分区是单个分区的,需要用--hive-partition-key KEY --hive-partition-value KEY_VALUE两个命令组合,命令如下(没有找到合适表的测试),所以这个仅供参考。
[mw_shl_code=bash,true] $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[/mw_shl_code]

3. Hive上多个分区表
  由于--hive-partition-key KEY --hive-partition-value KEY_VALUE不支持传入多个分区键,至少笔者搜索和测试的结果显示是如此。所以,多分区的表只能绕弯的入到Hive库中,这里提供的一个建议方法是:
[mw_shl_code=bash,true]# 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});"[/mw_shl_code]



二、从Hive库导入DB2库
  先将Hive数据库内的表,导出到HDFS上。其实这里笔者困惑于两者同在HDFS上,区别在哪里,可能跟Hive的普通表、外部表、分区表这个概念有一定的类似理解方式吧。再用sqoop工具导入到DB2数据库,这里,笔者暂时没有测试通过,是否可以用Hive实体表的存放位置做--export-dir的参数,后续测试一下。下面给出一个建议方法:

[mw_shl_code=bash,true] $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 ''[/mw_shl_code]



三、options file的使用方法

  将繁琐的命令进行规范化,并添加相应的注释,这就是options file来做的事情。举一个简单的例子:
[mw_shl_code=bash,true]# 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"[/mw_shl_code]

  由于本人技术能力有限,如有错误的地方,请不吝指正,希望本文能够抛砖引玉。



已有(1)人评论

跳转到指定楼层
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

关闭

推荐上一条 /2 下一条