Pentaho 数据集成工具——Kettle(一)

时间:2024-03-31 13:59:03

简介

 Pentaho是一个以工作流为核心的、强调面向解决方案的开源商业智能(Business Intelligence, BI)套件,以构成全面的数据集成和业务分析平台。这些套件各自为独立产品,之间为松耦合可插拔式设计,用户可根据自身需求进行灵活选择。Kettle是Pentaho整个产品体系中的数据集成模块,使用突破性的元数据驱动方法提供强大的“提取,转换和加载(ETL)”功能。主要使用在数据仓库环境下,同时还可以:在应用程序或数据库之间进行数据迁移、将数据从数据库中导出到文本文件中、将大量数据加载到数据库中、数据清理、应用程序集成等。作为最受欢迎的开源ETL工具,其支持大量的输入和输出格式,包括文本文件、数据表,以及各类商业或开源的数据库引擎。除此之外,Kettle还易于使用,用户可通过图形化界面定义任务或转换,无需编写代码。当然,Kettle支持用户使用脚本语言定义更加丰富的个性化功能。

Kettle组件

Kettle包含有ETL开发和部署流程设计的多个程序,每个程序都有各自的功能。如下图所示,为Kettle的主体框架图。

Pentaho 数据集成工具——Kettle(一)

Kettle框架图

  • Spoon:Kettle的可视化集成开发环境。提供一个图形化用户界面,用户可以以拖拽的方式创建、定义作业或转换。另外,Spoon还可以用于执行、调试用户定义的作业或转换,及时看到实际效果,以提升用户开发和测试效率。对于远程执行或集群模式,Spoon可以监控各个子节点的作业或转换执行情况。下图为Spoon的操作界面,其中有一个定义好的作业流。

Pentaho 数据集成工具——Kettle(一)

Spoon界面

  • Kitchen:服务器端作业的命令行运行程序,可通过Shell脚本调用,从而在服务器端启动用户定义的作业。在开发和测试调试阶段,作业和转换可以在图形化的Spoon中执行。但在实际运行环境中,Spoon就较少用到。在实际部署阶段,一般需要通过将命令行放入Shell脚本中,并定时调度此脚本进行执行。Kitchen和Pan命令行工具就用于此场景下,进行实际的部署使用;

  • Pan:服务器端转换的命令行运行程序,和Kitchen一样可通过Shell脚本来调用,从而在服务器端执行用户定义的转换;

  • Carte:轻量级的HTTP服务,在后台执行HTTP监听,以接收远程的作业,从而实现远程执行作业和转换。但是与Kitchen不同的是,Carte是一个一直在后台运行的服务,在后台某个端口来监听HTTP请求,而Kitchen是运行完一个作业后就退出。远程机器给Carte发送一个请求,在请求里包含了作业的定义。Carte收到请求后,对作业进行解析、执行。除了能够处理远程作业请求之外,Carte也能够处理对于本节点各种监控信息的请求。Carte的以上功能使得Kettle能够具备集群功能,集群可将单个工作或转换进行分割,在Carte服务器的多个节点上并行执行,从而最大化利用集群资源。

转换

转换(Transformation)是Kettle中最重要的部分,可以处理ETL整个流程:抽取、转换、加载,各阶段对数据的各种操作。下图是一个完整的转换任务。

Pentaho 数据集成工具——Kettle(一)

转换包括一个或多个步骤(Step),实现例如读取文件、数据清洗、数据加载等对于数据流的操作。步骤是转换里最基本的元素,并以图标形式图形化的展现。转换中包括各种不同功能的步骤。如上图所示,显示了四个步骤,分别有数据库查询、设置字段值、分组、输出到Hadoop文件系统的功能。每个步骤都需用户定义一个名字,这个名字在转换范围内要唯一。在Kettle中,数据的单位是行。除了“生成记录”步骤之外,每个步骤都会读、写数据行。步骤将数据写到与之相连的一个或多个输出跳(Outgoing Hops),从而传送给另一端的步骤。对于另一端的步骤来说,这个跳就是输入跳(Incoming Hops),步骤通过输入跳来接收数据。当一个步骤有多个输出跳时,数据可以被设置为轮流发送和复制发送。轮流发送时将数据行依次发给每一个输出跳,复制发送是将全部数据行发送给所有输出跳。在实际运行转换时,每个步骤或步骤的多份拷贝都由独自的线程来运行。所有步骤的线程几乎同时运行,并没有固定的先后顺序,因此可以认为转换中的步骤是并行执行的。数据行连续地通过跳来经过各个步骤,从而完成对于数据流的转换处理。除了以上这些通用功能,每种步骤都有各自的独特功能。

