背 景
数据仓库系统很多采用了混搭架构,如Hadoop+MPP或Hadoop+RDBMS(关系型数据库)。Hadoop能提供海量数据离线计算,MPP或RDBMS能提供便捷的交互式报表查询。数据ETL的过程中会在Hadoop和MPP或RDBMS进行传输。结合项目实际使用,我们主要介绍下开源工具sqoop和oracle的BDC在hadoop与oracle之间的数据传输方法。
工具介绍
一、Sqoop
Sqoop是一款开源的工具,主要用于在Hadoop(Hive)与传统的数据库(mysql、postgresql...)间进行数据的传递,可以将一个关系型数据库(MySQL ,Oracle ,Postgres等)中的数据导进到Hadoop的HDFS中,也可以将HDFS的数据导进到关系型数据库中。
1、 架 构

2、安装部署
2.1 安装环境
hadoop-2.7.2, hive-2.1.0, sqoop-1.4.6
2.2 下载及安装
地址:http://mirrors.hust.edu.cn/apache/sqoop/1.4.6/sqoop-1.4.6.bin__hadoop-2.0.4-alpha.tar.gz
解压:
tar -zxvf sqoop-1.4.6.bin__hadoop-2.0.4-alpha.tar.gz
2.3 配置sqoop-env.sh
#Set path to where bin/hadoop is available
#Set path to where hadoop-*-core.jar is available
#set the path to where bin/hbase is available export
#Set the path to where bin/hive is available
#Set the path for where zookeper config dir is
2.4 添加所须包至sqoop/lib下
我这里用到了Oracle,所以添加包:ojdbc6.jar
2.5 配置环境变量
source etc/profile
3、数据传输
3.1 Import(RDBMS TO Hadoop)
下面的测试案例继续使用Oracle的表名为temp_xinju_zjy_ecell,纪录条数为16753条,导入到HIVE(HDFS)。具体语句为:
a、命令行如下:

参数介绍:
-D mapred.job.queue.name=xinju 选择资源队列名
--hive-import: 导入到HIVE里面,会自动在HIVE中预建表,不加该参数,则默认只到HDFS层面
--connect <jdbc-uri>: 指定JDBC列连串
--username <username> :RDBMS的用户
--password <password>: RDBMS的用户对应的密码 (生产系统建议以文件形式传递账号密码保证安全)
-m 进程并发数,这里因为数量较少,选择了1
b、执行截图

3.2 Export(Hadoop TO RDBMS)
Export有三种模式:INSERT MODE(默认),UPDATE MODE, CALL MODE,其中数据仓库中主要用INSERT MODE方式,UPDATE MODE主要为更新RDBMS中某些纪录数据,而CALL MODE方式,Sqoop则会调用存储过程来更新行纪录。
下面的测试案例采用INSERT MODE方式。HIVE中源表名为temp_xinju_zjy_ecell,纪录条数为16753条,导出到Oracle的表名为temp_xinju_zjy_ecell(与HIVE同名)。具体导出步骤为:
a、在Oracle创建待装载数据的表

b、在sqoop所在的客户端上执行以下命令

参数介绍:
-D mapred.job.queue.name=xinju 选择资源队列名
--connect <jdbc-uri>: 指定JDBC列连串
--username <username> :RDBMS的用户
--password <password>: RDBMS的用户对应的密码 (生产系统建议以文件形式传递账号密码保证安全)
--hcatalog-table <table-name>: HDFS关联的HIVE表名
--columns <col,col,col…>: 指定导出的列名
mapred.job.queue.name: 资源队列名
c、执行截图

关于sqoop更多的用法,请参考Apache下的官网链接
二、B D C
项目中我们主要使用了BDC的Oracle SQL Connector for HDFS(简称osch)功能,该功能将数据拉入数据库中,数据的移动是通过使用SQL在Oracle数据库中选择数据来启动的。用户可以将数据加载到数据库,或使用Oracle SQL 通过外部表查询Hadoop中的数据。
1、架 构

2、安装部署
2.1 安装环境
Oracle SQL Connector for HDFS环境要求如下
Hadoop集群
•Cloudera's的版本要求在5(CDH5),Hortonworks的版本在2.4.0和2.5.0
•JDK(分布式的在Cloudera's或Hortonworks上)
•Oracle Database 12c (12.2.0.1 and 12.1.0.2) , Oracle Database 11g release 2 (11.2.0.4 or later)
•Hadoop客户端版本与Hadoop集群版本一致(CDH5, or Hortonworks Data Platform 2.4.0 and 2.5.0)。如果Hadoop集群有Kerberos安全认证,则需要在集群KDC中心注册oracle主机用户信息,同时oracle主机下的/etc/krb5.conf需要增加关于KDC中域名信息。
2.2 在Oracle安装配置hadoop客户端
b、解压文件
解压文件,并复制到Oracle的某一固定路径如/usr/osch_hadoop
c、环境变量设置
设置JAVA_HOME为JDK的安装路径 如/usr/bin/java
d、安全设置
如果Hadoop集群有Kerberos安全认证,则需要在集群KDC中心注册oracle主机用户信息,同时oracle主机下的/etc/krb5.conf需要增加关于KDC中域名信息
e、验证HDFS文件是否可访问
f、RAC配置
2.3 安装Oracle SQL Connector for HDFS
a、下载Oracle SQL Connector for HDFS
Oracle Big Data Connectors Software下载地址:
可选择下载我们只需要的功能Oracle SQL Connector for HDFS。
下载的压缩文件结构如下

b、解压文件
unzip oraosch-<version>.zip
c、变量设置
JAVA_HOME变量,设置JAVA安装目录,如/usr/bin/java
d、安全设置
f、RAC设置
如果Oracle是RAC,则需要在每个节点上进行如上操作,且每个节点需配置一致的参数和路径信息。
g、创建hdfs_stream存放的数据库目录
h、 Oracle数据库用户权限设置

3、数据传输
3.1 Export(Hadoop TO RDBMS)
a、配置环境变量

b、创建外部表

主要参数说明:


c、创建内部表



e、删除外部表


结束语
在实际生产系统中,sqoop从Hadoop加载大数据量120G~150G到Oracle时,需要50~80分钟左右,且造成了Exadata大量的network等待事件(长时间高于1000个),导致性能变差。BDC, 64个并行度的理论加载速度应该可以达到1-2G/S,但生产系统时传输130G文件(64个写并行,128个查并行),耗费了7分钟,比理论小很多,但比sqoop快很多,且等待事件恢复正常值(300~500)。另外BDC是oracle的收费软件,sqoop是开源产品,完全免费。
本期作者

本期作者|苏云金 从事电信运营商数据开发工作多年,擅长处理异构数据ETL,分析优化;精通OLAP和OLTP系统数据模型的构建和管控。




