Pentaho_Kettle - wbwangk/wbwangk.github.io GitHub Wiki

Kettle安装

官方安装说明docker镜像

下载一个800多M的zip文件。解压后生成了一个data-integration的目录,里面有多个.bat和.sh文件。启动kettle执行spoon.bat(windows)或spoon.sh(linux/unix)。kettle是java实现的,所以可以跨平台。Kettle是一个桌面应用,而不是一个Web应用。所以需要桌面系统支持。

在ubuntu14桌面下测试出问题,ubuntu14桌面下的java只有7,看错误提示kettle是java8编译的,所以ubuntu14下运行不了。window10下,运行没有问题。 在菜单Help-Option中可以切换语言,切换后需要重启kettle工作台。

Hello World

官方Hello World

创建一个Tutorial目录,里面新建一个list.csv文件,内容是(第一行是标题):

last_name,name
Suarez,Maria
Guimaraes,Joao
Rush,Jennifer
Ortiz,Camila
Rodriguez,Carmen
da Silva,Zoe

data-integration目录下运行Spoon.bat启动kettle工作台。通过菜单File->New->Transformation新建一个转换,保存为hello.ktr,就保存在Tutorial目录下。
kettle利用图形化界面的方式定义数据处理逻辑。在界面中两种关键元素是“步骤”(Step)和“跳转”(Hop)。步骤象流程图的节点,而跳转是带方向的连线。

  1. 在工作台的左侧的Design面板中,选择Input种类,将“CSV file input”拖到右侧工作区。
  2. 选择Scripting种类,将“Modified JavaScript Value”拖到右侧工作区。
  3. 选择Output种类,将“Text file output”拖到右侧工作区。(原文是XML Output,但我的环境中这种类型报错)

现在工作区中有了三个步骤,下面用跳转(Hop)将三个步骤连接起来:

  1. 在右侧工作区中,选中步骤一
  2. 按住Shift键,将步骤一拖动到步骤二,这样就创建了两个步骤之间的跳转(Hop)
  3. 同样的办法,将步骤二和步骤三连接起来

设置步骤一

  1. 双击“CSV file input”图标,打开步骤一的配置窗口
  2. 将Step name命名为name list
  3. 在Filename中点浏览按钮选择上文中创建的list.csv
  4. 取消选中Lazy conversion
  5. 点Get Fields按钮,将列名加载到下面的表格中。Header row present单选框默认选中,表示csv的第一行是列名。
  6. 点Preview预览
  7. 点Ok完成

配置步骤二

  1. 双击“Modified Java Script Value”图标,打开步骤二的配置窗口
  2. 将Step name命令为Greetings
  3. Java script窗口中输入转换脚本:
var msg = 'Hello, ' + name + "!";

这会在Java script functions面板的转换脚本分类下创建了Script 1脚本(可以重命名)。
4. 点Get variables按钮,在下面的表格中添加msg变量。
5. 点OK完成配置

配置步骤三

  1. 双击“Text file output”图标打开步骤三的配置窗口
  2. 通过浏览按钮定义Filename为Hello
  3. 将Step name命名为File with Greetings
  4. 点OK按钮
  5. 重新保存整个工作区(hello.ktr)

验证、预览和运行

在Action菜单,分别选择verify、preview、Run,可以验证、预览和运行当前转换。
执行结束后,在执行结果的Logging选项卡中,可以看到:

Spoon - The transformation has finished!!

然后到Tutorial目录下,可以看到生成的Hello.txt文件。Hello.txt文件的内容是:

msg
Hello, Maria!
Hello, Joao!
Hello, Jennifer!
Hello, Camila!
Hello, Carmen!
Hello, Zoe!

在linux下的无头运行

尝试在windows下的kettle工作台中定义.ktr文件,然后复制到linux,让kettle在linux下执行.ktr文件中定义的转换逻辑。
将centos7下解压kettle,也创建Tutorial目录,把hello.ktrlist.csv复制到Tutorial目录下。
在windows下,hello.ktr中定义了两个文件路径,分别是list.csv和Hello.txt的路径。这个路径都是windows的写法,类似:

<filename>E:\data-integration\Tutorial\list.csv</filename>
<name>E:\data-integration\Tutorial\Hello</name>

将上述路径修改成linux的格式,类似:

