ETL工具——sqoop
链接:https://pan.baidu.com/s/1PESrpOhFBDl03U8jyTw9bg
提取码:lycc
一、sqoop安装及使用
1、上传解压重命名
tar -zxvf sqoop-1.4.7.bin__hadoop-2.6.0.tar.gz -C /usr/local/soft/
mv sqoop-1.4.7.bin__hadoop-2.6.0/ sqoop-1.4.7
2、修改配置文件
# 切换到sqoop配置文件目录
cd /usr/local/soft/sqoop-1.4.7/conf
# 复制配置文件并重命名
cp sqoop-env-template.sh sqoop-env.sh
# vim sqoop-env.sh 编辑配置文件,并加入以下内容
export HADOOP_COMMON_HOME=/usr/local/soft/hadoop-2.7.6
export HADOOP_MAPRED_HOME=/usr/local/soft/hadoop-2.7.6/share/hadoop/mapreduce
export HBASE_HOME=/usr/local/soft/hbase-1.4.6
export HIVE_HOME=/usr/local/soft/hive-1.2.1
export ZOOCFGDIR=/usr/local/soft/zookeeper-3.4.6/conf
export ZOOKEEPER_HOME=/usr/local/soft/zookeeper-3.4.6
# 切换到bin目录
cd /usr/local/soft/sqoop-1.4.7/bin
# vim configure-sqoop 修改配置文件,注释掉没用的内容(就是为了去掉警告信息)
3、修改环境变量
vim /etc/profile
# 将sqoop的目录加入环境变量
#配置文件生效
source /etc/profile
4、添加mysql连接驱动
# 从HIVE中复制MySQL连接驱动到$SQOOP_HOME/lib
cp /usr/local/soft/hive-1.2.1/lib/mysql-connector-java-5.1.49.jar /usr/local/soft/sqoop-1.4.7/lib/
5、测试连接
# 打印sqoop版本
sqoop version
# 测试MySQL连通性
sqoop list-databases -connect jdbc:mysql://master:3306?useSSL=false -username root -password 123456
6、登录MySQL
登录mysql数据库
mysql -u root -p123456;
创建student数据库
create database student;
7、切换数据库并导入数据
1、mysql shell中执行
use student;
source /root/student.sql;
source /root/score.sql;
2、linux shell中执行
mysql -u root -p123456 student</root/student.sql
mysql -u root -p123456 student</root/score.sql
3、通过navicat导入数据
8、导出MySQL数据库
mysqldump -u root -p123456 数据库名>任意一个文件名.sql
二、import
从传统的关系型数据库导入HDFS、HIVE、HBASE......
1、MySQLToHDFS
1、编写脚本,保存为MySQLToHDFS.conf
sqoop工具
import工具
import
--connect
jdbc:mysql://master:3306/student?useSSL=false
--username
root
--password
123456
--table
student
--m
2
--split-by
age
--target-dir
/sqoop/data/student1
--fields-terminated-by
','
2、执行脚本
sqoop --options-file MySQLToHDFS.conf
注意事项
1、--m 表示指定生成多少个Map任务,不是越多越好,因为MySQL Server的承载能力有限
2、当指定的Map任务数>1,那么需要结合--split-by
参数,指定分割键,以确定每个map任务到底读取哪一部分数据,最好指定数值型的列,最好指定主键(或者分布均匀的列=>避免每个map任务处理的数据量差别过大)
3、如果指定的分割键数据分布不均,可能导致数据倾斜问题
4、分割的键最好指定数值型的,而且字段的类型为int、bigint这样的数值型
5、编写脚本的时候,注意:例如:--username
参数,参数值不能和参数名同一行
--username root // 错误的
// 应该分成两行
--username
root
6、运行的时候会报错InterruptedException,hadoop2.7.6自带的问题,忽略即可
7、实际上sqoop在读取mysql数据的时候,用的是JDBC的方式,所以当数据量大的时候,效率不是很高
8、sqoop底层通过MapReduce完成数据导入导出,只需要Map任务,不需要Reduce任务
9、每个Map任务会生成一个文件
2、MySQLToHive
先会将MySQL的数据导出来并在HDFS上找个目录临时存放,默认为:/user/用户名/表名
然后再将数据加载到Hive中,加载完成后,会将临时存放的目录删除
1、编写脚本,并保存为MySQLToHIVE.conf文件
import
--connect
jdbc:mysql://master:3306/student?useSSL=false
--username
root
--password
123456
--table
score
--fields-terminated-by
"\t"
--lines-terminated-by
"\n"
--m
3
--split-by
student_id
--hive-import
--hive-overwrite
--create-hive-table
--hive-database
testsqoop
--hive-table
score
--delete-target-dir
2、在Hive中创建testsqoop库
hive> create database testsqoop;
3、将HADOOP_CLASSPATH加入环境变量中
vim /etc/profile
# 加入如下内容
export HADOOP_CLASSPATH=$HADOOP_HOME/lib:$HIVE_HOME/lib/*
# 重新加载环境变量
source /etc/profile
4、将hive-site.xml放入SQOOP_HOME/conf/
cp /usr/local/soft/hive-1.2.1/conf/hive-site.xml /usr/local/soft/sqoop-1.4.7/conf/
5、执行脚本
sqoop --options-file MySQLToHIVE.conf
--direct
加上这个参数,可以在导出MySQL数据的时候,使用MySQL提供的导出工具mysqldump,加快导出速度,提高效率
需要将master上的/usr/bin/mysqldump分发至 node1、node2的/usr/bin目录下
scp /usr/bin/mysqldump node1:/usr/bin/
scp /usr/bin/mysqldump node2:/usr/bin/
-e参数的使用(筛选)
import
--connect
jdbc:mysql://master:3306/student
--username
root
--password
123456
--fields-terminated-by
"\t"
--lines-terminated-by
"\n"
--m
2
--split-by
student_id
--e
"select * from score where student_id=1500100011 and $CONDITIONS"
--target-dir
/testQ
--hive-import
--hive-overwrite
--create-hive-table
--hive-database
testsqoop
--hive-table
score2
3、MySQLToHBase
1、编写脚本,并保存为MySQLToHBase.conf
import
--connect
jdbc:mysql://master:3306/student?useSSL=false
--username
root
--password
123456
--table
student
--hbase-table
student
--hbase-create-table
--hbase-row-key
id
--m
1
--column-family
cf1
2、在HBase中创建student表
create 'student','cf1'
3、执行脚本
sqoop --options-file MySQLToHBase.conf
三、export
export工具
1、HDFSToMySQL
1、编写脚本,并保存为HDFSToMySQL.conf
export
--connect
jdbc:mysql://master:3306/student?useSSL=false
--username
root
--password
123456
--table
student
-m
1
--columns
id,name,age,gender,clazz
--export-dir
/sqoop/data/student1/
--fields-terminated-by
','
注意:先清空MySQL student表中的数据,不然会造成主键冲突
delete会有记录,可以恢复
truncate截断没有记录不能恢复
2、执行脚本
sqoop --options-file HDFSToMySQL.conf
四、查看sqoop help
# 查看import的详细帮助
sqoop import --help
五、增量(因为不可能数据更新每次都重新导入,所以使用数据增量导入新数据)
–check-column
用来指定一些列,这些列在增量导入时用来检查这些数据是否作为增量数据进行导入,和关系型数据库中的自增字段及时间戳类似.
注意:这些被指定的列的类型不能使任意字符类型,如char、varchar等类型都是不可以的,同时–check-column可以去指定多个列
–incremental
用来指定增量导入的模式,两种模式分别为Append(追加)和Lastmodified(相同id合并保留最新数据)
–last-value
指定上一次导入中检查列指定字段最大值
注意:
Error during import: --merge-key or --append is required when using --incremental lastmodified and the output directory exists.
当--incremental lastmodified 并且输出的路径不为空,则需要加上 --append(追加) 或者 --merge-key(合并,当一个mapreduce任务运行完,还会启动另外一个mapreduce任务进行去重)
建表时加上时间戳,设置成默认当前时间
create table student
(
id int(10) not null AUTO_INCREMENT,
name char(5),
age int,
gender char(2),
clazz char(4),
primary key (id),
last_mod timestamp DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP
) DEFAULT CHARSET=utf8;
指定字段的取值范围,增量导数据
适用于表不断的有新数据插入
导入id大于等于last-value的数据
sqoop import \
--connect 'jdbc:mysql://master:3306/student?useSSL=false' \
--username root \
--password 123456 \
--table student \
--target-dir /sqoop/data/student5 \
--split-by id \
--m 2 \
--fields-terminated-by ',' \
--incremental append \
--check-column id \
--last-value 1500100996
导入--check-column指定的last_mod列的值大于等于--last-value "2021-12-06 16:46:00"
注意:如果加上--merge-key 会在导入之后在做去重,去重会开启一个reduce任务
sqoop import \
--connect 'jdbc:mysql://master:3306/student?useSSL=false' \
--username root \
--driver com.mysql.jdbc.Driver \
--password 123456 \
--table student \
--target-dir /sqoop/data/student6 \
--split-by id \
--m 2 \
--fields-terminated-by ',' \
--incremental lastmodified \
--check-column last_mod \
--last-value "2021-12-06 16:46:00" \
--merge-key \
id