Kettle介绍与部署
# Kettle介绍
# Kettle简介
Kettle是一款开源的、跨平台的、Java开发的ETL工具,现在已经更名为PDI(Pentaho Data Integration-Pentaho, 数据集成)。
Pentaho是一款企业级的商业智能(Business Intelligence,BI)软件套件,而Kettle(PDI)就是Pentaho公司旗下的一款知名开源数据集成工具。
ETL工具用于对数据进行ETL(Extract-Transform-Load, 抽取、转换、装载),也就是我们经常遇到的各种数据的处理,转换,迁移。
Kettle的中文名称叫水壶,该项目的开发者希望把各种数据放到一个壶里,然后以一种指定的格式流出,它能帮助我们将不同来源的数据进行集成,从而实现数据仓库、数据集市等数据管理方案。
它还提供了一系列的图形化工具,可以通过拖拽等方式来定义数据抽取、转换和加载的流程。用户可以使用这些工具,将不同来源的数据进行清洗、转换、合并等操作,然后将处理后的数据存储到目标数据库或文件中。此外,Kettle还提供一些插件,使支持更多的数据源和数据目的地,例如支持Hadoop、NoSQL。
除了常规的数据集成任务,Kettle还可以用于数据质量管理、实时数据流处理等方面。总的来说,Kettle是一款功能强大的数据集成工具,可以帮助用户快速、高效地处理不同来源的数据。
# Kettle核心组件
勺子 - spoon.bat|sh
- 它是一个图形化界面,用于提供图形化界面供我们管理转化和作业。
煎锅 - pan.bat|sh
- 它是一个转换执行引擎,可以让我们以命令行命令的方式执行已经定义的Transformation(转换)。
厨房 - kitchen.bat|sh
- 它是一个作业执行引擎,可以让我们以命令行命令的方式执行已经定义的Job(作业)。
菜单 - carte.bat|sh
- Carte是一个轻量级的Web容器,用于建立专用、远程的ETL Server。
# Kettle的特点
- 免费开源
- 基于java的免费开源的软件,对商业用户也没有限制。
- 易配置
- 可以在Window、Linux、Unix上运行,绿色无需安装,数据抽取高效稳定。
- 不同数据库
- ETL工具集,它允许你管理来自不同数据库的数据。
- 两者脚本文件
- transformation和job,transformation完成针对数据的基础转换,job则完成整个工作流的控制。
- 图形界面设计
- 通过图形界面设计实现做什么业务,无需写代码去实现。
- 定时功能
- 在Job下的start模块,有一个定时功能,可以每日,每周等方式进行定时。
# Kettle核心概念
# VPL (可视化编程)
Kettle可以被归类为可视化编程语言(Visula Programming Languages,VPL),因为Kettle可以使用图形化的方式定义复杂的ETL程序和工作流。
可视化编程通过隐藏大量技术细节,让我们能够快速的构建复杂的ETL作业,同时减少我们的维护工作量。Kettle的可视化编程提供了一种方便快捷的方式来构建ETL解决方案,尤其适用于那些没有编程经验或不想使用编程语言的用户。
# Repository (资源库)
在Kettle中,Repository是指一个中央资源存储库,它会将资源数据存储在指定数据库中,用于管理Kettle的元数据,包括作业、转换、数据库连接、共享文件等。且Repository还提供多用户协作和版本控制的支持,用户可以在其中共享、组织和管理Kettle的元数据,实现数据集成和数据处理的协同工作。
它支持多个用户同时使用和编辑元数据对象,以及对元数据对象的版本控制和管理。用户可以通过Repository Explorer界面进行操作,也可以通过API进行编程访问。
Kettle的Repository提供了多种类型的元数据对象,每个对象都可以被创建、编辑、删除和版本控制,包括:作业、转换、数据库连接、共享文件。
在Kettle中,用户可以创建和配置不同类型的数据库连接,包括关系型数据库、NoSQL数据库和文件系统等。这些数据库连接可以在Repository中被统一管理和共享。
在Kettle中,用户可以创建和编辑多种类型的共享文件,包括参数文件、配置文件、文本文件和二进制文件等。这些共享文件可以在Repository中被统一管理和共享。
# Transformation (转换)
Transformation对象主要用于对数据进行基础转换,它通常用于完成数据的抽取、转换和加载(ETL)任务。
Transformation是由多个步骤组成的流程,而步骤之间通过跳(Hop)来连接,用于完成数据的抽取、转换和加载(ETL)任务。
Transformation是由多个**步骤(Step)**组成的,每个步骤都代表一个数据处理操作。例如数据输入、数据清洗、数据转换、数据输出等操作。
用户可以通过拖拉拽等方式来设计Transformation的流程,来将数据从一个步骤传递到另一个步骤,以完成复杂的数据转换任务。例如从数据仓库中抽取数据,清洗和转换后将数据导入到另一个数据库中。
转换是数据流,它会以并行的方式先将所有步骤一次性全启动,一个步骤对应一个线程。然后再让数据从第一个步骤开始,一条记录、一条记录的流向最后的步骤。
# Step (步骤)
Step是Transformation中最小的可操作单元,代表一个数据处理操作。
Step可以执行某个具体的数据处理任务,例如数据过滤、字段映射、数据排序等。
多个Step之间可以通过**跳(Hop)**来按照一定的顺序串联在一起,形成一个完整的数据转换流程,通过组合不同的Step,可以构建出复杂的数据处理流程,完成各种数据过滤、排序、合并、分裂、聚合、校验等任务。
在Kettle中内置了许多常用的Step,同时也支持用户自定义Step,常见的Step类型有如下:
- 输入步骤:从外部数据源中读取数据,例如文本文件、数据库、XML文件等。
- 输出步骤:将处理后的数据输出到目标数据源中,例如文本文件、数据库、XML文件等。
- 转换步骤:执行数据的转换、清洗、过滤等操作。
- 聚合步骤:根据某些条件对数据进行分组并进行聚合计算,例如求和、平均值等。
- 排序步骤:按照指定的排序规则对数据进行排序。
- 数据校验步骤:对数据进行验证,确保数据符合某些特定的规则或格式。
Step的关键特性:
每个Step都有一个名称,且该名称在同一转换内不能出现重复。
每个Step之间需要通过**跳(Hop)**进行连接,运行时才会正常的由一个步骤到下一个步骤。
Step通常具有输入和输出端口。输入端口用于接收上一个Step处理后的数据。输出端口用于将当前Step处理后的数据传递给下一个Step。
大多数的Step可以有多个输出连接,输出连接分为分发和复制。分发是将多条数据以轮询的方式发送到多个目标步骤。复制是将多条数据直接一起完整的发送到多个目标步骤。
# Job (作业)
Job对象主要用于任务调度,对整个工作流进行控制。它由多个作业条目(Job Entry)组成的,每个作业条目都代表一个任务,例如执行一个Transformation、执行一个Shell脚本、发送一封电子邮件等。一个Job实际就是一组被组织成工作流的任务集合。
用户可以通过拖拉拽等方式来设计Job的流程,通过组合不同的步骤和连接,可以构建出复杂的数据处理流程,使数据的抽取、转换和加载变得更加简单和高效。Job通常用于调度和管理多个转换或其他任务,例如在每天晚上定时执行ETL任务等。
作业是步骤流,他会以串行的方式顺序执行每个步骤,从而完成整个工作流程,因为作业顺序执行作业项,所以必须定义一个起点。
Job 中的步骤代表了一个特定的任务条目或转换。
在Kettle中,Job还支持基于时间的触发器,可以按照预定的时间间隔或者特定的时间执行。定时器可以通过配置Job属性进行设置,以满足不同的调度需求。
# Job Entry (作业条目)
Job Entry是Job中最小的可操作单元,可以用于执行各种任务,例如调用转换、发送电子邮件、执行Shell脚本等。通过使用Job Entry,我们可以非常方便地构建和管理复杂的工作流程,实现自动化的数据处理和集成。
Kettle提供了许多不同类型的Job Entry,每种类型都可以执行不同的任务。常见的Job Entry类型有如下:
- 转换任务:调用一个或多个转换执行特定的任务。
- Shell脚本任务:执行一个系统Shell脚本。
- 电子邮件任务:发送电子邮件。
- HTTP调用任务:向指定的URL发送HTTP请求。
- 延迟任务:等待指定的时间,然后继续执行Job的下一个步骤。
Job Entry可以通过简单的拖放方式来进行增删和配置。当Job运行时,它会按照定义的顺序依次执行Job中的每个Job Entry。如果某个Job Entry执行失败,Job可以通过配置自动执行其他的Job Entry或者终止Job的执行。
# Transformation Hop (转换连接|跳)
Hop是指连接两个Step的箭头连接线,它描述了数据流转的方向和方式,提供了一个灵活而强大的方式来管理数据流和控制任务执行的流程。
Hop通常从输出步骤(source step)指向输入步骤(target step),这意味着输出步骤的数据会流向输入步骤。
Hop还可以被分为三种不同的类型:未分配、成功、失败。
未分配Hop是在连接两个步骤之间创建的默认类型,表示两个步骤之间的连接还未被分配任何条件。
成功Hop表示数据流在Step中执行正常时的流向路径。
而失败Hop则表示数据流在Step中执行异常时的流向路径。
在创建Hop时,我们可以为其设置一些条件,以控制数据流的转换。例如:可以通过设置表达式来对Hop进行过滤,只允许符合某些条件的数据流经过该Hop。
# Job Hop (作业连接|跳)
Hop还被用于描述Job的执行步骤,作业跳是作业项之间的连接线,他定义了作业的执行路径。
作业跳一共分为下面三种情况 (在跳的图标上单击就可以对跳进行设置):
无条件执行:不论上一个作业项执行成功还是失败,下一个作业项都会执行。这是一种蓝色的连接线,上面有一个锁的图标。
当运行结果为真时执行:当上一个作业项的执行结果为真时,执行下一个作业项。通常在需要无错误执行的情况下使用。这是一种绿色的连接线,上面有一个对钩号的图标。
当运行结果为假时执行:当上一个作业项的执行结果为假或者没有成功执行时,执行下一个作业项。这是一种红色的连接线,上面有一个红色的停止图标。
# Parameters (参数)
Parameters是用来在作业或转换执行过程中传递值的一种机制。它可以让你在作业和转换中定义变量,使你的作业或转换更加灵活、可重用。
一旦定义了参数,你可以在作业或转换中的任何地方引用它们。参数可以在脚本中使用、在表达式中使用或者作为步骤配置的参数使用。
使用参数的好处之一是,它们使作业或转换更加灵活和可重用。如果你需要在多个作业或转换中使用相同的值,你只需要定义一个参数,并在需要的地方引用它即可。此外,参数还可以通过命令行传递,这使得你可以在不同的环境中轻松地重新使用作业或转换,而无需每次手动更改变量的值。
可以使用以下方法定义参数:
- 定义全局参数:菜单栏中 -> 编辑 -> 设置环境变量。
- 在作业或转换中定义局部参数:菜单栏中 -> 编辑 -> 设置 -> 命名参数。
# Metadata (元数据)
元数据用于描述数据的属性和结构,每个步骤在输出数据行时都有对字段的描述,这种描述就是数据行的元数据。
Kettle中的元数据定义了数据源的结构信息,例如数据库中的表结构、文件中的字段信息等。通过定义元数据,可以让Kettle自动地创建出与数据源相对应的数据流、表等,以简化ETL的过程。
常用的元数据有如下:
- 字段名称:在同一步骤中的字段名需要唯一。
- 数据类型:字段的数据类型。
- 长度:数据类型的最大长度。
- 精度:BigNumber数据类型的十进制精度。
- 货币符号:¥等
- 小数点符号:十进制数据的小数点格式,一般是点或逗号。
- 分组符号:数值类型数据的分组符号,一般是点、逗号、单引号。
- 格式:数据显示的格式,如数值的1.00、1.000等。
元数据的定义方式有如下:
数据库表定义:Kettle可以直接连接到数据库,读取表结构信息,并将其转化为元数据,然后用于数据转换和加载。
文件定义:Kettle可以读取常见的文件格式(例如CSV、Excel、XML等),并将其转化为元数据。
手动定义:用户可以手动定义元数据,包括字段名称、数据类型、长度、格式等信息。手动定义元数据可以让用户在不同数据源之间灵活地转换和加载数据。
元数据的使用场景有如下:
在输入步骤中,可以使用元数据来解析输入的数据。
在输出步骤中,可以使用元数据来确定输出的数据结构。
在转换任务中,可以使用元数据来定义数据流。
在Job任务中,可以使用元数据来定义任务执行的参数。
# Data Type (数据类型)
数据类型主要用于定义字段和列中存储的数据的种类。Kettle中每个字段都必须具有数据类型,以便能够正确地进行数据转换和处理。另外Kettle还支持自定义数据类型,用户可以根据自己的需求创建自定义的数据类型,并将其应用于字段和列中。
Kettle中支持的数据类型如下:
- 字符串类型 (String):可以存储文本数据,例如存储名称、地址、描述等。
- 有符号整数类型 (Integer):可以存储整数值。
- 双精度浮点数类型 (Number):可以存储双精度浮点数值。
- 自定义精度浮点数类型 (BigNumber):可以存储任意精度浮点数值。
- 布尔类型 (Boolean):可以存储True/False布尔数值。
- 二进制类型 (Binary):可以存储图像、音频、视频及其他类型的二进制数据。
- 日期时间类型 (Date):可以存储日期和时间,包括年、月、日、小时、分钟和秒。
- 时间戳 (Timestamp):可以存储时间戳。
# Row Set (行级缓存)
行集缓存是Kettle使用的一种内存缓存技术,用于临时存储数据行集以供后续步骤使用,也就是多个步骤之间可以通过行集缓存进行数据交换。行集缓存能将一个步骤产生的数据集存储在内存中,而非写入磁盘,以提高数据处理的速度。
在Kettle中每个步骤都可以使用行集缓存来处理数据,行集缓存的大小可以在转换属性中里定义,它会创建一个指定大小的行集缓存用于存储数据行,并用于步骤之间传递数据。
行集缓存还分为输入缓存、输出缓存和查找缓存。输入缓存用于存储从上一个步骤读取的数据,输出缓存用于存储要写入下一个步骤的数据,而查找缓存用于存储需要在数据集中查找的数据。
当输入缓存空时,从行集读取数据的步骤停止读取,直到行集里又有可读的数据行。
当输出缓存满时,向行集写数据的步骤将停止写入,直到行集里又有空间可写入数据。
# Parallelism (并行)
基于行集缓存Kettle就实现了每个步骤都由一个独立的线程运行,大幅提高转换时的并发能力。
在Kettle中,Transformation对象中的步骤是不能定义执行顺序的,因为所有步骤都是以并发方式执行的。当转换启动后,所有步骤都会同时启动,然后它们会从输入行集中读取数据,并把处理过的数据写到输出行集,直到输入行集里不再有数据,就中止步骤的运行。当所有的步骤都中止时,整个转换就执行完成了。
如果想要在Kettle中实现顺序执行,我们可以使用Job对象来定义需要顺序执行的任务。
另外作业除了能顺序执行,它还可以实现并行执行和分布式并行执行。
# Kettle安装部署
# 安装步骤
# 1. 安装Java环境
由于kettle是基于Java的,因此需要安装Java环境并配置JAVA_HOME环境变量。
下载JDK的Windows安装包,版本建议1.8版本以上。
- 下载地址:
https://www.oracle.com/java/technologies/downloads/archive/
- 下载地址:
安装后
cmd
中执行java -version
检查是否有配置环境变量。
# 2. 下载Kettle程序包
- 单击
Download Latest Version
下载最新版本即可。- 下载地址:
https://sourceforge.net/projects/pentaho/files/Data%20Integration/
- 下载速度慢的话,可以复制下载链接到迅雷进行下载。
- 下载地址:
# 3. 运行Kettle程序
- 因Kettle为绿色软件,解压到任意目录后,双击
Spoon.bat
即可运行Kettle图形化程序。
# 常用目录结构
目录/文件名 | 作用 |
---|---|
classes/ | 生命周期监听、注册表扩展、日志等的配置文件 |
launcher/ | Kettle的启动配置 |
plugins/ | 插件 |
pwd/ | kettle集群配置文件 |
logs/ | 日志目录 |
system/ | 系统目录 |
carte.bat|sh | 集群启动命令 |
encr.bat|sh | Kettle提供的加密算法命令 |
import.bat|sh | 导入命令 |
kitchen.bat|sh | Job运行命令 |
pan.bat|sh | Transformation运行命令 |
set-pentaho-env.bat|sh | 环境变量设置命令 |
spoonDebug.bat|sh | 以Debug方式运行Kettle图形界面 |