<filename>/opt/data-integration/Tutorial/list.csv</filename>
<name>/opt/data-integration/Tutorial/Hello</name>

路径要与linux的实际路径一致。

执行下列命令:

$  ./pan.sh /file /opt/data-integration/Tutorial/hello.ktr /norep
...
2017/11/10 09:57:12 - Pan - Processing ended after 1 seconds.
2017/11/10 09:57:12 - hello -
2017/11/10 09:57:12 - hello - Step name list.0 ended successfully, processed 6 lines. ( 6 lines/s)
2017/11/10 09:57:12 - hello - Step Greetings.0 ended successfully, processed 6 lines. ( 6 lines/s)
2017/11/10 09:57:12 - hello - Step File with Greetings.0 ended successfully, processed 6 lines. ( 6 lines/s)

/file/norep都是pan.sh的参数,参数格式有些怪。
/norep参数的含义是告诉pan不连接repository。kettle的转换定义可以保存到repository,也可以保存到.ktr文件。

Hello World 2

官方原文
引入了作业(Job)。作业由作业条目(Job Entry)组成。作业条目可能是转换或另一个作业。
首先在kettle配置文件kettle.properties中定义一个变量FILESFILES变量指出输入输出文件的地址。通过kettle菜单Edit->Set the kettle.properties file打开kettle.properties配置窗口,在窗口中添加:

FILES=E:\data-integration\Tutorial\Logs

要使上述配置生效,必须重启kettle工作台。

创建转换

创建一个新的转换,命名为get_file_name。保存的文件名为get_file_name.ktr
新转换配置成下图的样子:

各个步骤分别是:

  • Input类型:Get System Info
  • Flow类型: Filter rows
  • Flow类型: Abort
  • Job类型:Set Variable
    画从Filter rows引出的跳转线会出现下拉框,随便选个值即可。

设置Get System Info步骤

  1. 双击Get System Info步骤
  2. 在表格第一行,Name列下输入my_file
  3. 在表格第一行,Type列下选择command line argument 1
  4. OK

设置Filter rows步骤

  1. 双击Filter rows步骤
  2. 输入条件:中选择my_file,等号=替换成IS NULL
  3. 下游步骤选择,'true'时选Abort
  4. 下游步骤选择,'false'时选Set Variable
  5. OK

设置Abort步骤

默认值即可。

设置Set Variable步骤

  1. 双击Set Variable步骤
  2. 点击Get Fields按钮,唯一的字段my_file显示出来,其值是MY_FILE
  3. OK

运行

  1. 点击Action->Run菜单
  2. 在Run对话框中,点击Arguments(legacy)按钮,输入list为第一个参数的值,其它参数有就删除。
  3. 点Run按钮
    在日志面板中看到下列内容:
Set Variables.0 - Set variable MY_FILE to value [list]
  1. 点击Action->Run菜单,重新运行转换
  2. 在Run对话框中,点击Arguments(legacy)按钮,删除第一个参数。
  3. 点Run按钮
    日志面板中看到一些报错信息,Kettle执行到了Abort步骤。

修改转换(hello.ktr)

原来的hello转换写死了输入文件名和输出文件名。现在想把hello转换修改成可以根据参数处理不同的文件。如果作业参数设为foo,则会读入文件foo.csv,输出文件是foo_with_greetings.xml

  1. 用kettle打开hello.ktr文件
  2. 双击第一个步骤(CSV File Input)
  3. 删除之前设定的filename。按原文的说明,按Ctrl+空格可以调出之前在kettle.propertys 配置的FILES变量。但中文windows将Ctrl+空格占用了,无法调出变量。只能在filename输入框中输入下面的内容:
${FILES}/${MY_FILE}.csv

FILES是kettle.propertys中设置的工作目录,MY_FILE是输入文件名。
4. 点OK
5. 双击第3个步骤
6. 删除之前设置的filename,在filename输入框中输入:

${FILES}/${MY_FILE}_with_greetings

