暂无图片
暂无图片
暂无图片
暂无图片
暂无图片

Hadoop与Oracle数据传输方法

炬南山 2020-03-04
1680

背 景


数据仓库系统很多采用了混搭架构,如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、 架  构

架构主要由三个部分组成:Sqoop、HDFS/HBase/Hive、Database。以导入到RDBMS为例,用户向 Sqoop 发起一个命令之后,这个命令会转换为一个基于 Map Task 的 MapReduce 作业。Map Task 会访问数据库的元数据信息,通过并行的 Map Task 将数据库的数据读取出来,然后导入 RDBMS 中。sqoop主要通过JDBC和关系数据库进行交互。理论上支持JDBC的database都可以使用sqoop和hdfs(Hive)进行数据交互。

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

mv sqoop-1.4.6.bin__hadoop-2.0.4-alpha.tar.gz sqoop-1.4.6

2.3 配置sqoop-env.sh

#Set path to where bin/hadoop is available

export HADOOP_COMMON_HOME=/home/hadoop/SW/hadoop

#Set path to where hadoop-*-core.jar is available

export HADOOP_MAPRED_HOME=/home/hadoop/SW/hadoop

#set the path to where bin/hbase is available export

export HBASE_HOME=/home/hadoop/SW/hbase

#Set the path to where bin/hive is available

export HIVE_HOME=/home/hadoop/SW/hive-2.0.0

#Set the path for where zookeper config dir is

export ZOOCFGDIR=/home/hadoop/SW/zookeeper

2.4 添加所须包至sqoop/lib下

我这里用到了Oracle,所以添加包:ojdbc6.jar

如果是Mysql,可添加包:mysql-connector-java-5.1.38.jar

2.5 配置环境变量

vim etc/profile
添加以下内容:
#Sqoop 
export SQOOP_HOME=/home/hadoop/SW/Sqoop-1.4.6
export PATH=$PATH:$SQOOP_HOME/bin
保存执行生效:

source etc/profile

3、数据传输

3.1 Import(RDBMS TO Hadoop)

Import工具从关系型数据库将表导入到HDFS(HIVE),表的每一行在HDFS中代表独立的纪录。纪录的格式可以是text files或二进制文件(Avro或sequenceFiles)。

下面的测试案例继续使用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

--table   Oracle内的源表

b、执行截图

3.2 Export(Hadoop TO RDBMS)

Export工具从HDFS导数到关系型数据库(本例使用Oracle),目标表需要先在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:  资源队列名

--table:要导入到的关系数据库表(需要大写

c、执行截图

关于sqoop更多的用法,请参考Apache下的官网链接

http://sqoop.apache.org/docs/1.4.6/SqoopUserGuide.html

二、B D C

Oracle Big Data Connectors 是一个用于集成Hadoop处理与数据仓库操作的软件套件。
Big Data Connectors 的设计利用了 Apache Hadoop的最新特性,可将Hadoop集群和数据库基础架构相连接,以利用海量结构化和非结构化数据提供关键业务洞察。

项目中我们主要使用了BDC的Oracle SQL Connector for HDFS(简称osch)功能,该功能将数据拉入数据库中,数据的移动是通过使用SQL在Oracle数据库中选择数据来启动的。用户可以将数据加载到数据库,或使用Oracle SQL 通过外部表查询Hadoop中的数据。

1、架  构

由Oracle数据库以及部署在Oracle系统上面的Hadoop client,osch组件和Hadoop集群组成。原始数据以Hdfs(HIVE)存储于Hadoop集群,Oracle通过osch以外部表的形式在数据库系统内直接读取Hdfs上的数据,或并行直接路径装载数据到Oracle数据库。

2、安装部署

 2.1 安装环境

Oracle SQL Connector for HDFS环境要求如下

Hadoop集群

•Cloudera's的版本要求在5(CDH5),Hortonworks的版本在2.4.0和2.5.0

•JDK(分布式的在Cloudera's或Hortonworks上)

•Hive 1.1.0, or 1.2.1 (如果需要从HIVE导出)
Oracle数据库和Hadoop客户端

•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中域名信息。

•Hadoop客户端和Hadoop集群相同版本的JDK

2.2 在Oracle安装配置hadoop客户端

只需要安装Hadoop jar文件和配置文件,不需要勾选所有选项。
a、下载hadoop客户端
按照2.1安装环境,下载对应版本的客户端(CDH5, or Hortonworks Data Platform 2.4.0 and 2.5.0)

b、解压文件

解压文件,并复制到Oracle的某一固定路径如/usr/osch_hadoop

c、环境变量设置

设置HADOOP_HOME为/usr/osch_hadoop,并在PATH变量中增加HADOOP_HOME/bin。

设置JAVA_HOME为JDK的安装路径 如/usr/bin/java

d、安全设置

如果Hadoop集群有Kerberos安全认证,则需要在集群KDC中心注册oracle主机用户信息,同时oracle主机下的/etc/krb5.conf需要增加关于KDC中域名信息

e、验证HDFS文件是否可访问

生效以上环境变量信息,并敲入如下命令:
$ hdfs dfs -ls user
如果现实的内容同Hadoop集群一样,则表示成功,否则需要重新修改上面的步骤。

f、RAC配置

如果Oracle是RAC,则需要在每个节点上进行如上操作,且每个节点需配置一致的参数和路径信息。

2.3 安装Oracle SQL Connector for HDFS

a、下载Oracle SQL Connector for HDFS

Oracle Big Data Connectors Software下载地址:

http://www.oracle.com/technetwork/bdc/big-data-connectors/downloads/index.html

可选择下载我们只需要的功能Oracle SQL Connector for HDFS。

下载的压缩文件结构如下

b、解压文件

unzip oraosch-<version>.zip

unzip orahdfs-<version>.zip 到指定路径

c、变量设置

编辑orahdfs-<version>/bin/hdfs_stream文件,设置
PATH变量,将hadoop的bin目录添加进去,如/usr/lib/hadoop/bin

JAVA_HOME变量,设置JAVA安装目录,如/usr/bin/java

d、安全设置

同2.2中的安全设置,如果已经设置,则不需要重新设置
e、验证hdfs_stream生效
$ ./hdfs_stream
Usage: hdfs_stream locationFile
如果看不到usage等信息,有可能是权限不够,可进行授权:
$ chmod 755 OSCH_HOME/bin/hdfs_stream

f、RAC设置

如果Oracle是RAC,则需要在每个节点上进行如上操作,且每个节点需配置一致的参数和路径信息。

g、创建hdfs_stream存放的数据库目录

进入数据库,创建目录,如果是RAC,需要确保所有节点均可访问
SQL> CREATE OR REPLACE DIRECTORY osch_bin_path AS '/etc/orahdfs-<version>/bin';

h、 Oracle数据库用户权限设置

给要使用oracle sql connector for HDFS的数据库用户以下权限

3、数据传输

3.1 Export(Hadoop TO RDBMS)

BDC的OSCH只提供从Hadoop到Oracle的导入功能,不提供Oracle到Hadoop的导入功能。

a、配置环境变量

b、创建外部表

主要参数说明:

c、创建内部表

d、把外部表数据并行装载到内部表(并行度大小看CPU负荷及数据量)

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系统数据模型的构建和管控。

文章转载自炬南山,如果涉嫌侵权,请发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。

评论