0 参考列表
优快云:Sqoop基本原理及常用方法https://blog.youkuaiyun.com/weixin_48482704/article/details/109821541
1 概念
一款在Hadoop和关系数据库之间传输数据的工具,Sqoop接收到客户端的shell命令或者Java api命令后,通过Sqoop中的任务翻译器将命令转换为对应的MapReduce任务,而后在关系型数据库和Hadoop之间完成数据同步.
2 安装(1.4.7)
2.1 参考列表
2.2 安装
(1) 下载:Index of /dist/sqoop/1.4.7
(2) 上传解压并重命名:
①tar -zxvf sqoop-1.4.7.tar.gz
②mv sqoop-1.4.7 /data/sqoop
(3) 补充依赖包
①将 sqoop-1.4.7.bin__hadoop-2.6.0.tar.gz/lib 下的 avro-1.8.1.jar 复制到 /data/sqoop/lib/ 下;
②将 sqoop-1.4.7.bin__hadoop-2.6.0.tar.gz 的 sqoop-1.4.7.jar 复制到 /data/sqoop/ 下;
③将单独下载的 mysql-connector Jar包复制到 /data/sqoop/lib/下
(4) 修改 sqoop-env.sh文件(conf 下)
cp sqoop-env-template.sh sqoop-env.sh
在 sqoop-env.sh 中添加以下内容
export HADOOP_COMMON_HOME=/data/hadoop
export HADOOP_MAPRED_HOME=/data/hadoop
export HIVE_HOME=/data/hive
export HIVE_CONF_DIR=/data/hive/conf
export HADOOP_CLASSPATH=$HADOOP_CLASSPATH:$HIVE_HOME/lib/*
(5) 修改 bin/sqoop
# exec ${HADOOP_COMMON_HOME}/bin/hadoop org.apache.sqoop.Sqoop "$@"
exec ${HADOOP_COMMON_HOME}/bin/hadoop jar $SQOOP_HOME/sqoop-1.4.7.jar org.apache.sqoop.Sqoop "$@"
(6) 添加环境变量
修改 /etc/profile
# Sqoop 1.4.7
export SQOOP_HOME=/data/sqoop
export PATH=$PATH:$SQOOP_HOME/bin
刷新环境变量:source /etc/profile
3 使用
3.1 导入
3.1.1 导入 HDFS 文件
(1) 表导入
sqoop import \
--connect jdbc:mysql://<DB_HOST>:<DB_PORT>/<DB_NAME> \
--username <DB_USER> \
--password <DB_PASSWORD> \
# 通过表
--table <TABLE_NAME> \
# 指定列
--columns <COL_NAME...> \
# 筛选
--where "..." \
--target-dir <HDFS_TARGET_DIR>
(2) 查询导入
sqoop import \
--connect jdbc:mysql://<DB_HOST>:<DB_PORT>/<DB_NAME> \
--username <DB_USER> \
--password <DB_PASSWORD> \
--query "select ..." \
--target-dir <HDFS_TARGET_DIR>
(3) 增量导入_基于递增列
sqoop import \
--connect jdbc:mysql://<DB_HOST>:<DB_PORT>/<DB_NAME> \
--username <DB_USER> \
--password <DB_PASSWORD> \
--query "select ..." \
--target-dir <HDFS_TARGET_DIR> \
--incremental append \
# 用于指定检查增量的列
--check-column <INCREMENTAL_COLUMN> \
# 用于指定上次导入的最后一个值,Sqoop 会从这个值开始导入新的数据
--last-value <LAST_INCREMENTAL_VALUE> \
# 非必须,并行同步
--split-by sid \
-m 2
# 例如这段的含义是导入 id > 2 的数据
--check-column id \
--last-value 2 \
(4) 增量导入_基于最后修改时间
sqoop import \
--connect jdbc:mysql://<DB_HOST>:<DB_PORT>/<DB_NAME> \
--username <DB_USER> \
--password <DB_PASSWORD> \
--query "select ..." \
--target-dir <HDFS_TARGET_DIR> \
--incremental lastmodified \
--check-column <INCREMENTAL_COLUMN> \
--last-value <LAST_VALUE_FILE> \
--split-by <SPLIT_BY_COLUMN> \
# 例如这段是导入 last_modified > '2023-01-02 11:00:00' 的数据
--check-column last_modified \
--last-value '2023-01-02 11:00:00'
3.1.2 导入到 Hive 表
(1) 表导入
sqoop import \
--connect jdbc:mysql://<DB_HOST>:<DB_PORT>/<DB_NAME> \
--username <DB_USER> \
--password <DB_PASSWORD> \
# 通过表
--table <TABLE_NAME> \
--hive-import \
--hive-database <HIVE_DB_NAME> \
--hive-table <HIVE_TABLE_NAME> \
--create-hive-table
(2) 查询导入
sqoop import \
--connect jdbc:mysql://<DB_HOST>:<DB_PORT>/<DB_NAME> \
--username <DB_USER> \
--password <DB_PASSWORD> \
--query "select ..." \
--hive-import \
--hive-database <HIVE_DATABASE> \
--hive-table <TB_NAME> \
--create-hive-table
(4) 静态分区
sqoop import \
--connect jdbc:mysql://<DB_HOST>:<DB_PORT>/<DB_NAME> \
--username <DB_USER> \
--password <DB_PASSWORD> \
--table <TABLE_NAME> \
--hive-import \
--hive-database <HIVE_DATABASE> \
--hive-table <HIVE_TABLE> \
# Hive 表的分区字段名称
--hive-partition-key <PARTITION_KEY> \
# Hive 表的分区字段值
--hive-partition-value <PARTITION_VALUE>
(4) 增量导入_基于递增列
sqoop import \
--connect jdbc:mysql://<DB_HOST>:<DB_PORT>/<DB_NAME> \
--username <DB_USER> \
--password <DB_PASSWORD> \
--query "select ..." \
--hive-import \
--hive-database <HIVE_DATABASE> \
--hive-table <HIVE_TABLE> \
--incremental append \
--check-column <INCREMENTAL_COLUMN> \
--last-value <LAST_VALUE>
--split-by <SPLIT_BY_COLUMN> \
(5) 增量导入_基于最后修改时间
sqoop import \
--connect jdbc:mysql://<DB_HOST>:<DB_PORT>/<DB_NAME> \
--username <DB_USER> \
--password <DB_PASSWORD> \
--query "select ..." \
--hive-import \
--hive-database <HIVE_DATABASE> \
--hive-table <HIVE_TABLE> \
--incremental lastmodified \
--check-column <INCREMENTAL_COLUMN> \
--last-value <LAST_VALUE> \
--split-by <SPLIT_BY_COLUMN>
(6) 增量导入_基于主键判断
sqoop import \
--connect jdbc:mysql://<DB_HOST>:<DB_PORT>/<DB_NAME> \
--username <DB_USER> \
--password <DB_PASSWORD> \
--query "select ..." \
--hive-import \
--hive-database <HIVE_DATABASE> \
--hive-table <HIVE_TABLE> \
--update-key <UPDATE_KEY_COLUMN> \
# updateonly(仅更新已存在的记录),allowinsert(更新已存在的记录,同时插入不存在的记录)
--update-mode <UPDATE_MODE> \
--split-by <SPLIT_BY_COLUMN>
3.2 导出
(1) 导出 HDFS 文件
sqoop export \
--connect jdbc:mysql://<DB_HOST>:<DB_PORT>/<DB_NAME> \
--username <DB_USER> \
--password <DB_PASSWORD> \
--table <TABLE_NAME> \
--export-dir <HDFS_SOURCE_DIR> \
--where "<CONDITION>"
(2) 导出 Hive表
sqoop export \
--connect jdbc:mysql://<DB_HOST>:<DB_PORT>/<DB_NAME> \
--username <DB_USER> \
--password <DB_PASSWORD> \
--table <DB_TABLE> \
--hcatalog-table <HIVE_TABLE> \
(3) 查询导出
-- 1 将数据导出到临时目录
insert overwrite directory <temp_directory>
row format delimited
fields terminated by ','
select ...
;
# 2 导出
sqoop export \
--connect jdbc:mysql://<db_host>:<db_port>/<db_name> \
--username <db_user> \
--password <db_password> \
--table <db_table> \
--export-dir <hdfs_temp_directory> \
4 参数
4.1 导入参数
分类 | 参数 | 说明 |
---|---|---|
基本参数 | connect | 连接关系型数据库的URL |
username | 连接数据库的用户名 | |
password | 连接数据库的密码 | |
table | 指定关系数据库的表名 | |
target-dir | 指定数据存储的 HDFS 具体目录 | |
warehouse-dir | 指定数据存储的 HDFS 的父目录,程序会创建具体目录 | |
query | 自定义 SQL 查询 | |
增量导入参数 | incremental | 指定增量导入模式,append 或 lastmodified |
check-column | 用于检查增量的列名 | |
last-value | 次导入的最后一个值 | |
update-key | 指定用于更新的列 | |
update-mode | 指定更新模式,updateonly(仅更新已存在的记录),allowinsert(更新已存在的记录,同时插入不存在的记录) | |
可选参数 | columns | 定要导入的列,逗号分隔 |
where | 过滤条件 | |
split-by | 指定分片列,用于并行任务分片 | |
--direct | 启用数据库的直接导出模式,代替JDBC.MySQL、PostgreSQL支持此参数 |
4.2 导出参数
分类 | 参数 | 说明 |
---|---|---|
基本参数 | connect | 连接关系型数据库的URL |
username | 连接数据库的用户名 | |
password | 连接数据库的密码 | |
table | 指定关系数据库的表名 | |
export-dir | 指定要导出的 HDFS 目录 |
4.3 性能优化参数
参数 | 说明 |
---|---|
m | 指定并行任务的数量.默认为4 |
fetch-size | 批量读取的数据量大小,推荐在 1000 到 10000 之间 |
batch | 启用批量模式,将多个 SQL 操作(如插入、更新)合并为一个批次提交 |
4.4 集成参数
分类 | 参数 | 说明 |
---|---|---|
必须参数 | hive-import | 导入 Hive |
hive-table | 目标Hive表 | |
分区分桶参数 | hive-partition-key | 指定分区表的分区键 |
hive-partition-value | 指定分区键对应的分区值 | |
可选参数 | hive-database | 目标Hive数据库 |
create-hive-table | 无参数值,在导入数据之前自动创建Hive表 | |
hive-overwrite | 无参数值,覆盖Hive表中的现有数据 |