day 54 Sqoop
文章目录
- 一、Sqoop
- 1、SQOOP安装
- 准备MySQL数据
- 2、import
- 2.1 MySQLToHDFS
- 2.2 MySQLToHive
- 2.3 MySQLToHBase
- 3、export
- 3.1 HDFSToMySQL
- 4、查看sqoop help
- 5、增量导入
- 5.1 建表
- 5.2 append
- 5.3 last_mod
- 总结
I know, i know
地球另一端有你陪我
一、Sqoop
Apache 开源软件,主要用于在 HADOOP(Hive) 与传统的数据库(mysql、postgresql…) 间进行数据的传递
数据吞吐量大:
依赖 hadoop 集群(mapreduce)可进行大批量数据集成,将导入或导出命令翻译成mapreduce程序来实现
部署不方便:
sqoop 依赖大数据集群,使用 sqoop 要求数据传输的的源要与大数据集群的所有节点能进行通信
适用场景:
适用于能与大数据集群直接通信的关系数据库间的大批量数据传输
1、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</root/student.sql
mysql -u root -p123456 student</root/score.sql
使用Navicat运行SQL文件
导出MySQL数据库
mysqldump -u root -p123456 数据库名>任意一个文件名.sql
箭头即为指向
2、import
从传统的关系型数据库导入HDFS、HIVE、HBASE…
2.1 MySQLToHDFS
编写脚本,保存为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
root
6、运行的时候会报错InterruptedException,hadoop2.7.6自带的问题,忽略即可
21/01/25 14:32:32 WARN hdfs.DFSClient: Caught exception
java.lang.InterruptedExceptionat 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
score2
2.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 help
sqoop help21/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 recordscreate-hive-table Import a table definition into Hiveeval Evaluate a SQL statement and display the resultsexport Export an HDFS directory to a database tablehelp List available commandsimport Import a table from a database to HDFSimport-all-tables Import tables from a database to HDFSimport-mainframe Import datasets from a mainframe server to HDFSjob Work with saved jobslist-databases List available databases on a serverlist-tables List available tables in a databasemerge Merge results of incremental importsmetastore Run a standalone Sqoop metastoreversion Display version informationSee '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任务进行去重)
5.1 建表
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;
此处的时间戳即默认按修改时间更新为修改时间
5.2 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 1500100996
append 即保留原数据文件,每次执行都会追加新的数据文件
5.3 last_mod
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 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 时,尽量保持不要有复制的节点,否则部分节点可能连接不上
day 54 Sqoop相关推荐
- 大数据教程(13.6)sqoop使用教程
2019独角兽企业重金招聘Python工程师标准>>> 上一章节,介绍了sqoop数据迁移工具安装以及简单导入实例的相关知识:本篇博客,博主将继续为小伙伴们分享sqoop的使用. 一 ...
- sqoop 1.4.5 增量导入hive 0.12.0
1:导入命令 1) bin/sqoop import --connect jdbc:mysql://10.x.x.x:3306/lir --username dss --password xxx123 ...
- sqoop增量导入hdfs和导出
增量导入 在实际工作当中,数据的导入,很多时候都是只需要导入增量数据即可,并不需要将表中的数据全部导入到hive或者hdfs当中去,肯定会出现重复的数据的状况,所以我们一般都是选用一些字段进行增量的导 ...
- Hadoop辅助工具——Flume、Sqoop
前言 在一个完整的离线大数据处理系统中,除了hdfs+mapreduce+hive组成分析系统的核心之外,还需要数据采集.结果数据导出.任务调度等不可或缺的辅助系统,而这些辅助工具在hadoop生态体 ...
- sqoop建表_Sqoop学习之路 (一)
一.概述 sqoop 是 apache 旗下一款"Hadoop 和关系数据库服务器之间传送数据"的工具. 核心的功能有两个: 导入.迁入 导出.迁出 导入数据:MySQL,Orac ...
- HDFS文件权限不足导致Sqoop执行失败
故障信息 在使用sqoop从Mysql向HDFS导入文件时报错: Caused by: org.apache.hadoop.ipc.RemoteException(org.apache.hadoop. ...
- sqoop安装及使用
简介: sqoop是一款用于hadoop和关系型数据库之间数据导入导出的工具.你可以通过sqoop把数据从数据库(比如mysql,oracle)导入到hdfs中:也可以把数据从hdfs中导出到关系型数 ...
- 大数据开发之Sqoop详细介绍
备注: 测试环境 CDH 6.3.1 Sqoop 1.4.7 文章目录 一.Sqoop概述 二.Sqoop 工具概述 三.Sqoon工具详解 3.1 codegen 3.2 create-hive-t ...
- SQOOP 部署及导入数据到 Hive 的实际应用
目录 写在最前: 1.核心的功能有两个 2.sqoop 版本说明 一.部署 1.安装前准备 2.创建用户和组 3.解压到指定目录 4.添加系统环境变量 5.创建 sqoop-env.sh 文件 5.1 ...
最新文章
- 深度学习中的图像分割:方法和应用、特点
- 数组中存储不定个数的元素
- emq认证mysql后如何使用_EMQ 认证设置和acl访问控制
- 在web.config中配置httpHandlers节点是的说明
- Python 条件语句 学习转载
- 打字机已经被计算机所取代用英语,无法被电脑所取代的职业
- [链表]---链表相邻元素翻转
- idea 自动生成mybaits_怎么让idea自动创建mybatis配置文件
- 读写文件--with open
- 多线程编程(2): 线程的创建、启动、挂起和退出
- python删除字符串中的字母_从Python中的字符串中删除除字母数字字符之外的所有内容...
- 福彩3D Matlab统计分析,基于ANSYS和遗传算法的3D打印桨叶结构优化设计的制作方法...
- TC与CATIA集成使用说明
- 6年java工作经验总结
- ffmpeg遇到Non-monotonous DTS in output stream的问题
- centos8搭建maven私服(含nexus-3.28.1-01.tar.gz下载链接)
- 清华大学深度强化学习框架“天授”开源
- 12 本最具影响力的程序员书籍
- 用python将GBK编码文件转为UTF-8编码文件
- UF超滤膜:超滤膜的有效保存方法
热门文章
- ensp删除所有命令_eNSP常用命令
- 地铁当月打折后总费用计算公式分享
- 数据安全 密码学原理与概论
- 【Windows Server 2019】网络负载均衡服务配置与管理——安装配置及验证
- cadence SPB17.4 - CIS DB - add MECHANICAL part
- 2021-03-16 群辉视频播放器KODI中文设置的教程
- 基于ASP.NET109学生作业管理系统(web)
- 解决T2A W2A A2W的报错error C2065: “_lpw”: 未声明的标识符
- 大数据和云计算技术周报(第61期) - 云+社区 - 腾讯云
- 韦东山 数码相框 项目学习 (七)awtk的移植