- 一、Sqoop
- 1、SQOOP安装
- 准备MySQL数据
- 2、import
- 2.1 MySQLToHDFS
- 2.2 MySQLToHive
- 2.3 MySQLToHbase
- 3、export
- 3.1 HDFSToMySQL
- 4、查看sqoop help
- 5、增量导入
- **建表**
- append
- 总结
I know, i know
地球另一端有你陪我
一、Sqoop
Apache开源软件,主要用于在HADOOP(Hive)与传统的数据库(mysql、postgresql…)间进行数据的传递。
数据吞吐量大:依赖hadoop集群(mapreduce)可进行大批量数据集成。
*** 作有技术要求:sqoop *** 作没有可视化设计器,对使用人员有较专业的技术要求。
多种交互方式:命令行,web UI,rest API。
部署不方便:sqoop依赖大数据集群,使用sqoop要求数据传输的的源要与大数据集群的所有节点能进行通信。
适用场景:适用于能与大数据集群直接通信的关系数据库间的大批量数据传输。
1 上传并解压
tar -zxvf sqoop-1.4.7.bin__hadoop-2.6.0.tar.gz -C /usr/local/soft/
2 修改文件夹名字
mv sqoop-1.4.7.bin__hadoop-2.6.0/ sqoop-1.4.7
3 修改配置文件
# 切换到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 修改配置文件,注释掉没用的内容(就是为了去掉警告信息)
4 修改环境变量
vim /etc/profile # 将sqoop的目录加入环境变量
5 添加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/
6 测试
# 打印sqoop版本 sqoop version
# 测试MySQL连通性 sqoop list-databases -connect jdbc:mysql://master:3306?useSSL=false -username root -password 123456准备MySQL数据
登录MySQL数据库
注意,密码是紧跟着-p的
mysql -u root -p123456;
创建student数据库
create database student;
切换数据库并导入数据
# mysql shell中执行 use student; source /root/student.sql; source /root/score.sql;
另外一种导入数据的方式
# linux shell中执行 mysql -u root -p123456 student使用Navicat运行SQL文件
导出MySQL数据库
mysqldump -u root -p123456 数据库名>任意一个文件名.sql箭头即为指向
2、import2.1 MySQLToHDFS从传统的关系型数据库导入HDFS、HIVE、Hbase…
编写脚本,保存为MySQLToHDFS.conf
import --connect jdbc:mysql://master:3306/student?useSSL=false --username root --password 123456 --table student --m 2 --split-by age --target-dir /bdtools/sqoop/sqltoHDFS --delete-target-dir --fields-terminated-by ','执行脚本
sqoop --options-file MySQLToHDFS.conf注意事项:
1、–m 表示指定生成多少个Map任务,不是越多越好,因为MySQL Server的承载能力有限
2、当指定的Map任务数>1,那么需要结合--split-by参数,指定分割键,以确定每个map任务到底读取哪一部分数据,最好指定数值型的列(int,时间戳类型),最好指定主键(或者分布均匀的列=>避免每个map任务处理的数据量差别过大)
3、如果指定的分割键数据分布不均,可能导致map的数据“倾斜"问题
4、分割的键最好指定数值型的,而且字段的类型为int、bigint这样的数值型
5、编写脚本的时候,注意:例如:--username参数,参数值不能和参数名同一行
--username root // 错误的 // 应该分成两行 --username root6、运行的时候会报错InterruptedException,hadoop2.7.6自带的问题,忽略即可
21/01/25 14:32:32 WARN hdfs.DFSClient: Caught exception java.lang.InterruptedException at java.lang.Object.wait(Native Method) at java.lang.Thread.join(Thread.java:1252) at java.lang.Thread.join(Thread.java:1326) at org.apache.hadoop.hdfs.DFSOutputStream$DataStreamer.closeResponder(DFSOutputStream.java:716) at org.apache.hadoop.hdfs.DFSOutputStream$DataStreamer.endBlock(DFSOutputStream.java:476) at org.apache.hadoop.hdfs.DFSOutputStream$DataStreamer.run(DFSOutputStream.java:652)7、实际上sqoop在读取mysql数据的时候,用的是JDBC的方式,所以当数据量大的时候,mapreduce启动会很慢,并且受限于mySQL,当数据量过大后读取会较慢,效率不是很高
8、sqoop底层通过MapReduce完成数据导入导出,只需要Map任务,不需要Reduce任务
9、每个Map任务会生成一个文件
10、如果不指定切分对象,却依然分配多个map task,会默认使用主键进行切分
11、可以在每一行的后面加上“/”可以让代码直接在shell命令行中执行
2.2 MySQLToHive
先会将MySQL的数据导出来并在HDFS上找个目录临时存放,默认为:/user/用户名/表名
然后再将数据加载到Hive中,加载完成后,会将临时存放的目录删除
编写脚本,并保存为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 --direct在Hive中创建testsqoop库
hive> create database testsqoop;将HADOOP_CLASSPATH加入环境变量中
vim /etc/profile # 加入如下内容 export HADOOP_CLASSPATH=$HADOOP_HOME/lib:$HIVE_HOME/lib/* # 重新加载环境变量 source /etc/profile将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/执行脚本
sqoop --options-file MySQLToHIVE.conf–direct
加上这个参数,可以在导出MySQL数据的时候,从底层使用MySQL提供的导出工具mysqldump,加快导出速度,提高效率
由于 mapreduce 是在 namenode 中执行的,因此需要分发到 namenode
需要将master上的/usr/bin/mysqldump分发至 node1、node2的/usr/bin目录下
scp /usr/bin/mysqldump node1:/usr/bin/ scp /usr/bin/mysqldump node2:/usr/bin/-e参数的使用
执行查询语句,import部分数据
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 score22.3 MySQLToHbase编写脚本,并保存为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在Hbase中创建student表
create 'student','cf1'执行脚本
sqoop --options-file MySQLToHbase.conf
3、export 3.1 HDFSToMySQL编写脚本,并保存为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 /bdtools/sqoop/sqltoHDFS/ --fields-terminated-by ','先清空MySQL student表中的数据,不然会造成主键冲突
执行脚本
sqoop --options-file HDFSToMySQL.conf
4、查看sqoop helpsqoop help 21/04/26 15:50:36 INFO sqoop.Sqoop: Running Sqoop version: 1.4.6 usage: sqoop COMMAND [ARGS] Available commands: codegen Generate code to interact with database records create-hive-table import a table definition into Hive eval evaluate a SQL statement and display the results export Export an HDFS directory to a database table help List available commands import import a table from a database to HDFS import-all-tables import tables from a database to HDFS import-mainframe import datasets from a mainframe server to HDFS job Work with saved jobs list-databases List available databases on a server list-tables List available tables in a database merge Merge results of incremental imports metastore Run a standalone Sqoop metastore version Display version information See 'sqoop help COMMAND' for information on a specific command.# 查看import的详细帮助 sqoop import --help
5、增量导入–check-column
检查字段是否自增(数据唯一),和关系型数据库中的自增字段及时间戳类似.注意:这些被指定的列的类型不能使任意字符类型,
如char、varchar等类型都是不可以的,同时–check-column可以去指定多个列–incremental
用来指定增量导入的模式,两种模式分别为 Append 和 Lastmodified–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;此处的时间戳即默认按修改时间更新为修改时间
append
sqoop import --connect 'jdbc:mysql://master:3306/student?useSSL=false' --username root --password 123456 --table student --target-dir /sqoop/data/test1 --split-by id --m 1 --fields-terminated-by ',' --incremental append --check-column id --last-value 1500100996append 即保留原数据文件,每次执行都会追加新的数据文件
### last_modsqoop 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 1 --fields-terminated-by ',' --incremental lastmodified --check-column last_mod --last-value "2021-12-07 21:14:00" --merge-key id导入–check-column指定last_mod列
–last-value “2021-12-06 16:46:00” :值大于等于
总结如果不加 --append 或 --merge-key,会因为路径冲突报错
–append 会保留源文件进行追加
–merge-key 会在导入之后在做去重
二者都是依赖 reduce 进行的1、sql 存在删除表和截断表,区别在于:
删除表,表完全删除,但是可以通过日志进行恢复
截断表,等同于 truncate,无法恢复记录2、sql 可视化界面中导入表,右键 — 执行 sql 文件
3、输入(import)和输出(export)是针对 HDFS 来描述的,类比流
4、shell 查询命令位置:where is 命令
5、ETL:萃取(Extract)、转换(Transform)、加载(Load)
6、开启 zk 时,尽量保持不要有复制的节点,否则部分节点可能连接不上
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)