一、sqoop概述
sqoop是mysql/oracle/DB2等RDBMS体系与hdfs/hive/hbase等hadoop生态体系之间传输数据的一种工具;
sqoop的工作机制是将导入导出命令翻译成MapReduce程序实现
sqoop可以理解为: SQL-->hadoop and hadoop-->SQL
数据导入导出:
数据导入: RDBMS-->hadoop
数据导出: hadoop-->RDBMS
二、sqoop安装部署
1.解压sqoop的tar包
tar -zxvf sqoop-1.4.6.tar.gz -C 安装目录
2.修改sqoop-env.sh文件
#Set path to where bin/hadoop is available
export HADOOP_COMMON_HOME=/export/server/hadoop-3.3.0
#Set path to where hadoop-*-core.jar is available
export HADOOP_MAPRED_HOME=/export/server/hadoop-3.3.0
#Set the path to where bin/hive is available
export HIVE_HOME=/export/server/hive-3.1.2
3.上传jar
jarmysql-connector-java-5.1.32.jar到sqoop的lib目录下
hive-common-jar-* 到sqoop的lib目录下
4.配置sqoop环境变量
vim /etc/profile
export SQOOP_HOME=/export/server/sqoop-1.4.6
export PATH=$PATH:$SQOOP_HOME/bin
执行:wq , 退出/etc/profile
刷新环境变量配置 source /etc/profile
4.验证启动sqoop
查看mysql数据库
sqoop-list-databases --connect jdbc:mysql://node1:3306/ --username root --password 123456
二、数据导入
1、mysql -> hdfs
(1)全量导入
sqoop-import --connect jdbc:mysql://node1:3306/sqoop_data --username root --password hadoop --table user --delete-target-dir --target-dir /sqoop/qldr --fields-terminated-by '|' --split-by id -m 1
注释:--fields-terminated-by:指定分隔符
--num-mappers (或-m):配置map任务个数
--target-dir:hdfs目录
--delete-target-dir:如果指定的hdfs的已存在,可以删除文件夹
--split-by :如果mysql表没有主键,当设置多个map并行(m>1),需要用该参数指定一个字段来划分每个MapTask处理的数据; 有主键时,可以省略该参数
(2)全量导入(指定字段)
sqoop-import --connect jdbc:mysql://node1:3306/sqoop_data --username root --password hadoop --table user --delete-target-dir --target-dir /sqoop/qldr1 --fields-terminated-by '|' --columns id,name -m 1
注释:--columns:指定导入到hdfs的字段个数(也可以指定字段的顺序)
(3)全量导入(指定字段 - where)
sqoop-import --connect jdbc:mysql://node1:3306/sqoop_data --username root --password hadoop --table user --target-dir /sqoop/qldr2 --fields-terminated-by '|' -m 1 --where 'id<3'
注释:--where:与mysql的where一样
(4)全量导入(指定字段 - query)
sqoop-import --connect jdbc:mysql://node1:3306/sqoop_data --username root --password hadoop --target-dir /sqoop/qldr3 --fields-terminated-by '|' -m 1 --query 'select name,age from user where id<3 and $CONDITIONS' ;
注释:--query:在该参数后可以加一个完整的sql语句(--e具有同样功能), 使用该参数时,--table参数省略, `and $CONDITIONS` 该字段是固定格式
(5)增量导入(不含更新的数据)
sqoop-import --connect jdbc:mysql://node1:3306/sqoop_data --username root --password hadoop --table user --target-dir /sqoop/qldr5 --fields-terminated-by '|' -m 1 --check-column id --incremental append --last-value 5;
注释:--check-column :指定用哪一列来作为增量的依据
--incremental :增量采集方式(append , lastmodified)
--last-value 指定(check-column)上一次的最后一个值是什么
(6)增量导入(含更新的数据)
sqoop-import --connect jdbc:mysql://node1:3306/sqoopTest --username root --password hadoop -e "select * from user where substr(create_time,1,10) = '昨天的日期' or substr(update_time,1,10) = '昨天的日期' and \$CONDITIONS" --target-dir /sqoop/import/'昨天的日期' --fields-terminated-by '\t' -m 1
注释:自带的Lastmodified参数在工作中不适用
2、mysql->hive
(1)全量导入
sqoop-import --connect jdbc:mysql://node1:3306/sqoop_data --username root --password hadoop --table user --hcatalog-database sqoop_data --hcatalog-table info --fields-terminated-by '|' -m 1 ;
或者
sqoop-import --connect jdbc:mysql://node1:3306/sqoop_data --username root --password hadoop --table user --hive-import --hive-database sqoop_data --hive-table user_info --fields-terminated-by ',' -m 1 ;
注释:--hcatalog-database/--hive-database hive的数据库名
--hcatalog-table/--hive-table hive的表名
(2)增量导入(含更新的数据)
yesterday='2023-10-26'
sqoop-import --connect jdbc:mysql://node1:3306/sqoop_data --username root --password hadoop -e "select *,'${yesterday}' from user where substr(create_time,1,10) = '${yesterday}' or substr(update_time,1,10) = '${yesterday}' and \$CONDITIONS" --hive-import --hive-database sqoop_data --hive-table user_info --target-dir /user/hive/warehouse/sqoop_data.db/user_info/temp/${yesterday} --delete-target-dir --fields-terminated-by ',' -m 1
注意:--target-dir 需要指定中间文件的目录
(3)hive其他导入操作参见hdfs
三、数据导出
1、hdfs -> mysql
(1)全量导出
sqoop-export --connect jdbc:mysql://node1:3306/sqoop_data --username root --password hadoop --table user --export-dir /sqoop --input-fields-terminated-by '|' ;
注释:--export-dir : hdfs被导出文件的路径
(2)增量导出(只有更新数据)
sqoop-export --connect jdbc:mysql://node1:3306/sqoop_data--username root --password hadoop --table hive_info --export-dir /user/hive/warehouse/sqoop_data.db/info --update-key id --update-mode updateonly --input-fields-terminated-by '|' -m 1;
2、hive -> mysql
(1)全量导出
sqoop-export --connect jdbc:mysql://node1:3306/sqoop_data --username root --password 123456 --table hive_info --hcatalog-database sqoop_data --hcatalog-table info --input-fields-terminated-by '|' -m 1;
或者
sqoop-export --connect jdbc:mysql://node1:3306/sqoop_data --username root --password hadoop --table user --export-dir /user/hive/warehouse/sqoop_data.db/user_info/dt=2023-10-27 --input-fields-terminated-by ',' -m 1
(2)增量导出(含更新+新增数据)
sqoop-export --connect jdbc:mysql://node1:3306/sqoop_data --username root --password hadoop --table user --export-dir /user/hive/warehouse/sqoop_data.db/user_info --update-key id --update-mode allowinsert --input-fields-terminated-by '|' -m 1;
注释:--update-key:用于指定用作更新标识符的列名,以确定哪些记录需要进行更新
--update-mode:
- allowinsert(默认值):这种模式允许 Sqoop 同时插入新记录并更新现有记录。如果数据行不存在,则插入新记录;如果数据行已存在,则更新记录。
- updateonly:这种模式仅允许更新现有记录,不允许插入新记录。如果数据行不存在,则不执行任何操作。只有当数据行已存在时,才会执行更新操作。
(3)增量导出(只有更新数据)
sqoop-export --connect jdbc:mysql://node1:3306/sqoop_data --username root --password hadoop --table hive_info --hcatalog-database sqoop_data --hcatalog-table info --update-key id --update-mode updateonly --input-fields-terminated-by '|' -m 1;