下载地址
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(待)