数据同步_Sqoop

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 参考列表

配置Sqoop1.4.7支持Hadoop3_sqoop hadoop3-优快云博客文章浏览阅读2.4k次,点赞2次,收藏19次。解决Hadoop3无法使用Sqoop的问题_sqoop hadoop3 https://blog.youkuaiyun.com/shaock2018/article/details/128235872

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表中的现有数据

4.5 代码生成参数

4.6 其它参数

5 优化

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值