0x00 前言
在上篇,我们介绍过,ETL 的实现方式可以分为三种类型:完全依赖数据库、自研、第三方 ETL 工具。
我们需要根据实际情况去选择合适的方案。对于相对简单的 ETL 系统我们可以完全依赖数据库或者内部开发一个小型的的流程控制、调度工具去实现,但是对于大多数的数据仓库项目,从数据源到最终数据应用,至少也有大几十上百甚至几百个 ETL 过程(节点),这些过程之间的依赖关系、系统监控、出错处理以及恢复的流程处理,完全依靠 shell 或者程序开发难度极大。ETL 工具的出现通常会提供一套可视化的界面去完成集成、计算、流程依赖甚至调度,这极大的简化开发和运维。
ETL 是数据仓库的重要组成部分,但 ETL 也可以独立存在的。本篇我会集中起来给大家介绍一些常用的 ETL 工具或者类 ETL 的集成、同步、计算、流程控制工具。
如果全部写完篇幅过长可能会有近两万字了。
因此特意拆分为两到三篇:
-
上篇,主要介绍五种传统 ETL 工具和八种数据同步集成工具。
-
下篇,主要介绍两种新型 ETL 工具和大数据发展不同阶段产生的六种主要计算引擎。
-
篇幅不允许的话会单独分出来第三篇,介绍五种流程控制组件,最后再给大家介绍下如何快速将工具引入生产实践。
0x01 传统 ETL 工具
DataStage
IBM WebSphere DataStage(下面简称 DataStage )是一套专门对多种操作数据源的数据抽取、转换和维护过程进行简化和自动化,并将其输入数据集市或数据仓库目标数据库的集成工具,可以从多个不同的业务系统中,从多个平台的数据源中抽取数据,完成转换和清洗,装载到各种系统里面。其中每步都可以在图形化工具里完成,同样可以灵活地被外部系统调度,提供专门的设计工具来设计转换规则和清洗规则等,实现了增量抽取、任务调度等多种复杂而实用的功能。其中简单的数据转换可以通过在界面上拖拉操作和调用一些 DataStage 预定义转换函数来实现,复杂转换可以通过编写脚本或结合其他语言的扩展来实现,并且 DataStage 提供调试环境,可以极大提高开发和调试抽取、转换程序的效率。
Datastage 操作界面
-
对元数据的支持:Datastage 是自己管理 Metadata,不依赖任何数据库。
-
参数控制:Datastage 可以对每个 job 设定参数,并且可以 job 内部引用这个参数名。
-
数据质量:Datastage 有配套用的 ProfileStage 和 QualityStage 保证数据质量。
-
定制开发:提供抽取、转换插件的定制,Datastage 内嵌一种类 BASIC 语言,可以写一段批处理程序来增加灵活性。
-
修改维护:提供图形化界面。这样的好处是直观、傻瓜式的;不好的地方就是改动还是比较费事(特别是批量化的修改)。
Datastage 包含四大部件:Administrator、Manager、Designer、Director。
-
用 DataStage Administrator 新建或者删除项目,设置项目的公共属性,比如权限。
-
用 DataStage Designer 连接到指定的项目上进行 Job 的设计;
-
用 DataStage Director 负责 Job 的运行,监控等。例如设置设计好的 Job 的调度时间。
-
用 DataStage Manager 进行 Job 的备份等 Job 的管理工作。
Informatica
Informatica PowerCenter 用于访问和集成几乎任何业务系统、任何格式的数据,它可以按任意速度在企业内交付数据,具有高性能、高可扩展性、高可用性的特点。它提供了一个可视化的、拥有丰富转换库的设计工具,这个转换库使数据转换变成一个简单的“拖拽”过程,用户不需在组件时编写脚本语言。可以通过简单的操作,完成需求。使用 PowerCenter,转换组件能够被合并到 mapping 对象中,独立于他们的数据源和目标,有近 20 种数据转换组件和近百个函数可以调用,同时可以调用外部的过程和程序,实现复杂的转化逻辑。
Informatica 操作界面
-
对元数据的支持:元数据相对开放,存放在关系数据中,可以很容易被访问。
-
参数控制:参数放在一个参数文件中,理论上的确可以灵活控制参数,但这个灵活性需要用户自己更新文件中的参数值(例如日期更新)。另外,Powercenter 不能在 mapping 或 session 中引用参数名。
-
数据质量:专门有一个产品 Informatica Data Quality 来保证数据质量。
-
定制开发:没有内嵌类 BASIC 语言,参数值需人为更新,且不能引用参数名。
-
修改维护:与 Datastage 相同,Powercenter 也提供图形化界面。这样的好处是直观、傻瓜式的;不好的地方就是改动还是比较费事。
Informatica 的开发分为六个步骤:
-
定义源,就是定义我们源头数据在哪里。配置数据链接,比如 IP 账号密码等信息。
-
定义目标,就是我们准备把数据放到哪里。这个是我们事先定义的数据仓库。
-
创建映射,就是我们的元数据和目标数据的映射关系。
-
定义任务,就是我们每个表的转换过程,可以同时处理多个表。
-
创建工作流,将任务按照一定的顺序进行组合。
-
工作流调度和监控,定时、自动或者手动方式触发工作流。
有兴趣更详细了解的可以参考这篇文章:
https://blog.csdn.net/water_0815/article/details/76512470
Kettle
Pentaho Data Integration,是一款国外免费开源的、可视化的、功能强大的 ETL 工具。由于其开源、免费、跨平台、资料文档丰富等特点获得了一大批忠实粉丝。
Kettle 六大特点:
-
免费开源:基于 Java 免费开源软件。
-
易配置:可跨平台,绿色无需安装。
-
不同数据库:ETL 工具集,可管理不同数据库的数据。
-
两种脚本文件:transformation 和 job。transformation 完成针对数据的基础转换,job 则完成整个工作流的控制。
-
图形界面设计:托拉拽,无需写代码。
-
定时功能:在 Job 下的 start 模块,有一个定时功能,可以每日,每周等方式进行定时。
Kettle 操作界面
Kettle 的执行分为两个层次:Job 和 Transformation。这两个层次的最主要的区别在于数据的传递和运行方式。
-
Transformation:定义对数据操作的容器,数据操作就是数据从输入到输出的一个过程,可以理解为比 Job 粒度更小一级的容器,我们将任务分解成 Job,然后需要将 Job 分解成一个或多个Transformation,每个 Transformation 只完成一部分工作。
-
Step:是 Transformation 内部的最小单元,每一个 Step 完成一个特定的功能。
-
Job:负责将 Transformation 组织在一起进而完成某一工作,通常我们需要把一个大的任务分解成几个逻辑上隔离的Job,当这几个 Job 都完成了,也就说明这项任务完成了。
-
Job Entry:Job Entry 是 Job 内部的执行单元,每一个 Job Entry 用于实现特定的功能,如:验证表是否存在,发送邮件等。可以通过 Job 来执行另一个 Job 或者 Transformation,也就是说 Transformation 和 Job 都可以作为Job Entry。
-
Hop:用于在 Transformation 中连接 Step,或者在 Job 中连接 Job Entry,是一个数据流的图形化表示。
在Kettle 中Job 的JobEntry是串行执行的,故Job中必须有一个Start的JobEntry;Transformation 中的 Step 是并行执行的。
Kettle 也提供了丰富的组件,主要分为十大类:脚本组件、映射组件、统计组件、连接组件、查询组件、流程组件、应用组件、转换组件、输出组件、输入组件。
有兴趣更详细了解的可以参考 Kettle 官方文档,很详细的:
https://www.kettle.net.cn/category/base
ODI、Data Service
ODI(Oracle Data Integrator)是 Oracle 公司提供的一种数据集成工具,能高效地实现批量数据的抽取、转换和加载。ODI 可以实现当今大多数的主流关系型数据库(Oracle、DB2、SQL Server、MySQL、SyBase)的集成。
ODI 提供了图形化客户端和 Agent(代理)运行程序。客户端软件主要用于对整个数据集成服务的设计,包括创建对数据源的连接架构、创建模型及反向表结构、创建接口、生成方案和计划等。Agent 运行程序是通过命令行方式在 ODI 服务器上启动的服务,对 Agent 下的执行计划周期性地执行。
ODI 的常见应用场景:
-
数据仓库:比如 ETL 阶段。
-
数据迁移:比如将某一源系统的数据迁移到新系统中。
-
数据集成:比如两个系统间高效的点到点数据传递。
-
数据复制:比如将一个 Instance 的数据复制另外一个 Instance 中。
SAP Data Services 软件能够提高整个企业的数据质量。利用出色的数据整合、数据质量管理和数据清理功能,你能够从企业的所有结构化和非结构化数据中挖掘价值;将数据转化为随时可用的可靠资源,从中获取业务洞察,并利用这些洞察简化流程提高效率。
传统数仓时代,DataStage 和 Informatica 占据了绝大多数市场份额,Kettle 在中小型 ETL 应用场景上也有广泛应用,ODI 和 DS 等 ETL 工具反而使用的不多。
虽然这些传统 ETL 工具曾经风靡全球,是经过生产检验的,并且产品化程度极高,但都面临着云时代的巨大冲击,以前不想拥抱不拥抱云,现状只能拥抱空气了。这些当时的巨头如今市场规模越来越小,除去非常传统老旧的项目,新的项目已经很少使用了,只有开源、云、SAAS 模式才是出路。
0x02 集成同步组件
Sqoop、DataX
Sqoop,SQL-to-Hadoop 即 “SQL到Hadoop 和 Hadoop 到 SQL ”。是 Apache 开源的一款在 Hadoop 和关系数据库服务器之间传输数据的工具。主要用于在 Hadoop 与关系型数据库之间进行数据转移,可以将一个关系型数据库( MySQL ,Oracle 等)中的数据导入到 Hadoop 的 HDFS 中,也可以将 HDFS 的数据导出到关系型数据库中。
Sqoop 的工作机制:
Sqoop 命令的本质是转化为 MapReduce 程序。Sqoop 分为导入(import)和导出(export),策略分为 table 和 query ,模式分为增量和全量。
Sqoop 的优点:
-
可以高效、可控的利用资源,可以通过调整任务数来控制任务的并发度。
-
可以自动的完成数据映射和转换。由于导入数据库是有类型的,它可以自动根据数据库中的类型转换到 Hadoop 中,当然用户也可以自定义它们之间的映射关系
-
支持多种数据库,如 Mysql,Orcale 等数据库
DataX 是阿里巴巴集团内被广泛使用的离线数据同步工具/平台,实现包括 MySQL、Oracle、SqlServer、Postgre、HDFS、Hive、ADS、HBase、TableStore(OTS)、MaxCompute(ODPS)、DRDS 等各种异构数据源之间高效的数据同步功能。
开源地址:https://github.com/alibaba/DataX
数据交换通过 DataX 进行中转,任何数据源只要和 DataX 连接上即可以和已实现的任意数据源同步。
核心组件:
-
Reader:数据采集模块,负责从源采集数据
-
Writer:数据写入模块,负责写入目标库
-
Framework:数据传输通道,负责处理数据缓冲等
从一个 JOB 来理解 Datax 的核心模块组件:
-
DataX 完成单个数据同步的作业,称为 Job,Job 会负责数据清理、任务切分等工作;
-
任务启动后,Job 会根据不同源的切分策略,切分成多个 Task 并发执行,Task 就是执行作业的最小单元
-
切分完成后,根据 Scheduler 模块,将 Task 组合成 TaskGroup ,每个 group 负责一定的并发和分配 Task
DataX 优点
-
可靠的数据质量监控:让数据可以完整无损的传输到目的端。
-
丰富的数据转换功能
-
精准的速度控制:新版本 DataX3.0 提供了包括通道(并发)、记录流、字节流三种流控模式,可以随意控制你的作业速度,让你的作业在库可以承受的范围内达到最佳的同步速度。
-
强劲的同步性能:每一种读插件都有一种或多种切分策略,都能将作业合理切分成多个 Task 并行执行,单机多线程执行模型可以让 DataX 速度随并发成线性增长。
-
健壮的容错机制:多层次局部/全局的重试。
-
极简的使用体验:下载即可用、详细的日志信息。
Sqoop 和 DataX 都是非常流行的来源大数据离线同步工具,相比传统 ETL 工具易用性肯定会差很多(传统工具基本都能实现零代码开发纯图形界面操作),但由于天然具备的大数据处理能力而迅速得到普及。
DataX 面世晚了许多,所以拥有比 Sqoop 更多、更全、更强的功能,从而被广泛接受和使用。Sqoop 是 Hadoop 生态系统的重要一员问世比较早了,由于功能简单稳定成熟,甚至今年05月06日 Apache 董事会宣布终止 Apache Sqoop 项目。当然这里的中止并非不让用了,只是不在维护更新代码了,当然再次之前 Sqoop 代码已经三年没有更新了。
Flume、Canal
Flume 是 Cloudera 提供的一个高可用的,高可靠的,分布式的海量日志采集、聚合和传输的系统,Flume 支持在日志系统中定制各类数据发送方,用于收集数据;同时,Flume 提供对数据进行简单处理,并写到各种数据接受方(可定制)的能力。
当前 Flume 有两个版本 Flume 0.9X 版本的统称 Flume-og,Flume1.X 版本的统称 Flume-ng。由于 Flume-ng 经过重大重构,与 Flume-og 有很大不同,使用时请注意区分。
提示 官方这个图的 Agent4 的 Sink 画错了,不应该是 Avro Sink ,应该是 HDFS Sink 。
上图是 Flume 设置多级 Agent 连接的方式传输 Event 数据。也支持扇入和扇出的部署方式,类似于负载均衡方式或多点同时备份的方式。
Flume 工作的机制:
-
Flume-og 采用了多Master的方式。为了保证配置数据的一致性,Flume 引入了 ZooKeeper,用于保存配置数据,ZooKeeper 本身可保证配置数据的一致性和高可用,另外,在配置数据发生变化时,ZooKeeper 可以通知 Flume Master 节点。Flume Master 使用 gossip 协议同步数据。
-
Flume-ng最明显的改动就是取消了集中管理配置的 Master 和 Zookeeper,变为一个纯粹的传输工具。Flume-ng 另一个主要的不同点是读入数据和写出数据由不同的工作线程处理(称为 Runner)。在 Flume-og 中,读入线程同样做写出工作(除了故障重试)。如果写出慢的话(不是完全失败),它将阻塞 Flume 接收数据的能力。这种异步的设计使读入线程可以顺畅的工作而无需关注下游的任何问题。
Flume 优势:
-
Flume可以将应用产生的数据存储到任何集中存储器中,比如 HDFS、HBase。
-
当收集数据的速度超过将写入数据的时候,也就是当收集信息遇到峰值时,这时候收集的信息非常大,甚至超过了系统的写入数据能力,这时候, Flume 会在数据生产者和数据收容器间做出调整,保证其能够在两者之间提供平稳的数据。
-
提供上下文路由特征。
-
Flume 的管道是基于事务,保证了数据在传送和接收时的一致性。
-
Flume 是可靠的,容错性高的,可升级的,易管理的,并且可定制的。
Canal 是阿里巴巴旗下的一款开源项目,纯 Java 开发。基于数据库增量日志解析,提供增量数据实时订阅和消费,目前主要支持了 MySQL,也支持 mariaDB。
很多大型的互联网项目生产环境中使用,包括阿里、美团等都有广泛的应用,是一个非常成熟的数据库同步方案,基础的使用只需要进行简单的配置即可。
github 地址:https://github.com/alibaba/canal
当前的 Canal 支持源端 MySQL 版本包括 5.1.x , 5.5.x , 5.6.x , 5.7.x , 8.0.x
Canal 是通过模拟成为 MySQL的 slave 的方式,监听 mysql 的 binlog 日志来获取数据,binlog 设置为 row 模式以后,不仅能获取到执行的每一个增删改的脚本,同时还能获取到修改前和修改后的数据,基于这个特性,Canal 就能高性能的获取到 MySQL 数据数据的变更。
Flume 和 Canal 都是适用于特定场景下的大数据同步组件,通常用于实时数据处理场景:
-
Flume 主要用于将日志文件实时同步到 Kafka 或 HDFS,供下游消费。
-
Cannal 主要是解析 Mysql binlog 日志,在不影响业务的前提下将数据实时同步到 Kafka。
DTS、GoldenGate
DTS(Data Transmission Service)是阿里云提供的一种数据传输服务,功能非常强大。支持 RDBMS、NoSQL、OLAP、Kafka 等各种数据源间的数据交互,集数据同步、迁移、订阅、集成、加工于一体,助您构建安全、可扩展、高可用的数据架构。
Oracle GoldenGate 软件提供了一个单一的平台,这个平台可以为任何企业环境实现秒一级的灾难备份。GoldenGate 是一种基于日志的结构化数据复制方式,它通过解析源数据库在线日志或归档日志获得数据的增删改变化(数据量只有日志的四分之一左右),再将这些变化应用到目标数据库,实现源数据库与目标数据库同步、双活。
DTS 和 GoldenGate 不同时期诞生两款收费的数据同步工具或服务,都能够实现异构数据间的实时同步。
ColdenGate 诞生于传统数仓时期,后来被 Oracle收购了以闭源软件工具的形式售卖,通常在关系型数据库间实现实时同步。DTS 诞生于阿里云,以一种 SAAS 服务的形式对外售卖,支持目前市面上几乎所有的数据源之间的实时同步,可以完全替代 Cannal。
ColdenGate 主要提供的是后台功能好像没有前端页面,但 DTS 跟现在大多数付费版的大数据组件一样提供一套 web 版本的操作和进度查看页面。
Maxwell、DSG
这两个数据同步工具我也没听过,只是群友们有提到过,这里列出来也给大家个参考。
Maxwell 是一个能实时读取 MySQL 二进制日志 binlog,并生成 JSON 格式的消息,作为生产者发送给 Kafka,Kinesis、RabbitMQ、Redis、Google Cloud Pub/Sub、文件或其它平台的应用程序。
常见应用场景: ETL、维护缓存、收集表级别的 dml 指标、增量到搜索引擎、数据分区迁移、切库 binlog 回滚方案等。
官网:http://maxwells-daemon.io
GitHub 地址:https://github.com/zendesk/maxwell
Maxwell 主要提供了下列功能:
-
支持 SELECT * FROM table 的方式进行全量数据初始化
-
支持在主库发生 failover 后,自动恢复 binlog 位置(GTID)
-
可以对数据进行分区,解决数据倾斜问题,发送到 kafka 的数据支持 database、table、column 等级别的数据分区
-
工作方式是伪装为 Slave,接收 binlog events,然后根据 schemas 信息拼装,可以接受 ddl、xid、row 等各种 event
除了Maxwell外,目前常用的MySQL Binlog解析工具主要有阿里的 Canal、mysql_streamer 。
DSG-RealSync Oracle 数据库同步复制及容灾技术。与传统的数据复制技术不同,DSG RealSync 技术是针对数据库提供了基于逻辑的交易复制方式。该方式通过直接捕获源数据库的交易,将数据库的改变逻辑复制到目标系统数据库中,实现源系统和目标系统数据的一致性。
该技术在复制上存在以下几个特点:
-
按需复制:查询和统计系统往往不需要所有的原始数据,因此完全可以按需要复制数据。RealSync 系统支持对指定信息的按需复制,减少存储和网络带宽的成本。
-
多种同步模式:实时复制、定时复制、手工复制
-
对生产系统的低干扰性:DSG 实时数据复制技术不需要通过任何数据库的引擎来获取变更数据,而是通过数据库自身的信息获取源系统上的改变并传送给目的系统,不会对生产系统造成性能影响。
-
系统异构可提供更多的优化空间:源数据库系统和目的数据库系统的可异构,主要包括索引规则和存储参数(如数据块大小、回滚段等)。因此可以在目标数据库上根据业务特点进行调整和优化,完全不受源系统的限制。
-
支持的多种复制策略:RealSync 可以被灵活配置,以支持各种复制策略,支持各种增值应用,如:一对一单向复制;一对多复制;多对一复制等。
有兴趣了解的可以参考这篇文章:
https://www.cnblogs.com/oracle-dsg/archive/2010/05/27/1745477.html
但说实话,大清早亡了,开源技术那么多,我们不见得非要使用这些古老的技术组件了。