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

相关推荐

  1. 使用SqoopHive数据导出到TiDB

    2024-04-21 23:12:01       33 阅读
  2. sqoop的安装使用

    2024-04-21 23:12:01       23 阅读

最近更新

  1. TCP协议是安全的吗?

    2024-04-21 23:12:01       19 阅读
  2. 阿里云服务器执行yum,一直下载docker-ce-stable失败

    2024-04-21 23:12:01       19 阅读
  3. 【Python教程】压缩PDF文件大小

    2024-04-21 23:12:01       19 阅读
  4. 通过文章id递归查询所有评论(xml)

    2024-04-21 23:12:01       20 阅读

热门阅读

  1. nginx 导致websocket无法连接的解决办法

    2024-04-21 23:12:01       14 阅读
  2. Qt 使用qm文件

    2024-04-21 23:12:01       12 阅读
  3. Linux之 USB驱动框架-USB鼠标驱动源码分析(5)

    2024-04-21 23:12:01       17 阅读
  4. mysql一些语法记录

    2024-04-21 23:12:01       14 阅读
  5. JUC之线程、并发、上下文基本概念

    2024-04-21 23:12:01       18 阅读