Pentaho_Kettle - wbwangk/wbwangk.github.io GitHub Wiki
下载一个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工作台。
创建一个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)。步骤象流程图的节点,而跳转是带方向的连线。
- 在工作台的左侧的Design面板中,选择Input种类,将“CSV file input”拖到右侧工作区。
- 选择Scripting种类,将“Modified JavaScript Value”拖到右侧工作区。
- 选择Output种类,将“Text file output”拖到右侧工作区。(原文是XML Output,但我的环境中这种类型报错)
现在工作区中有了三个步骤,下面用跳转(Hop)将三个步骤连接起来:
- 在右侧工作区中,选中步骤一
- 按住Shift键,将步骤一拖动到步骤二,这样就创建了两个步骤之间的跳转(Hop)
- 同样的办法,将步骤二和步骤三连接起来
- 双击“CSV file input”图标,打开步骤一的配置窗口
- 将Step name命名为
name list
- 在Filename中点浏览按钮选择上文中创建的
list.csv
- 取消选中Lazy conversion
- 点Get Fields按钮,将列名加载到下面的表格中。Header row present单选框默认选中,表示csv的第一行是列名。
- 点Preview预览
- 点Ok完成
- 双击“Modified Java Script Value”图标,打开步骤二的配置窗口
- 将Step name命令为
Greetings
- Java script窗口中输入转换脚本:
var msg = 'Hello, ' + name + "!";
这会在Java script functions面板的转换脚本分类下创建了Script 1
脚本(可以重命名)。
4. 点Get variables按钮,在下面的表格中添加msg变量。
5. 点OK完成配置
- 双击“Text file output”图标打开步骤三的配置窗口
- 通过浏览按钮定义Filename为Hello
- 将Step name命名为
File with Greetings
- 点OK按钮
- 重新保存整个工作区(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!
尝试在windows下的kettle工作台中定义.ktr
文件,然后复制到linux,让kettle在linux下执行.ktr
文件中定义的转换逻辑。
将centos7下解压kettle,也创建Tutorial目录,把hello.ktr
和list.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文件。
官方原文
引入了作业(Job)。作业由作业条目(Job Entry)组成。作业条目可能是转换或另一个作业。
首先在kettle配置文件kettle.properties中定义一个变量FILES
,FILES
变量指出输入输出文件的地址。通过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步骤
- 在表格第一行,Name列下输入my_file
- 在表格第一行,Type列下选择command line argument 1
- 点OK
- 双击Filter rows步骤
- 输入条件:中选择my_file,等号
=
替换成IS NULL - 下游步骤选择,'true'时选Abort
- 下游步骤选择,'false'时选Set Variable
- 点OK
默认值即可。
- 双击Set Variable步骤
- 点击Get Fields按钮,唯一的字段my_file显示出来,其值是MY_FILE。
- 点OK
- 点击Action->Run菜单
- 在Run对话框中,点击Arguments(legacy)按钮,输入list为第一个参数的值,其它参数有就删除。
- 点Run按钮
在日志面板中看到下列内容:
Set Variables.0 - Set variable MY_FILE to value [list]
- 点击Action->Run菜单,重新运行转换
- 在Run对话框中,点击Arguments(legacy)按钮,删除第一个参数。
- 点Run按钮
日志面板中看到一些报错信息,Kettle执行到了Abort步骤。
原来的hello转换写死了输入文件名和输出文件名。现在想把hello转换修改成可以根据参数处理不同的文件。如果作业参数设为foo
,则会读入文件foo.csv
,输出文件是foo_with_greetings.xml
。
- 用kettle打开hello.ktr文件
- 双击第一个步骤(CSV File Input)
- 删除之前设定的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 Step
和Send 'false' data to Step
保持为空
13. 点OK
14. 通过菜单File->Save as将当前转换保存到Hello_with_parameters
。
新建的这个转换依赖一个环境变量MY_FILE
,在运行转换前必须要手工定义这个值。
- 通过菜单Edit->Set Environment Variables,打开环境变量定义窗口
- 定义变量
MY_FILE
的值,如list。这是一个文件名,list.csv存在。 - 点OK
- 点Run
- 在运行窗口的variables面板中可以看到之前涉及到的FILES和MY_FILE两个变量。点击Run。
- 最后看到生成的文件(list_with_greetings.txt)
作业由作业条目组成。作业条目可能是转换或作业(子作业)。
- 通过菜单File->New->Job新建作业
- 通过File->Save保存作业为
Hello
(Hello.kjb) - 拖动General->Start步骤、两个General->Transformation步骤和一个Conditions->File Exists步骤到工作区
- 以顺序Start, Transformation, File Exists, Transformation连接它们
- 拖动两个Utility->Abort job步骤到工作区。连接它们到第一个Transformation步骤和File Exists步骤。新创建的跳转(连线)将是红色。
- 双击第一个转换条目,在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
- 双击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
黑色跳转:总会流转到它的下一条目
绿色跳转:上一个作业条目成功才会流转到它的下一条目
红色跳转:上一个作业条目失败才会流转到它的下一条目
运行作业前需要先设置参数。
- 双击第一个转换(get_file_name),在窗口的Arguments面板中输入参数list。这指出了输入文件是list.csv。
为保存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打开配置窗口。
-
对于Log Connection输入框,点击New按钮。输入:
主机名称:c7301.ambari.apache.org(或ip:192.168.73.101)
数据库名称:pdi_logging
端口号:5432(默认)
用户名:kettle
密码:vagrant -
Log table name数入库输入pdi_log
-
选择写入到日志的字段
-
点SQL按钮,显示建表语句,并点执行按钮,从而在数据库中创建日志表 、
-
点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;