Sqoop简单介绍及使用
简介
1、sqoop1和sqoop2是两个完全不同的版本,它们是完全不兼容的。
2、版本划分方式: apache1.4.X之后的版本是sqoop1,1.99.0之上的版本是sqoop2。
3、sqoop2
引入sqoop Server,便于集中化的管理Connector或者其它的第三方插件。
多种访问方式:CLI、Web UI、REST API。
它引入了基于角色的安全机制,管理员可以在sqoopServer上, 配置不同的角色。
一般情况下还是使用sqoop1,大多数情况下sqoop1可以完全满足需求。特殊情况下使用sqoop2,sqoop2支持数据库表的列名为中文的情况。
Sqoop用于实现MySQL等RDBMS数据库与HDFS【Hive/Hbase】之间的数据导入与导出。
Sqoop不是一个分布式工具,但是Sqoop可以实现分布式的数据同步
底层是MapRduce程序:每个Sqoop导入导出的程序就是一个MapReduce程序。类似于Hive,将Sqoop程序转换为MapReduce程序,利用MapReduce分布式来实现分布式同步
Sqoop程序转换成MapReduce程序,提交给YARN运行,实现分布式采集
Sqoop程序一般都是没有Shuffle和Reduce,只有Map过程
必须依赖于Hadoop:MapReduce + YARN
MapReduce是离线计算框架,Sqoop是离线数据采集工具,只适合于大数据量的离线数据库同步
数据仓库数据同步方式
方式一:全量同步【快照表】
- 设计:每天新增一个日期分区,同步存储之前所有至当天为止的全量数据,历史数据定期删除
- 优点:保存了RDBMS中数据的所有状态
- 缺点:冗余度非常高,查询性能非常差
- 场景:适用于数据有新增和更新,但数据量较少,且历史快照不用保存很久的情况
方式二:全量覆盖【一般用于维度表】
设计:不需要分区,每次同步都是直接覆盖
场景:适用于数据量小,而且很少有数据新增和更新的情况
方式三:仅同步新增【增量表】
- 设计:每天新增一个日期分区,同步存储当天的新增数据
- 场景:适合于数据永远只有新增,不会发生更新的场景
方式四:新增和更新都同步【拉链表】
- 设计:每天新增一个日期分区,同步并存储当天的新增和更新数据
- 场景:适合于数据既有新增也有更新的场景,并且需要记录更新
Sqoop使用
命令:${SQOOP_HOME}/bin/sqoop
帮助命令:sqoop help
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.
sqoop import --help usage: sqoop import [GENERIC-ARGS] [TOOL-ARGS]
sqoop export --help usage: sqoop export [GENERIC-ARGS] [TOOL-ARGS]
Mysql -> HDFS
# MySQL选项 --connect: Sqoop连接的MySQL或者其他数据库的地址 --username: Sqoop连接的MySQL的用户名 --password: Sqoop连接的MySQL的用户密码 --password-file: Sqoop连接的MySQL的用户密码文件 --table: Sqoop读写MySQL哪张表 --columns: 读取MySQL表哪些列 --where: 读取MySQL表的条件过滤 -e/--query: 用一条SQL语句指定读取MySQL的数据# HDFS选项 --target-dir: 用于指定从MySQL读取的数据导入到HDFS的什么位置 --delete-target-dir: 用于提前删除HDFS上的路径,MapReduce不允许输出目录提前存在 --fields-terminated-by: 用于指定写入HDFS的文件中每一列的分隔符,默认的分隔符是:逗号# 其他选项 -m: 指定导入的数据的MapTask个数 --split-by: 如果有多个MapTask,可以用split-by去指定按照哪一列来划分每个MapTask处理的数据
# 例 # 方式一:指定条件 sqoop import \ --connect jdbc:mysql://node01:3306/Test_db \ --username root \ --password 123456 \ --table test_tb \ --columns id,name \ --where 'id > 4' \ --delete-target-dir \ --target-dir /sqoop/import/test01 \ --fields-terminated-by '\t' \ -m 1# 方式二:使用SQL sqoop import \ --connect jdbc:mysql://node01:3306/Test_db \ --username root \ --password 123456 \ -e 'select id,name from tb_tohdfs where id > 4 and $CONDITIONS' \ --delete-target-dir \ --target-dir /sqoop/import/test02 \ --fields-terminated-by '\t' \ -m 1
注意:如果使用-e/–query必须在where中加上$CONDITIONS【固定语法规则】
指定多个MapTask时,分为两种情况
情况一:如果MySQL表有主键,可以直接指定,自动根据主键的值来划分每个MapTask处理的数据
情况二:如果MySQL表没有主键,需要加上–split-by指定按哪一列进行划分数据,如果既没有主键也没有指定–split-by会报错
# 参数-Dorg.apache.sqoop.splitter.allow_text_splitter=true的含义是允许文本类型的字段作为--split-by的参数 sqoop import "-Dorg.apache.sqoop.splitter.allow_text_splitter=true" \ ...省略... --split-by draw_id \ -m 32
Mysql -> HIVE
# MySQL选项 --connect: Sqoop连接的MySQL或者其他数据库的地址 --username: Sqoop连接的MySQL的用户名 --password: Sqoop连接的MySQL的用户密码 --password-file: Sqoop连接的MySQL的用户密码文件 --table: Sqoop读写MySQL哪张表 --columns: 读取MySQL表哪些列 --where: 读取MySQL表的条件过滤 -e/--query: 用一条SQL语句指定读取MySQL的数据# Hive选项 # Old API:先走MapReduce导入HDFS,再将导入的文件load到Hive表中 --hive-import: 表示要导入数据到Hive表中 --hive-database: 指定导入到Hive的哪个数据库中 --hive-table: 指定导入到Hive的哪张表中 # New API:直接访问Hive的元数据,将数据直接写入Hive表对应的位置(一般使用这种方式) --hcatalog-database: 指定导入到Hive的哪个数据库中 --hcatalog-table: 指定导入到Hive的哪张表中# 其他选项 -m: 指定导入的数据的MapTask个数 --split-by: 如果有多个MapTask,可以用split-by去指定按照哪一列来划分每个MapTask处理的数据
Old API与New API区别
区别 | Old API(–hive) | New API(–hcatalog) |
---|---|---|
数据格式 | 较少 | 支持多种特殊格式:orc/rcfile/squencefile/json等 |
导入方式 | 允许覆盖 | 不允许覆盖,只能追加 |
字段匹配 | 字段顺序匹配,字段名可以不相等 | 字段名匹配,名称必须相等 |
Sqoop增量导入
Sqoop自带方式:较少使用用
Incremental import arguments:
--check-column <column> # 指定用哪一列来作为增量的依据
--incremental <import-type> # 指定Sqoop增量采集方式'append' or 'lastmodified',append:适合于只有新增的场景,lastmodified:适合于既有新增,也有更新的场景
--last-value <value> # 指定作为增量依据的列的上一次的最后一个值
条件过滤增量方式:工作中最常用的Sqoop增量的方式
sqoop import \
--connect jdbc:mysql://node01:3306/Test_db \
--username root \
--password 123456 \
-e 'select * from tb_tohdfs where substr(create_time,1,10) = '昨天的日期' or substr(update_time,1,10) = 昨天的日期 and $CONDITIONS' \
# 输出目录不能提前存在,每次输出目录都需要不同
--target-dir /sqoop/import/昨天的日期的目录 \
--fields-terminated-by '\t' \
-m 1
Sqoop全量导出
HDFS -> Mysql
# MySQL选项
--connect: Sqoop连接的MySQL或者其他数据库的地址
--username: Sqoop连接的MySQL的用户名
--password: Sqoop连接的MySQL的用户密码
--password-file: Sqoop连接的MySQL的用户密码文件
--table: Sqoop读写MySQL哪张表# HDFS选项
--export-dir: 指定导出的HDFS路径
--input-fields-terminated-by: 指定导出的HDFS文件的列的分隔符# 其他选项
-m: 指定导入的数据的MapTask个数
--split-by: 如果有多个MapTask,可以用split-by去指定按照哪一列来划分每个MapTask处理的数据
HIVE -> Mysql
# MySQL选项
--connect: Sqoop连接的MySQL或者其他数据库的地址
--username: Sqoop连接的MySQL的用户名
--password: Sqoop连接的MySQL的用户密码
--password-file: Sqoop连接的MySQL的用户密码文件
--table: Sqoop读写MySQL哪张表# HIVE选项
--hcatalog-database: 指定使用hcatalog方式导出到Hive的数据库名称
--hcatalog-table: 指定使用hcatalog方式导出到Hive的数据库名称# 其他选项
-m: 指定导入的数据的MapTask个数
--split-by: 如果有多个MapTask,可以用split-by去指定按照哪一列来划分每个MapTask处理的数据
# 例
sqoop export \
--connect jdbc:mysql://node01:3306/Test_db \
--username root \
--password 123456 \
--table test_table \
--export-dir /user/hive/warehouse/test_table \
--input-fields-terminated-by '\t' \
-m 1
Sqoop增量导出
updateonly # 只增量导出更新的数据,不能导出新增的数据
allowerinsert # 既导出更新的数据,也导出新增的数据
# 例### updateonly
sqoop export \
--connect jdbc:mysql://node01:3306/Test_db \
--username root \
--password 123456 \
--table tb_url \
--export-dir /user/hive/warehouse/tb_url \
--input-fields-terminated-by '\t' \
--update-key id \
--update-mode updateonly \
-m 1### allowerinsert
sqoop export \
--connect jdbc:mysql://node01:3306/Test_db \
--username root \
--password 123456 \
--table tb_url \
--export-dir /user/hive/warehouse/tb_url \
--input-fields-terminated-by '\t' \
--update-key id \
--update-mode allowinsert \
-m 1
Sqoop Job的使用
创建job
# 创建job,不会运行程序,只是在元数据中记录job信息
sqoop job --create job01 \
-- import \
--connect jdbc:mysql://node01:3306/Test_db \
--username root \
--password 123456 \
--table tb_tohdfs \
--target-dir /sqoop/import/test05 \
--fields-terminated-by '\t' \
--incremental append \
--check-column id \
--last-value 8 \
-m 1
其它job相关命令
sqoop job --list # 列举job
sqoop job --show jobName # 查看job的信息
sqoop job --exec jobName # 运行job
sqoop job --delete jobName # 删除job
Sqoop密码
解决手动输入密码和密码明文问题:
方式一:在sqoop的sqoop-site.xml文件中配置,将密码存储在客户端中
方式二:将密码存储在文件中,通过文件的权限来管理密码(–password-file)
sqoop job --create job02 \
-- import \
--connect jdbc:mysql://node01:3306/Test_db \
--username root \
--password-file file:///export/data/sqoop.passwd \ # 这是读取linux本地文件的写法
--table tb_tohdfs \
--target-dir /sqoop/import/test06 \
--fields-terminated-by '\t' \
--incremental append \
--check-column id \
--last-value 4 \
-m 1
–password-file:密码文件的路径,默认读取的是HDFS文件,这个文件中只能有一行密码,要删除多余的换行
Sqoop脚本
将sqoop代码封装到一个文件中
vim /export/data/test.sqoop
import
--connect
jdbc:mysql://node01:3306/Test_db
--username
root
--password-file
file:///export/data/sqoop.passwd
--table
tb_tohdfs
--target-dir
/sqoop/import/test05
--fields-terminated-by
'\t'
-m
1
一行只放一个参数
运行sqoop脚本
sqoop --options-file /export/data/test.sqoop
Sqoop简单介绍及使用相关推荐
- hadoop简单介绍_Hadoop:简单介绍
hadoop简单介绍 什么是Hadoop: Hadoop是用Java编写的框架,用于在大型商品硬件群集上运行应用程序,并具有类似于Google File System和MapReduce的功能 . H ...
- Hadoop:简单介绍
什么是Hadoop: Hadoop是一种用Java编写的框架,用于在大型商品硬件集群上运行应用程序,并具有类似于Google File System和MapReduce的功能 . HDFS是高度容错的 ...
- 遗传算法的简单介绍以及模式定理的简单证明
遗传算法 遗传算法(Genetic Algorithm,GA),最早是由美国的John holland在20世纪70年代提出.算法通过模拟达尔文生物进化论的自然选择以及遗传学机理的生物进化过程来搜 ...
- 2021年大数据ELK(十八):Beats 简单介绍和FileBeat工作原理
全网最详细的大数据ELK文章系列,强烈建议收藏加关注! 新文章都已经列出历史文章目录,帮助大家回顾前面的知识重点. 目录 Beats 简单介绍和FileBeat工作原理 一.Beats 二.FileB ...
- 2021年大数据ELK(十五):Elasticsearch SQL简单介绍
全网最详细的大数据ELK文章系列,强烈建议收藏加关注! 新文章都已经列出历史文章目录,帮助大家回顾前面的知识重点. 目录 Elasticsearch SQL简单介绍 一.SQL与Elasticsear ...
- 2021年大数据ELK(二):Elasticsearch简单介绍
全网最详细的大数据ELK文章系列,强烈建议收藏加关注! 新文章都已经列出历史文章目录,帮助大家回顾前面的知识重点. 目录 系列历史文章 一.Elasticsearch简介 1.介绍 2.创始人 二.E ...
- iOS开发UI篇—多控制器和导航控制器简单介绍
iOS开发UI篇-多控制器和导航控制器简单介绍 一.多控制器 一个iOS的app很少只由一个控制器组成,除非这个app极其简单.当app中有多个控制器的时候,我们就需要对这些控制器进行管理 有多个vi ...
- 简单介绍一下R中的几种统计分布及常用模型
统计学上分布有很多,在R中基本都有描述.因能力有限,我们就挑选几个常用的.比较重要的简单介绍一下每种分布的定义,公式,以及在R中的展示. 统计分布每一种分布有四个函数:d――density(密度函数) ...
- LVS(Linux Virtual Server)三种负载均衡模型和十种调度的简单介绍
LVS(Linux Virtual Server)三种负载均衡模型和十种调度的简单介绍 LVS (Linux Virtual Server) LVS(Linux Virtual Server)其实就是 ...
最新文章
- eeglab中文教程系列(10)-利用光谱选项绘制ERP图像
- listview侧滑删除
- 求给定精度的简单交错序列部分和_单个神经元的简单模型:Leaky integrate and fire (LIF) model...
- 如何在Windows、Linux中获取主机的网络信息和公网地址
- IROS 2017上,这些厂商将会给我们展示什么样的黑科技?
- eclipse下提交job时报错mapred.JobClient: No job jar file set. User classes may not be found.
- 关于使用keil5软件进行stm32的简单嵌入编程
- 综述|线结构光中心提取算法研究发展
- 快速幂计算x的n次幂,递归版本、迭代版本、python实现
- 2018/7/9日~年中总结
- Exception in thread “main“ java.lang.ClassCastException 类型转换异常
- MySQL 数据库设计范式/优化
- 交叉销售(Cross-Selling)与链接分析
- 【RFC5382 TCP 的 NAT 行为要求】(翻译)
- 幕维动画——港珠澳大桥岛隧三维动画
- 图像成像原理与相机标定
- 《满城黄金甲》另类观后感
- Android10 WIFI MAC地址获取流程
- 反编译 AndroidManifest.xml文件
- 消防员逆行救援天然气泄露,气体的安运输全需要资产监测设备