这定义了输出文件的名字。
7. 点击Show Filename(s)按钮,${FILES}会被替换为kettle.propertys中设定的值。
8. 点OK
9. 拖动一个Filter Rows步骤到转换 10. 拖动Filter Rows到步骤CSV Input和步骤Modified Javascript Script Value之间的连线(Hop)上,直到连线高亮(加粗)再释放鼠标按钮。这样就将步骤Filter Rows串联到步骤CSV Input和步骤Modified Javascript Script Value之间。
11. 在输入框中选择name,在等号输入框中选择IS NOT NULL
12. 输入框Send 'true' data to StepSend 'false' data to Step保持为空
13. 点OK 14. 通过菜单File->Save as将当前转换保存到Hello_with_parameters

运行转换

新建的这个转换依赖一个环境变量MY_FILE,在运行转换前必须要手工定义这个值。

  1. 通过菜单Edit->Set Environment Variables,打开环境变量定义窗口
  2. 定义变量MY_FILE的值,如list。这是一个文件名,list.csv存在。
  3. 点OK
  4. 点Run
  5. 在运行窗口的variables面板中可以看到之前涉及到的FILES和MY_FILE两个变量。点击Run。
  6. 最后看到生成的文件(list_with_greetings.txt)

创建作业

作业由作业条目组成。作业条目可能是转换或作业(子作业)。

  1. 通过菜单File->New->Job新建作业
  2. 通过File->Save保存作业为Hello(Hello.kjb)
  3. 拖动General->Start步骤、两个General->Transformation步骤和一个Conditions->File Exists步骤到工作区
  4. 以顺序Start, Transformation, File Exists, Transformation连接它们
  5. 拖动两个Utility->Abort job步骤到工作区。连接它们到第一个Transformation步骤和File Exists步骤。新创建的跳转(连线)将是红色。
  6. 双击第一个转换条目,在Transformation filename输入域中输入:
${Internal.Job.Filename.Directory}/get_file_name.ktr

上述以变量表示目录,使得转换和作业使用同样的目录。在作业条目名称域中输入get_file_name。点OK
7. 双击第二个转换条目,在Transformation Filename域中输入:

${Internal.Job.Filename.Directory}/Hello_with_parameter.ktr
  1. 双击File Exists条目,在Filename域中输入:
${FILES}/${MY_FILE}.csv

这将检测上述文件是否存在。
9. 双击连接到第一个转换的Abort步骤,在消息框中输入The file name argument is missing
10. 双击连接到第二个转换的Abort步骤,在消息框中输入:

The file ${FILES}/${MY_FILE}.csv does not exist

配置跳转(Hop)

黑色跳转:总会流转到它的下一条目
绿色跳转:上一个作业条目成功才会流转到它的下一条目
红色跳转:上一个作业条目失败才会流转到它的下一条目

运行作业

运行作业前需要先设置参数。

  1. 双击第一个转换(get_file_name),在窗口的Arguments面板中输入参数list。这指出了输入文件是list.csv。

将kettle日志保存到数据库

官方原文

创建日志数据库

为保存kettle日志创建数据库(postgresql位于c7301节点):

$ sudo -u postgres psql
postgres=# CREATE USER kettle WITH PASSWORD 'vagrant';              (新建一个数据库用户hive,密码是vagrant)
CREATE ROLE
postgres=# CREATE DATABASE pdi_logging OWNER kettle;                       (创建用户数据库hive,并指定所有者为hive)
CREATE DATABASE
postgre=# \q    

远程连接测试:

$ psql -h 192.168.73.101 -U kettle -d pdi_logging
Password for user kettle: vagrant

转换日志配置

通过kettle菜单Edit->Settings->Logging->Transformation打开配置窗口。

  1. 对于Log Connection输入框,点击New按钮。输入:
    主机名称:c7301.ambari.apache.org(或ip:192.168.73.101)
    数据库名称:pdi_logging
    端口号:5432(默认)
    用户名:kettle
    密码:vagrant

  2. Log table name数入库输入pdi_log

  3. 选择写入到日志的字段

  4. 点SQL按钮,显示建表语句,并点执行按钮,从而在数据库中创建日志表 、

  5. 点OK完成配置

完成

重新执行转换。连接到数据库查看日志数据:

$ psql -h 192.168.73.101 -U kettle -d pdi_logging
Password for user kettle: vagrant
pdi_logging=>\dt          (查看所有表)
         List of relations
 Schema |  Name   | Type  | Owner
--------+---------+-------+--------
 public | pdi_log | table | kettle

pdi_logging=>select * from pdi_log;
⚠️ **GitHub.com Fallback** ⚠️