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(待)

相关推荐
牛奶咖啡1321 小时前
大数据Hadoop运维应用实践——HIVE与Hadoop实现整合_Hive的配置安装与使用
大数据·hive·hive的配置与安装·metastore服务的配置·hiveserver2服务配置·hive的常用sql操作·beeline的使用
Zhu7582 天前
在k8s集群环境部署高可用的Apache Hadoop3.1.1定制版集群
hadoop·kubernetes
还有你Y3 天前
软件工程架构
hadoop·架构·软件工程
向夏威夷 梦断明暄3 天前
基于Tez引擎的 Hive SQL 性能优化
hive·sql·性能优化
曾阿伦7 天前
Windows 下运行 Hadoop 并部署到 AWS EMR 指南
hadoop·windows·aws
极光代码工作室8 天前
基于Spark的日志监控与分析平台
大数据·hadoop·python·spark·数据可视化
liuxiaowei39 天前
Winform+WPF双框架实战:喷涂工艺SCADA上位机从0到1搭建(附采集监控源码+车间踩坑实录)
大数据·hadoop·wpf
humbinal10 天前
同时支持 gui & cli 的 parquet 文件查看工具,高性能小清新!
hive·python·rust·spark·开源·github·parquet
hkNaruto12 天前
【大数据】《传统Hadoop大数据技术入门:补充与进阶——从数据格式到智能决策的问答实录》
大数据·hadoop·分布式
吾AI科技12 天前
基于Tez引擎的 Hive SQL 性能优化
大数据·hive·性能优化·tez