问题反馈
什么是ETL
ETL,即Extract-Transform-Load的缩写,数据抽取、转换、装载的过程。ETL的目的是将企业中分散、零乱、标准不统一的数据整合到一起,为企业的决策提供分析依据。它是BI(商业智能)项目重要的一个环节,可以让大数据开发人员在业务中以更加简单的方式进行数据清洗、数据迁移等功能,以轻松满足业务实现的需求。
什么是Kettle
Kettle是一款国外开源的ETL工具,纯java编写,依赖于Java虚拟机,可以在Window、Linux、Unix等平台上运行,它允许你管理来自不同来源的数据(无论是数据库还是接口),并通过图形化界面简化用户的操作。
Kettle提供两种脚本文件,Transformation和Job。
Transformation是用来处理数据的转换,其通过一个个组件相连,按步骤(Step)处理,步骤之间用节点连接线相连(Hop),最终形成一个转换流程。
Job是一个调度,通常通过调度转换来实现转换的自动执行。
Kettle现在已经更名为PDI,即Pentaho Data Integration-Pentaho。
Kettle的结构
Spoon
Spoon是构建ETL Transformation和Job的工具,用户在浏览器(或者其他桌面工具)上通过Spoon以图形化的界面进行流程和任务的设计。下图即为Spoon的界面,除了本地运行外,也可以通过Tomcat以war包的形式进行部署(即WebSpoon),通过web的形式进行界面的访问。
Data Integration Server
Data Integration Server是一个专用的ETL Server,它主要有如下几个功能:
- 通过Pentaho Data Integration引擎执行由Spoon创建的作业或者转换;
- 提供了一个集中的资源库,用来管理ETL的作业和转换,资源库包含所有内容和特征的历史版本,可以避免作业和转换的丢失;
- 管理用户、角色以及系统集成的安全性;
- 为Spoon设计出的作业和转换提供时序和监控服务;
Kettle的核心组件
- Spoon:通过图形接口,用于编辑作业和转换的桌面应用;
- Pan:一个独立的运行命令程序,用于执行由Spoon编辑的转换和作业;
- Kitchen:一个独立的运行命令程序,用于执行由Spoon编辑的作业;
- Carte:一个轻量级的Web容器,用于建立专用、远程的ETL Server;
Kettle的概念模型
Kettle的执行分为两个层次:Job和Transformation,从上图可以看出,Job调用Transformation,Transformation起始于Step和Hop。
Transformation
Transformation(转换)是由一系列Step(步骤)和Hop(跳转连线)构成的,其本质是数据流的处理,文件的扩展名是.ktr。
Step
Step(步骤)是转换的基础模块,比如表输入、表输出、列转行等这些都是一个步骤。一个转换由多个步骤构成,步骤可以单独开发,如上图的自定义行转列便是作者独立开发而来,具体如何开发可以参考后面的Kettle自定义插件相关文章。
RowSet
RowSet的实现类,负责步骤之间的相互通信,rowset对象既是前一个step的成员也是后一个step的成员,访问是线程安全的。
RowSet类中包含源step,目标step和由源向目标发送的一个rowMeta和一组data。其中data数据是以行为单位的队列(queArray)。一个RowSet作为此源step的outputrowsets的一部分。同时作为目标step的inputRowsets一部分。源Step每次向队列中写一行数据,目标step每次从队列中读取一行数据。
行元数据
步骤与步骤之间以行为单位进行处理,自然需要知道每行的结构,即行元数据。行元数据至少需要包括类型、名称,当然还可能包括字段长度、精度等常见内容。
行元数据不仅在执行的时候需要,而且在转换设置的时候同样需要。每个步骤的行元数据都会保存在.ktr文件或者数据库里面,所以可以根据步骤名称从TransMeta对象中获取行元数据。
行元数据的UML类图结构如下所示,主要有单元格元数据组成行元数据。在现有的版本中,支持的数据类型有String、Date、BigNumber、Boolean、SerializableType、Binary、Integer、Numberic。
Hop
Hop(跳)是步骤之间带箭头的连线,数据的通道,用于连接两个步骤,使得元数据从一个步骤传递到另一个步骤。在上图所示的转换中,它像似顺序执行发生的,但事实并非如此。节点连接决定了贯穿在步骤之间的数据流,步骤之间的顺序不是转换执行的顺序。当执行一个转换时,每个步骤都以自己的线程启动,并不断的接受和推送数据。
在一个转换中,一个步骤可以有多个连接,数据流可以从一个步骤流到多个步骤。在Spoon中,hop就像是箭,它允许数据从一个步骤流向另一个步骤,同时也决定了数据流的方向和所经步骤。如果一个步骤的数据输出到了多个步骤,那么这个数据既可以是复制的,也可以是分发的。
注意:
- 所有的步骤是同步开启和运行的,所以步骤的初始化的顺序是不可知的。因此我们不能在第一个步骤中设置一个变量,然后在接下来的步骤中使用它。
- 当创建新Hop时,要记住Hop再转换里面时不能循环的,因为在转换里面每个步骤都依赖前一个步骤获取字段值。
Job
一个Job(作业)代表ETL控制流中的一项逻辑任务。Job项会顺序执行,每个Job项会产生一个结果,并且能够作为别的分支上Job项的条件。
作业按照一定的顺序完成,因为转换以并行方式执行的,就需要一个可以串行执行的作业来处理一系列按照顺序完成的操作。一个作业包括一个或者多个作业项,这些作业项以某种顺序来执行。作业执行顺序由作业项之间的跳(job hop)和每个作业项的执行结构来决定。如同转换,作业里面也可以包括注释。
作业项
作业项是作业的基本构成部分。如同转换的步骤,作业项也可以使用图标的方式图形化展示。作业项的注意点。新步骤的名字应该是唯一的,但是作业项可以有影子拷贝。这样可以把一个作业项放在不同的位置。这些影子拷贝里的信息都是相同的,编辑一份拷贝,其他拷贝也会随之修改。在作业项之间可以传递一个结果对象(result object)。这个结果对象里包含了数据行,它们不是以流的方式来传递的。而是等一个作业项执行完了,再传递给下一个作业项。默认情况下,所有的作业项都是以串行方式执行的,只是在特殊情况下,以并行方式执行。