sqoop 是基于 hdfs 的一款 ETL 工具,主要作用是进行 hive(hdfs) 和关系型数据库之间的数据传输。 jdk 、 hadoop 和 hive 在之前的文章 Hadoop安装指南 、 Hive安装指南 详细介绍过安装方法。sqoop 分 sqoop1 和 sqoop2 两个版本并行发展,因为 sqoop2 目前还有许多问题,所以选择 sqoop1 来安装,现在介绍安装 sqoop1 ,同样采用本地模式安装以用来学习。
安装环境
ubuntu-18.04
jdk-1.8.0_261
hadoop-2.10.0
hive-2.3.7
安装 tez
在 Tez 官网 下载所需要版本的 tez 安装包,解压到 /usr/local
文件夹中。需要样在 ~/.bashrc
中设置环境变量。建议下载二进制包,自己编译的话会有很多问题。
1
2
3
# set tez home.
export TEZ_HOME=/usr/local/tez
export PATH=$TEZ_HOME/bin:$PATH
将 tez 安装包上传到 HDFS
1
2
hadoop fs -mkdir /user/tez
hadoop fs -put $TEZ_HOME/share/tez.tar.gz /user/tez
修改 tez 配置文件
tez-site.xml
在 Hadoop
1
2
3
4
5
6
7
8
9
10
<configuration>
<property>
<name>tez.lib.uris</name>
<value>hdfs://localhost:9000/user/tez/tez.tar.gz</value> <!-- 这里指向hdfs上的tez.tar.gz包 -->
</property>
<property>
<name>tez.container.max.java.heap.fraction</name> <!-- 这里是因为我机器内存不足,而添加的参数 -->
<value>0.2</value>
</property>
</configuration>
添加 mysql 驱动
下载 mysql 对应的驱动包,放到 $SQOOP_HOME/lib
目录中。
驱动下载:
https://dev.mysql.com/downloads/connector/j/
常用操作
查看数据库
1
2
3
4
sqoop list-databases \
--connect 'jdbc:mysql://localhost:3306/hive2?serverTimezone=Asia/Shanghai' \
--username 'hive' \
--password 'hive'
执行 SQL
1
2
3
4
5
sqoop-eval \
--connect 'jdbc:mysql://localhost:3306/hive2?serverTimezone=Asia/Shanghai' \
--username 'hive' \
--password 'hive' \
--query "SHOW TABLES"
导入数据
首先要在 hive 中创建一个和 mysql 中表结构相同的表。
1
2
3
4
5
6
7
8
9
10
11
DROP TABLE IF EXISTS dbs;
CREATE TABLE `dbs`(
`db_id` bigint,
`desc` string,
`db_location_uri` string,
`name` string,
`owner_name` string,
`owner_type` string,
`ctlg_name` string
)
;
1
2
3
4
5
6
7
8
9
10
11
12
13
sqoop import \
--delete-target-dir \
--connect 'jdbc:mysql://localhost:3306/hive?serverTimezone=Asia/Shanghai' \
--username 'hive' \
--password 'hive' \
--query "SELECT db_id, \`desc\`, db_location_uri, name, owner_name, owner_type, ctlg_name FROM dbs WHERE \$CONDITIONS" \
--split-by db_id \
--boundary-query "SELECT MIN(db_id), MAX(db_id) FROM dbs" \
--fields-terminated-by '\001' \
--lines-terminated-by '\n' \
--null-string '\\N' \
--null-non-string '\\N' \
--target-dir 'hdfs://localhost:9000/user/hive/warehouse/dbs/'
导出数据
1
2
3
4
5
6
7
8
9
10
11
sqoop export \
--connect 'jdbc:mysql://localhost:3306/hive?serverTimezone=Asia/Shanghai' \
--username 'hive' \
--password 'hive' \
--table dbs1 \
--columns 'db_id, desc, db_location_uri, name, owner_name, owner_type, ctlg_name' \
--export-dir 'hdfs://localhost:9000/user/hive/warehouse/dbs' \
--input-fields-terminated-by '\001' \
--input-lines-terminated-by '\n' \
--input-null-string "\\\\N" \
--input-null-non-string "\\\\N"