Sqoop

刚开始看《大数据知识体系讲解》, 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)安全性差: 需要用户提供明文密码

Sqoop1

部署方式:

  • 修改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=HOME/program/sqoop export PATH=PATH:$SQOOP_HOME/bin

使用方式:

屏幕快照 2019-03-29 22.41.11.png
  • 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-uri> JDBC连接符: jdbc:mysql://node1/movie jdbc:oracle:thin:@//ndoe/movie
--hadoop-mapred-home <dir> 指定$HADOOP_MAPRED_HOME路径 conf中指定后无需设置
--dirver JDBC驱动器类 比如com.mysql.jdbc.Driver
--username 数据库用户
--password 数据库密码
--password-alias <password-alias> Credential provider password alias
--password-file <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-uri> JDBC连接符: jdbc:mysql://node1/movie jdbc:oracle:thin:@//ndoe/movie
--hadoop-mapred-home <dir> 指定$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
sqoop2

参考来源:
《大数据知识体系讲解》
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

推荐阅读更多精彩内容