文章目录
一 kettle简介
1 ETL
ETL(Extract-Transform-Load的缩写,即数据抽取、转换、装载的过程),用于执行数据的处理,转换,迁移的工具。
市面上常用的ETL工具有很多,比如DataX,Kettle等。
2 kettle的两种脚本及核心组件
Kettle是一款国外开源的ETL工具,纯java编写。
Kettle中有两种脚本文件:transformation和job。
transformation:完成针对数据的基础转换。
job:完成整个工作流的控制。
核心组件:
Spoon.bat是图形化界面,使用的最多。
通过Kitchen和Pan以命令行方式执行kettle的Job和Transformation
3 下载配置
下载地址:https://sourceforge.net/projects/pentaho/files/Data%20Integration/
安装jdk,版本建议1.8及以上;
下载kettle压缩包,解压缩到任意本地路径即可。
二 kettle核心概念
1 转换
转换(transaformation)负责数据的输入、转换、校验和输出等工作。
Kettle 中使用转换完成数据 ETL 全部工作。
转换由多个步骤 (Step) 组成,如文本文件输入,过滤输出行,执行 SQL 脚本等。各个步骤使用跳 (Hop) 来链接。 跳定义了一个数据流通道,即数据由一个步骤流 (跳) 向下一个步骤。
在 Kettle 中数据的最小单位是数据行(row),数据流中流动其实是缓存的行集 (RowSet) 。
步骤(控件)是转换里的基本的组成部分。每个步骤都会读、写数据行(唯一例外是“生成记录”步骤,该步骤只写数据)。步骤将数据写到与之相连的一个或多个输出跳(hop),再传送到跳的另一端的步骤。大多数的步骤都可以有多个输出跳。一个步骤的数据发送可以被设置为分发和复制,分发是目标步骤轮流接收记录,复制是所有的记录被同时发送到所有的目标步骤。
跳就是步骤之间带箭头的连线,跳定义了步骤之间的数据通路。跳实际上是两个步骤之间的被称之为行集的数据行缓存,行集的大小可以在转换的设置里定义。当行集满了,向行集写数据的步骤将停止写入,直到行集里又有了空间。当行集空了,从行集读取数据的步骤停止读取,直到行集里又有可读的数据行。
并行:转换中的每个步骤(step)都是并行的。跳的这种基于行集缓存的规则允许每个步骤都是由一个独立的线程运行,这样并发程度最高。在数据仓库里,我们经常要处理大量数据,所以这种高并发低消耗的方式也是ETL工具的核心需求。
对于kettle的转换,不能定义一个执行顺序,因为所有步骤都以并发方式执行:当转换启动后,所有步骤都同时启动,从它们的输入跳中读取数据,并把处理过的数据写到输出跳,直到输入跳里不再有数据,就中止步骤的运行。当所有的步骤都中止了,整个转换就中止了。
如果你想要一个任务沿着指定的顺序执行,那么就要使用下面所描述的“作业”!
2 作业
作业 (Job),负责定义一个完成整个工作流的控制。比如将转换的结果发送邮件给相关人员。因为转换(transformation)以并行方式执行,所以必须存在一个串行的调度工具来执行转换,这就是 Kettle中的作业。
三 kettle转换
1 输入控件
输入是转换里面的第一个分类,输入控件也是转换中的第一大控件,用来抽取数据或者生成数据。输入是ETL里面的E(Extract),主要做数据提取的工作。例如下文案例中用到的表输入。
2 输出控件
输出是转换里面的第二个分类,输出控件也是转换中的第二大控件,用来存储数据。输出是ETL里面的L(Load),主要做数据加载的工作。例如下文案例中用到的表输出。
3 转换控件
转换控件是转换中的第三大控件,用来转换数据。转换是ETL里面的T(Transform),主要做数据转换,数据清洗的工作。
上述控件及kettle其他类型控件的使用详情参考:
Kettle中文网
四 kettle作业
大多数ETL项目都需要完成各种各样的维护工作。
例如,如何传送文件;验证数据库表是否存在等等。而这些操作都是按照一定顺序完成。因为转换以并行方式执行,就需要一个可以串行执行的作业来处理这些操作。
一个作业包含一个或者多个作业项,这些作业项以某种顺序来执行。作业执行顺序由作业项之间的跳(job hop)和每个作业项的执行结果来决定。
1 作业项
作业项是作业的基本构成部分。如同转换的步骤,作业项也可以使用图标的方式图形化展示。但是,作业项和转换步骤有下面几点不同:
- 转换步骤与步骤之间是数据流,作业项之间是步骤流。
- 转换启动以后,所有步骤一起并行启动等待数据行的输入,而作业项是严格按照执行顺序启动,一个作业项执行完以后,再执行下一个作业项。
- 在作业项之间可以传递一个结果对象(result object)。这个结果对象里面包含了数据行,它们不是以数据流的方式来传递的。而是等待一个作业项执行完了,再传递个下一个作业项。
- 因为作业顺序执行作业项,所以必须定义一个起点。有一个叫“开始”的作业项就定义了这个点。一个作业只能定一个开始作业项。
2 作业跳
作业的跳是作业项之间的连接线,他定义了作业的执行路径。作业里每个作业项的不同运行结果决定了做作业的不同执行路径。
作业跳分为三种情况:
- 无条件执行:不论上一个作业项执行成功还是失败,下一个作业项都会执行。这是一种蓝色的连接线,上面有一个锁的图标。
- 当运行结果为真时执行:当上一个作业项的执行结果为真时,执行下一个作业项。通常在需要无错误执行的情况下使用。这是一种绿色的连接线,上面有一个对钩号的图标。
- 当运行结果为假时执行:当上一个作业项的执行结果为假或者没有成功执行是,执行下一个作业项。这是一种红色的连接线,上面有一个红色的停止图标。
五 kettle资源库
1 数据库资源库
数据库资源库是将作业、转换、数据库连接、集群等相关信息存储在数据库中,执行的时候直接去数据库读取信息,很容易跨平台使用。
2 文件资源库
将作业和转换相关的信息存储在指定的目录中,和XML的方式一样,创建方式跟创建数据库资源库步骤类似,只是不需要用户密码就可以访问,跨平台使用比较麻烦。
六 案例-从mysql到mysql
案例:从一个mysql数据源的表中读输入流,经过去重转换,输出到另一个mysql数据源的某个表。
-
为mysql数据库创建两个账号 user1 user2。
-
在user1账号下的user1库中新建一个表student1(有重复数据):
-
在user2账号下的user2库中创建一个表student2(无数据):
-
为kettle创建数据库资源库,所有的数据库连接信息、trans和job保存在这里:(用admin admin登录)
配置成功后可以看到kettle为我们在数据库资源库中创建一组表,用来存储kettle上保存的数据(数据库连接、转换、工作):
-
新建转换:表输入->去重->表输出
-
为转换配置数据库连接:
-
配置表输入:配置数据库连接、sql语句(表和字段)
-
配置表输出:数据库连接、目标表、映射字段(目标表字段、流字段)
trans配置完成。 -
然后,建立一个job,封装trans:
-
执行job:
-
查看job执行结果。user2数据库下的student2表,发现已写入了user1数据库下的student1非重复数据。
-
把转换和工作保存在数据库资源库:
同时,可以看到资源库中存储的连接信息:
七 踩坑总结
1 MySQL版本和驱动版本不兼容的问题
Caused by: com.mysql.jdbc.exceptions.jdbc4.MySQLNonTransientConnectionExcept
参考:https://blog.csdn.net/qq_44895681/article/details/108316605
kettle 8.2 + mysql8.0.25 + mysql connector 8.0.25 失败!
kettle 8.2 + mysql8.0.25 + mysql connector 5.1.49 成功!
kettle 9.2+ mysql8.0.25 + mysql8.0.25connector 连接成功!
2 往输出流中插入整数取值时报错
There was a data type error: the data type of java.lang.Integer object [1] does not correspond to value meta [Integer]
解决方案:将int型的变量 声明为 long类型,成功解决。
3 PID9.2版本connect窗口无法缩放
右上角,使用connect配置kettle资源库时,窗口异常
回退到 8.2版本 成功解决
参考:https://www.cnblogs.com/jifeng/p/4741498.html 开源ETL工具kettle系列之常见问题