各个步骤之间的关联关系是通过跳(Hop)来连接,跳就是步骤之间带箭头的连线,从而定义了步骤之间的数据通路。实际上,跳是两个步骤之间被称为行集(Row Set)的数据行缓存(缓存大小可以设置)。当行集满时,向行集写入的步骤将停止写入。当行集空时,从行集读取数据的步骤停止读取,直到行集中又有新的数据行。当转换启动后,转换中所有的步骤都同时启动,从各自的输入跳中读取数据,并把处理过的数据行写到输出跳,直到输入跳里不再有数据就终止步骤的运行。当转换中所有的步骤都终止时,整个转换也就终止了。

在转换中,数据以行的形式进行流动,一个数据行其实就是一个或多个字段的集合。与数据库中表的字段类似,各个字段可以具有不同的名称与数据类型。

作业

转换中定义的是对数据流的各类操作,而作业中定义的就是控制流。在实际项目中,ETL工作都含有一些流程性的任务,这些任务具有一定的先后执行顺序以及条件判断。在Kettle中,作业用来应对此类场景。与转换以并行方式执行各个步骤不同,作业是以串行的方式来执行。如下图所示,为一个完整的作业流。一个作业包括一个或多个作业项,作业项之间用跳(Job Hop)来连接。作业的执行顺序由跳,以及每个作业项的执行结果来决定,用户可以自定义。

Pentaho 数据集成工具——Kettle(一)

针对作业项的执行结果,作业跳有以下情形:

  • 无条件执行,无论上一个作业项执行成功与否,下一个作业都会执行,如上图,为其中黑色带锁的连接线;

  • 当运行结果为真时执行,当上一个作业项执行成功时,才执行下一个作业项,如上图,为其中绿色带对号的连接线;

  • 当运行结果为假时执行,当上一个作业项执行失败时,执行下一个作业项,如上图,为其中红色带叉号的连接线。

如同转换的步骤,作业中的作业项也使用图标的方式进行图形化展示。用户可以复制出作业项的多个影子拷贝,影子拷贝的配置信息都是一样的,编辑一份拷贝其它拷贝也会随之修改。与转换不同,作业中作业项之间并不是数据流的传递。作业项之间可传递一个结果对象(Result Object),从而来实现相互之间的数据传递。结果对象类似于数据库中的一张表,其中包含字段与数据集。默认情况下,作业项之间是以串行的方式执行,需等一个作业项完全执行结束,才将结果对象传递给下一个作业项执行。

因为作业是可以相互嵌套的,一个作业可以作为另外一个作业的作业项,因此作业也要同作业项一样有运行结果。一个作业的运行结果来自于它最后一个执行的作业项。

多线程

Pentaho 数据集成工具——Kettle(一)

通过设置步骤的“改变开始复制的数量”属性,可实现步骤的多线程执行。如上图所示,为“字符串替换”步骤设置“改变开始复制的数量”属性为5,从而实现此步骤5个线程并发执行的效果,从而提升数据处理效率。前一个步骤通过轮询的方式将数据流按照行,分别发送给后面的步骤处理线程。

Pentaho 数据集成工具——Kettle(一)

作业中的作业项也可以实现并行执行。如上图所示,作业项【转换,Shell】和【转换2,SQL】是分别在两个线程中并行执行的。

结束语

本文介绍了开源ETL工具Kettle,其作为开源商业智能Pentaho产品体系中的数据集成模块,能够灵活高效应对各类ETL应用场景。Kettle是一个非常强大的工具,本文对其基本的概念和使用方式进行了介绍。后续还将介绍Kettle的集群模式,并给出一个实际的应用案例,从而方便大家更好的理解。