Hadoop平台上用Sqoop在Hive和DB2数据库之间传输数据的实践和总结
来源:互联网 发布:中英文双语小说 软件 编辑:程序博客网 时间:2024/05/17 03:52
笔者总结下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"
0 0
- Hadoop平台上用Sqoop在Hive和DB2数据库之间传输数据的实践和总结
- Sqoop在Hadoop和关系型数据库之间的数据转移
- Sqoop和mysql之间传输数据
- 开始玩hadoop14 ---从sql 关系数据库和 hadoop 之间的数据交换---Sqoop
- 大数据基础(二)hadoop, mave, hbase, hive, sqoop在ubuntu 14.04.04下的安装和sqoop与hdfs,hive,mysql导入导出
- 急性子的开源大数据,第 1 部分: Hadoop 教程:Hello World 与 Java、Pig、Hive、Flume、Fuse、Oozie,以及 Sqoop 与 Informix、DB2 和
- 急性子的开源大数据,第 1 部分: Hadoop 教程:Hello World 与 Java、Pig、Hive、Flume、Fuse、Oozie,以及 Sqoop 与 Informix、DB2 和
- [bigdata-009]用Sqoop在关系数据库和HDFS之间转储数据[Step by Step]
- sqoop数据迁移(基于Hadoop和关系数据库服务器之间传送数据)
- sqoop:mysql和Hbase/Hive/Hdfs之间相互导入数据
- sqoop工具在hive和mysql之间互相导数据
- Apache Sqoop:连接 DB2 和 Hadoop 的桥梁
- 【数据平台】sqoop支持hive和mysql互导的基本语句格式
- Hadoop入门(三):Sqoop和Hive的使用
- hadoop和hive的实践应用(一)——hadoop分布式平台搭建
- DB2同种平台和异种平台之间的数据库的移植
- Hadoop平台下的Hive和HBase
- BigInsights -- 基于 Hadoop 的数据分析平台【基于db2数据库】
- 我的博客搬家啦
- 深入研究Java类加载机制
- [面经]阿里二面
- DNS问题--解析问题
- 简易报告
- Hadoop平台上用Sqoop在Hive和DB2数据库之间传输数据的实践和总结
- 数据结构(13)线性表之C++实现一元多项式相减
- HDU 1698 Just a Hook(线段树)
- 【JAVA】oracle批量插入数据操作
- Intelij IDEA 快捷键(整理)
- 设计模式(六)代理模式
- Android_app启动时白屏_解决
- 对于拷贝构造函数和赋值构造函数的理解
- MyEclipse配置svn插件