一、离线同步引擎概况
这里重点分析Sqoop、DataX、Spark
Apache Sqoop是一种用于在Apache Hadoop和结构化数据存储(如关系数据库)之间高效传输批量数据的工具。http://sqoop.apache.org/
目前主要分为2个版本:Sqoop1,版本号1.4.x,最新版本1.4.7;Sqoop2,版本号1.99x,最新1.99.7 ;两个版本之间完全不兼容;
Note that 1.99.7 is not compatible with 1.4.7 and not feature complete, it is not intended for production deployment.
将导入或导出命令翻译成MR程序来实现。在翻译出的MR中主要是对inputformat和outputformat进行定制。
两代之间是两个完全不同的版本,不兼容
lSqoop2引入sqoop server,集中化管理connector
lSqoop2多种访问方式:CLI,Web UI,REST API
lSqoop2引入基于角色 的安全机制
lSqoop1架构:
(1)、Importing Data
第一步,Sqoop从数据库中获取要导入的数据的元数据;
第二步,Sqoop提交map-only作业到Hadoop集群中;
(2)Exporting Data
第一步,从数据库中获取要导入的数据的元数据,
第二步则是数据的传输。Sqoop将输入数据集分割成片然后用map任务将片插入到数据库中。为了确保最佳的吞吐量和最小的资源使用率,每个map任务通过多个事务来执行这个数据传输。
参考:https://blogs.apache.org/sqoop/entry/apache_sqoop_overview
lSqoop2架构:
Feature | Sqoop1 | Sqoop2 |
---|---|---|
Connectors for all major RDBMS | 支持 | 不支持 解决办法: 使用已在以下数据库上执行测试的通用 JDBC 连接器: Microsoft SQL Server 、 PostgreSQL 、 MySQL 和 Oracle |
Kerberos安全集成 | 支持 | 支持 |
数据导入:from RDBMS to Hive or HBase | 支持 | 不支持 解决办法: 将数据从 RDBMS 导入 HDFS Hive 中使用相应的工具和命令(例如 LOAD DATA 语句),手动将数据载入 Hive 或 HBase |
数据导出:from Hive or HBase to RDBMS | 不支持 解决办法: 1、 从 Hive 或 HBase 将数据提取至 HDFS ,作为文本或 Avro 文件 2、使用 Sqoop 将上一步的输出导出至 RDBMS | 不支持 解决办法: 同Sqoop1 |
参考:https://docs.cloudera.com/documentation/enterprise/5-6-x/topics/cdh_ig_sqoop_vs_sqoop2.html
lMySQL2Hive
sqoop import \
--connect jdbc:mysql://10.0.0.9:3306/hivemetastore \
--username root \
--password Qweasd123 \
--hive-import \
--table ROLES \
--hive-database default \
--hive-table roles_test \
--fields-terminated-by ',' \
-m 2
lHive2MySQL
本质是从HDFS导出到MySQL,先获取到表的HDFS地址,再进行导出
desc formatted roles_test
SHOW create table roles_test
sqoop export \
--connect jdbc:mysql://10.0.0.9:3306/hivemetastore \
--username root \
--password Qweasd123 \
--table roles_test \
--export-dir hdfs://10.0.0.3:4007/usr/hive/warehouse/roles_test' \
--input-fields-terminated-by ',' \
-m 1
需要3步:1、创建源头、目标link;2、创建job;3、启动job
create link -connector generic-jdbc-connector
create link -connector hdfs-connector
## create job -f formLinkName -t toLinkName
create job -f mysql-link -t hdfs-link
## start job -name jobName
start job -name test1
参考:
lSqoop:http://sqoop.apache.org/docs/1.4.7/SqoopUserGuide.html
lSqoop2:http://sqoop.apache.org/docs/1.99.7/user.html
支持Sqoop1.4.7
DataX 是阿里开源的一个异构数据源离线同步工具,致力于实现包括关系型数据库(MySQL、Oracle等)、HDFS、Hive、ODPS、HBase、FTP等各种异构数据源之间稳定高效的数据同步功能。
目前已经基本覆盖常用的数据源。https://github.com/alibaba/DataX
数据传输过程在单进程内完成,全内存操作,不读写磁盘,也没有IPC
https://github.com/alibaba/DataX
基于Yarn提交任务模式,向yarn 提交一个spark任务
db2hive
/usr/hdp/2.2.0.0-2041/spark/bin/spark-submit --driver-class-path common-lib/mysql-connector-java-5.1.20.jar --jars common-lib/mysql-connector-java-5.1.20.jar --master yarn --deploy-mode cluster --queue root.workflow --class com.tbds.tencent.DB2HiveClient db2hiveCore-5.0-jar-with-dependencies.jar '{"curDateTime":"2019-01-04 16:11:32","dbColumnList":"broker_ip,task_id,task_type","dbProperties":{"dbName":"lhotse_open","dbType":"mysql","driver":"com.mysql.jdbc.Driver","fetchsize":"1000","fullTable":"lhotse_open.lb_task","password":"lhotse@Tbds.com","tableName":"lb_task","url":"10.0.0.142:3306","userName":"lhotse"},"hiveColumnList":"broker_ip,task_id,task_type","hiveProperties":{"db":"project001","partitionKey":"c3","table":"fula"},"mapred_min_split_size":123,"metaStoreUris":"thrift://tbds-10-0-0-96:9083,thrift://tbds-10-0-0-49:9083","taskId":"201801213","transferModel":"append","warehouseDir":""}'
hive2db
/usr/hdp/2.2.0.0-2041/spark/bin/spark-submit --driver-class-path common-lib/mysql-connector-java-5.1.20.jar --jars common-lib/mysql-connector-java-5.1.20.jar --master yarn --deploy-mode cluster --queue root.workflow --class com.tbds.tencent.Hive2DBClient db2hiveCore-5.0-jar-with-dependencies.jar '{"curDateTime":"2019-01-04 16:11:32","dbColumnList":"broker_ip,task_id,task_type","dbProperties":{"dbName":"lhotse_open","dbType":"mysql","driver":"com.mysql.jdbc.Driver","fetchsize":"1000","fullTable":"lhotse_open.lb_task","password":"lhotse@Tbds.com","tableName":"lb_task","url":"10.0.0.142:3306","userName":"lhotse"},"hiveColumnList":"broker_ip,task_id,task_type","hiveProperties":{"db":"project001","partitionKey":"c3","table":"fula"},"mapred_min_split_size":123,"metaStoreUris":"thrift://tbds-10-0-0-96:9083,thrift://tbds-10-0-0-49:9083","taskId":"201801213","transferModel":"append","warehouseDir":""}'
功能 | Sqoop1 | DataX单机版 | spark |
---|---|---|---|
基础依赖 | JDK、Hadoop | JDK、Python | JDK、Hadoop、Spark |
数据源 | 有限 导入:RDBMS2HDFS、RDBMS2Hive、 RDBMS2HBase 导出:HDFS2RDBMS | 丰富、插件式 支持RDBMS、Hadoop生态、NoSQL存储、时间线序列、文件存储 、消息 之间相互同步 | 需要自己开发 |
并发控制 | 支持 | 支持 | 支持 |
限速 | 不支持 | 支持 | 不支持 |
脏数据收集 | 不支持 | 支持 | 不支持 |
同步Metrics (速率、进度)上报 | 不支持 | 支持 | 不支持 |
独立提供机器部署 | 不需要,EMR组件可直接选择 | 需要 | 不需要 |
同步效率 | 大数据量时可充分利用Hadoop集群优势 | 与部署DataX机器性能相关 | 大数据量时可充分利用Hadoop集群优势 |
对hadoop版本支持 | 支持度好 | 只支持特定hadoop版本 | spark 适配版本的hadoop |
l优点
(1)、对hadoop生态版本支持较好;
(2)、云EMR可快速集成Sqoop组件,Sqoop自身与EMR在一个网络环境,直接复用EMR集群机器,无需再提供额外机器;
l缺点
(1)、可以生产使用Sqoop1,依赖hadoop环境,目前仅支持命令行形式,需要解决如何将下发Sqoop任务问题;(部署 executor agent?)
(2)、支持的数据源种类有限,目前主要支持RDBMS到Hadoop生态中;
(3)、Sqoop组件部署在用户EMR中,扩展升级复杂;
l网络打通依赖
Sqoop和用户EMR在同一个VPC中,网络需要打通:另一端在同VPC则不需要打通;跨VPC,需要打通用户的两个VPC;
l优点
(1)、有丰富的异构数据源类型支持,扩展方便;
(2)、支持限速、脏数据、同步metrics的收集;
l缺点
(1)、支持有限的hadoop版本,需要再开发;
(2)、需要提供集群单独部署DataX,并运维,作为同步执行机器;
l网络打通依赖
场景:用户测提供执行机器,DataX部署在一端所在VPC(如EMR所在的VPC中 )(需要对TEG excutor进行大量改造)
网络需要打通:另一端在同VPC则不需要打通;跨VPC,需要打通用户的两个VPC;
l优点
(1)、复用已有Spark集群能力进行同步,用户只需提供少量执行机作为spark 客户端;
(2)、采用Spark集群能力进行同步在大数据量时同步效率有保障;
l缺点
(1)、用户必须要有hadoop集群,跑同步spark作业
(2)、每支持一种同步通道需要新开发;
原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。
如有侵权,请联系 cloudcommunity@tencent.com 删除。
原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。
如有侵权,请联系 cloudcommunity@tencent.com 删除。