刚开始看《大数据知识体系讲解》, Sqoop一直在用,却没有好好了解过,Mark一下
概念
sql to Hadoop, 关系型数据库与hdoop之间的数据ETL工具, 支持全量和增量更新
git地址: https://github.com/apache/sqoop 学完java浏览下源码实现
官网地址: http://sqoop.apache.org/
基本思想
插拔式Connector架构, Connector是与特定数据源相关的组件, 主要负责(从特定数据源中)抽取和加载数据。
用户可选择Sqoop自带的Connector, 或者数据库提供的native Connector。
Sqoop: MapReduce方式并行导入导出,性能高; 类型自动转换(用户也可自定义类型转换); 自动传播元信息。
基本架构
两个版本, 完全不兼容, 下载地址: http://mirrors.hust.edu.cn/apache/sqoop/
Sqoop1(1.4.6, 1.4.7)
客户端工具, 不需要启动任何服务,调起MapReuce作业(实际只有Map操作), 使用方便, 只有命令行交互方式。
缺陷:
(1) 仅支持JDBC的Connector
(2) 要求依赖软件必须安装在客户端上(包括Mysql/Hadoop/Oracle客户端, JDBC驱动,数据库厂商提供的Connector等)。
(3)安全性差: 需要用户提供明文密码
部署方式:
- 修改conf/sqoop-env-template.sh名称为 sqoop-env.sh
没用到Hive和HBase可以不用配置相关项,使用时会弹出警告
22 #Set path to where bin/hadoop is available
23 export HADOOP_COMMON_HOME=/opt/cloudera/parcels/CDH-5.9.0-1.cdh5.9.0.p0.23
24
25 #Set path to where hadoop-*-core.jar is available
26 export HADOOP_MAPRED_HOME=/opt/cloudera/parcels/CDH-5.9.0-1.cdh5.9.0.p0.23
27
28 #set the path to where bin/hbase is available
29 #export HBASE_HOME=
30
31 #Set the path to where bin/hive is available
32 #export HIVE_HOME=
33
34 #Set the path for where zookeper config dir is
35 #export ZOOCFGDIR=
添加数据库厂商Jdbc驱动包到lib:
Oracle - ojdbc6.jar
Mysql - mysql-connector-java-5.1.40-bin.jar修改环境变量:
export SQOOP_HOME=PATH:$SQOOP_HOME/bin
使用方式:
- import命令:关系型数据库(Mysql、Oracle) -> Hadoop(HDFS、HBase、Hive), 每条记录可表示为文本、二进制文件或SequenceFile格式;
sqoop help import 查看帮助, 配置选项较多
用法:[generic-args] 是Hadoop通用参数,[import-args]是import特有参数
sqoop import [generic-args] [import-args]
[import-args]参数说明:
参数名称 | 参数含义 |
---|---|
--connect |
JDBC连接符: jdbc:mysql://node1/movie jdbc:oracle:thin:@//ndoe/movie |
--hadoop-mapred-home |
指定$HADOOP_MAPRED_HOME路径 conf中指定后无需设置 |
--dirver | JDBC驱动器类 比如com.mysql.jdbc.Driver |
--username | 数据库用户 |
--password | 数据库密码 |
--password-alias |
Credential provider password alias |
--password-file |
设置用于存放认证的密码信息文件的路径 |
--table | 导出的表名 |
--where | 配合table使用 |
--target-dir | HDFS目录名 |
--as-textfile --as-parquetfile --as-avrodatafile --as-sequencefile | 保存格式,默认text |
-m, -num-mappers | 启动的Map Task数目 任务并行度, 默认1 |
-e,--query | 取数sql |
--fields-terminated-by | 分割符 |
--verbose | 日志 |
--append | 将数据追加到HDFS上一个已存在的数据集上 |
示例
查看数据库
sqoop list-databases \
--connect jdbc:mysql://hadoop1:3306/ \
--username root \
--password root
sqoop list-tables
导出数据到HDFS
18 sqoop import \
19 --connect $1 \
20 --username $2 \
21 --password $3 \
22 --query "$sql and "'$CONDITIONS' \
23 --target-dir $5 \
24 --fields-terminated-by "," \
25 --num-mappers 1
26 --verbose >> ${log_file}
自定义查询sql,即--query参数时:
1、引号问题,要么外层使用单引号,内层使用双引号,$CONDITIONS
的$
符号不用转义, "$sql and "'$CONDITIONS'
要么外层使用双引号,那么内层使用单引号,然后$CONDITIONS
的$
符号需要转义: "${query} AND \$CONDITIONS"
2、自定义的SQL语句中必须带有 WHERE \$CONDITIONS
导入Hive
Sqoop会自动创建对应的Hive表,但是hive-database 需要手动创建
sqoop import \
--connect jdbc:mysql://hadoop1:3306/mysql \
--username root \
--password root \
--table help_keyword \
--fields-terminated-by "\t" \
--lines-terminated-by "\n" \
--hive-import \
--hive-overwrite \
--create-hive-table \
--delete-target-dir \
--hive-database mydb_test \
--hive-table new_help_keyword
导入Hbase
sqoop import \
--connect jdbc:mysql://hadoop1:3306/mysql \
--username root \
--password root \
--table help_keyword \
--hbase-table new_help_keyword \
--column-family person \
--hbase-row-key help_keyword_id
增量更新
--incremental append --check-column 检查的字段 --last-value 起始字段last-value + 1
sqoop import \
--connect jdbc:mysql://hadoop1:3306/mysql \
--username root \
--password root \
--table help_keyword \
--target-dir /user/hadoop/myimport_add \
--incremental append \
--check-column help_keyword_id \
--last-value 500 \
-m 1
- export命令:Hadoop(HDFS、HBase、Hive)->关系型数据库(Mysql、Oracle)
export连接配置参数同import
参数名称 | 参数含义 |
---|---|
--connect |
JDBC连接符: jdbc:mysql://node1/movie jdbc:oracle:thin:@//ndoe/movie |
--hadoop-mapred-home |
指定$HADOOP_MAPRED_HOME路径 conf中指定后无需设置 |
--dirver | JDBC驱动器类 比如com.mysql.jdbc.Driver |
--username | 数据库用户 |
--password | 数据库密码 |
--table | 导入的表名 |
--export-dir | 导出的数据所在的HDFS目录 |
--update-key | 根据若干列, 更新表中的数据(默认未设置,数据插到尾部) |
--update-mode | 如果导入数据已经存在,如何更新数据, 支持updateonly 和 allowinsert 两种模式 |
-m, --num-mappers | 并行度 |
示例:
sqoop export
--connect jdbc:mysql://hadoop1:3306/mysql \
--table data
--export-dir /user/x/data/ \
--username root \
--password root \
--update-key id \
--update-mode allowinsert
效果: 如果id存在, 更新, 不存在, 插入
Sqoop2(1.99.6, 1.99.7)
引入了Sqoop Server端, 形成服务端-客户端,Connector集成到Server端,轻量客户端,部署较麻烦.
(1) Sqoop Client:
用户交互的方式:命令行(CLI) 和浏览器两种方式
(2) Sqoop Server:
Connector:
1> Partitioner 数据切片
2> Extractor 数据抽取 Map操作
3> Loader 读取Extractor输出的数据,Reduce操作Metadata: Sqoop中的元信息,次啊用轻量级数据库Apache Derby, 也可以替换为Mysql
RESTful和HTTP Server: 客户端对接请求
几个概念
Connector: 访问某种数据源的组件,负责抽取或写入数据;Sqoop2内置多个数据源组件:
- generic-jdbc-connector: 访问支持JDBC协议的数据库的Connector
- hdfs-connector: 访问Hadoop HDFS的Connector
- kafka-connector: 访问kafka的Connector
- kit-connector: 使用Kite SDK实现,可访问HDFS/Hive/Hbase
参考来源:
《大数据知识体系讲解》
Sqoop1: https://www.jianshu.com/writer#/notebooks/35613507/notes/44030976/preview
Sqoop2配置: https://blog.csdn.net/dream_an/article/details/74315897
Sqoop2实践: https://blog.csdn.net/dream_an/article/details/74936066