hive使用sqoop与oracle传输数据

下载地址

http://archive.apache.org/dist/sqoop

两个版本sqoop1(1.4.x)和sqoop2(1.99.x),两种不同的架构。

本文使用sqoop1。

sqoop是apache旗下一款"hadoop与关系数据库之间传送数据"的工具。

导入数据:从MySQL、Oracle导入数据到Hadoop的HDFS、HIVE、HBASE等存储系统。

导出数据:从Hadoop的HDFS、HIVE中导出数据到关系数据库mysql等。

sqoop的工作机制是将导入导出命令翻译成mapreduce程序来实现。翻译出的mapreduce中主要是对inputformat、outputformat进行定制。安装时,hive位于哪台服务器,sqoop就安装部署在哪台服务器。

本文测试连接时使用的是mysql,导入导出时使用的oracle数据库,两者的区别就是添加各自相应的jdbc驱动,其余保持一致。

下载上传

以root用户登录服务器,将文件上传至/opt

安装配置

解压

以root用户登录服务器,解压

tar zxvf sqoop-1.4.7.bin__hadoop-2.6.0.tar.gz

重命名

配置文件

修改配置文件,进入sqoop-1.4.7/conf目录

cp sqoop-env-template.sh sqoop-env.sh

修改sqoop-env.sh文件,vi sqoop-env.sh,添加以下内容

export HADOOP_COMMON_HOME=/opt/hadoop

export HADOOP_MAPRED_HOME=/opt/hadoop

export HIVE_HOME=/opt/hive

添加驱动

将mysql的驱动包和hive的执行包,放入sqoop的lib中

cp /opt/hive/lib/mysql-connector-java-5.1.49-bin.jar /opt/sqoop-1.4.7/lib/

cp /opt/hive/lib/hive-exec-3.1.3.jar /opt/sqoop-1.4.7/lib/

cp /opt/hive/hcatalog/share/hcatalog/hive-hcatalog-core-3.1.3.jar /opt/sqoop-1.4.7/lib/

环境变量

以root用户登录,配置环境变量

vi /root/.profile,添加以下内容

export SQOOP_HOME=/opt/sqoop-1.4.7

export PATH=:SQOOP_HOME/bin:PATH

HCatalog

export HCAT_HOME=/opt/hive/hcatalog

export hive_dependency=HIVE_HOME/conf:HIVE_HOME/lib/*:$HIVE_HOME/hcatalog/share/hcatalog/hive-hcatalog-core-3.1.3.jar

保存推出后,执行 source .profile,以使之生效。

测试连接

测试本地数据库,连接mysql、oracle等关系数据库时hadoop、hive可以不启动。

sqoop list-databases \

--connect jdbc:mysql://localhost:3306/ \

--username root --password root

导入导出

去oracle服务器下载其驱动,oracle11g是ojdbc6.jar

路径:$ORACLE_HOME/jdbc/lib/

导入导出操作时,hadoop、mysql必须启动,hive可以不启动,如果要查询验证导入结果,那么必须将hive也要启动。

操作oracle数据库,将oracle驱动放入sqoop的lib中

以root用户登录服务器,上传oracle数据库jdbc驱动ojdbc.jar至/opt

cp /opt/ojdbc6.jar /opt/sqoop-1.4.7/lib/

sqoop list-databases \

--connect jdbc:oracle:thin:@192.168.12.55:1521:orcl \

--username test2 --password test2

sqoop list-databases \

--connect jdbc:oracle:thin:@//192.168.12.55:1521/orcl \

--username test2 --password test2

导入

用sqoop从oracle导入到hive,要把oracle中的表导入到hive,要在hive创建一个对应oracle表的表(如果没有创建,导入时会自动创建),表结构与oracle中的相同。

oracle中原始数据

hive 建表(hive启动状态)

create table testhivedb.httest(

c1 string

);

sqoop import \

--connect jdbc:oracle:thin:@//192.168.12.55:1521/orcl \

--username test2 \

--password test2 \

--table TEST2.TTEST \

--hive-import \

--hive-database testhivedb \

--hive-table httest \

--hive-overwrite \

-m 1

说明:--table 待导入的表

--hive-database 导入到 Hive 的 sqoop_test 数据库,数据库需要预先创建。不指定则默认为 default 库

--hive-import 导入到 Hive

--hive-overwrite 如果 Hive 表中有数据则覆盖,这会清除表中原有的数据,然后再写入

-m 并行度 # 指定并行执行的 map tasks 数量

注意1:oracle表书写样式为大写 OWNER.TABLENAME,否则可能报错找不到目标表中的字段。

注意2:造成下图所示问题的原因是:默认sqoop在执行导入table过程中会生成对应的table的java文件和编译产生的.class和.jar文件,而class 和 jar文件则保存在/tmp/sqoop-当前用户/compile/ 下相应的文件夹中。本例中用户是root,保存位置见下图2

解决办法:将文件复制到 /opt/sqoop/bin

cp /tmp/sqoop-root/compile/a8c0127e84d64eb49be7b6ad62e6012a/TEST2.TTEST.jar /opt/hive/lib

除了上述这个复制之外,还有一种方法执行导入之前先执行生成代码,并将生成的代码指定保存位置/opt/hive/lib。具体如下

sqoop codegen \

--connect jdbc:oracle:thin:@//192.168.12.55:1521/orcl \

--username test2 \

--password test2 \

--table TEST2.TTEST \

--bindir /opt/hive/lib

注意3:提示已存在

hdfs dfs -ls hdfs://virtualbox-u22034server:9000/user/root/TEST2.TTEST

找到位置,删除

hdfs dfs -rm -r hdfs://virtualbox-u22034server:9000/user/root/TEST2.TTEST

成功如下,虽然有个报错如下,验证如下

导出

用sqoop从hdfs导出到oracle(待)

相关推荐
时差9537 小时前
【面试题】Hive 查询:如何查找用户连续三天登录的记录
大数据·数据库·hive·sql·面试·database
苍老流年7 小时前
Hive中各种Join的实现
数据仓库·hive·hadoop
静听山水8 小时前
Hive:UDTF 函数
hive
EDG Zmjjkk9 小时前
Hive 查询(详细实操版)
数据仓库·hive·hadoop
lzhlizihang10 小时前
【Hive sql 面试题】求出各类型专利top 10申请人,以及对应的专利申请数(难)
大数据·hive·sql·面试题
Hsu_kk10 小时前
Hive 查询各类型专利 Top 10 申请人及对应的专利申请数
数据仓库·hive·hadoop
静听山水10 小时前
Hive 的数据存储单元结构
hive
大数据编程之光10 小时前
Hive 查询各类型专利 top10 申请人及专利申请数
大数据·数据仓库·hive·hadoop
杰克逊的日记10 小时前
Hive详解
数据仓库·hive·hadoop
上辈子杀猪这辈子学IT10 小时前
【Zookeeper集群搭建】安装zookeeper、zookeeper集群配置、zookeeper启动与关闭、zookeeper的shell命令操作
linux·hadoop·zookeeper·centos·debian