目录
本文描述在CentOS 7.2上安装和运行Kettle 8.3的步骤。
一、安装Java
Kettle是一个Java程序,需要Java运行时环境(Java虚拟机/JVM和一组运行时类)。Kettle与Java的版本要匹配,本例中的Kettle 8.3需要Java 1.8的支持。
# 查找yum资源库中的java包
yum search java | grep -i --color JDK
# 安装Java 1.8
yum install -y java-1.8.0-openjdk.x86_64 java-1.8.0-openjdk-devel.x86_64
# 验证安装
java -version
二、安装Kettle
# 下载安装包
wget https://sourceforge.net/projects/pentaho/files/Pentaho%208.3/client-tools/pdi-ce-8.3.0.0-371.zip/download
# 解压缩,会产生一个data-integration目录
unzip pdi-ce-8.3.0.0-371.zip
三、运行Kettle程序
1. 安装Linux图形环境
yum groupinstall "X Window System"
yum groupinstall GNOME Desktop
2. 安装配置VNC Server
参见:“CentOS7.2 安装tigerVNC-Server”
3. 在客户端使用vncviewer连接系统
配置如图1所示。
4. 执行spoon.sh
在桌面中打开一个终端执行spoon.sh,如图2所示。
打开的spoon界面如图3所示。
四、给Spoon创建一个桌面快捷启动方式
# 编辑属性文件
vim /root/Desktop/a.desktop
# 内容如下
[Desktop Entry]
Encoding=UTF-8
Name=spoon
Exec=sh /root/data-integration/spoon.sh
Info="Kettle"
Terminal=false
Type=Application
StartupNotify=true
各属性含义详细说明参见“Linux桌面快捷方式 Desktop Entry 详解”。保存文件后,Linux桌面出现spoon图标,如图4所示。
双击spoon图标或者点击图标右键菜单的“Open”,启动spoon.sh程序,打开Kettle设计界面。
五、配置
Kettle运行环境内的一些因素会影响Kettle的运行方式。这些因素包括配置文件、与Kettle集成在一起的外部软件。我们把这些因素统称为Kettle的配置。
1. 配置文件和.kettle目录
Kettle运行环境中有几个文件影响了Kettle的运行情况。这些文件可以看成是Kettle配置文件,当Kettle做了环境移植或升级时,这些文件也要随之改变,包括:
- .spoonrc
- jdbc.properties
- kettle.properties
- kettle.pwd
- repositories.xml
- shared.xml
.spoonrc文件只用于spoon程序,其余的则用于Kettle里的多个程序。这些文件大部分都是存放在.kettle目录下。.kettle目录默认情况下位于操作系统用户的本地目录下,每个用户都有自己的本地目录(如/home/<user>,这里的user就是操作系统的用户名)。
.Kettle目录的位置也可以配置,这需要设置KETTLE_HOME环境变量。例如在生产机器上,可能希望所有用户都使用同一个配置来运行转换和作业,就可以设置KETTLE_HOME使之指向一个目录,所有操作系统用户就可以使用相同的配置文件了。与之相反,也可以给某个ETL项目设置一个特定的配置目录,需要在运行这个ETL的脚本里设置KETTLE_HOME环境变量。
(1).spoonrc
从名字就可以看出来,.spoonrc文件用于存储Spoon程序的运行参数和状态。其它Kettle的程序都不使用这个文件。.spoonrc文件位于.kettle目录下。因为在默认情况下,.kettle目录位于用户目录下,所以不同用户都使用各自的.spoonrc文件。.spoonrc文件中包括的主要属性如下:
- 通用的设置和默认值:在Spoon里,这些设置在“Options”对话框的“General”标签下设置。“Options”对话框可以通过主菜单的“Tools” -> “Options”菜单项打开。
- 外观,例如字体和颜色:在Spoon里,这些都在“Options”对话框的“Look & Feel”标签下。
- 程序状态数据:如最近使用的文件列表。
通常不用手工编辑.spoonrc文件。如果新安装了一个Kettle代替一个旧版本的Kettle,可用旧版本的.spoonrc文件覆盖新安装的.spoonrc文件,这样保留旧版本Kettle的运行状态。所以定时备份.spoonrc文件也是必要的。
(2)jdbc.properties
Kettle安装目录下还有一个jdbc.properties文件,保存在simple-jndi目录下。这个文件用来存储JNDI连接对象的连接参数。Kettle可以用JNDI的方式来引用JDBC连接参数,如IP地址、用户认证,这些连接参数最终用来在转换和作业中构造数据库连接对象。
JNDI是Java Naming and Directory Interface的缩写,这是一个Java标准,可以通过一个名字访问数据库服务。注意JNDI只是Kettle指定数据库连接参数的一种方式,数据库连接参数也可以保持在转换或作业的数据库连接对象里或资源库里。JNDI数据库连接配置是整个Kettle配置的一部分。
在jdbc.properties文件里,JNDI连接参数以多行文本形式保存,每一行就是一个键值对,等号左右分别是键和值。键包括了JNDI名字和一个属性名,中间用反斜线分隔。属性名前的JNDI名称决定了JNDI连接包括几行参数。以JNDI名称开头的几行就构成了建立连接需要的所有参数。如下是一些属性名称:
- type:这个属性的值永远是javax.sql.DataSource。
- driver:实现了JDBC里Driver类的,JDBC驱动类的全名。
- url:用于连接数据库的JDBC URL连接串。
- user:数据库用户名。
- password:数据库密码。
下面是一个jdbc.properties里保存JNDI连接参数的例子:
SampleData/type=javax.sql.DataSource
SampleData/driver=org.h2.Driver
SampleData/url=jdbc:h2:file:samples/db/sampledb;IFEXISTS=TRUE
SampleData/user=PENTAHO_USER
SampleData/password=PASSWORD
在这个例子里,JNDI名字是SampleData,可用于建立h2数据库的连接,数据库用户名是PENTAHO_USER,密码是PASSWORD。
可以按照SampleData的格式,把自己的JNDI名字和连接参数写到jdbc.properties文件里。因为在jdbc.properties里定义的连接可以在转换和作业里使用,用户需要保存好这个文件,至少需要做定时备份。
另外还需要注意部署问题,在部署使用JNDI方式的转换和作业时,记住需要更改部署环境里的jdbc.properties文件。如果开发环境和实际部署环境相同,就可以直接使用开发环境里的jdbc.properties文件。但大多数情况下,开发环境使用的是测试数据库,在把开发好的转换和作业部署到实际生产环境中后,需要更改jdbc.properties的内容,使之指向实际生产数据库。使用JNDI的好处就是部署时不用再更改转换和作业,只需要更改jdbc.properties里的连接参数。
(3)kettle.properties
kettle.properties文件是一个通用的保存在Kettle属性的文件。属性对Kettle而言就如同环境变量对操作系统的shell命令。它们都是全局的字符串变量,用于把作业和转换参数化。例如,可以使用一个属性来保存数据库连接参数,保存文件路径,或保存一个用在某个转换里的常量。
kettle.properties文件使用文本编辑器来编辑。一个属性是一个等号分隔的键值对,占据一行。键在等号前面,作为以后使用的属性名,等号后面就是这个属性的值。下面是一个kettle.properties文件的例子:
# connection parameters for the job server
DB_HOST=dbhost.domain.org
DB_NAME=sakila
DB_USER=sakila_user
DB_PASSWORD=sakila_password
# path from where to read input files
INPUT_PATH=/home/sakila/import
# path to store the error reports
ERROR_PATH=/home/sakila/import_errors
转换和作业可以通过${属性名}或%%属性名%%的方式来引用kettle.properties里定义的这些属性值,用于对话框里输入项的变量。图5显示的是CSV输入步骤对话框。
如图中所示,在文件名字段里不再用硬编码路径,而使用了变量的方式${INPUT_PATH}。对任何带有“$”符号的输入框都可以使用这种变量的输入方式。在运行阶段,这个变量的值就是/home/sakila/import,即在kettle.properties文件里设置的值。
这里属性的使用方式和前面讲过的jdbc.properties里定义的JNDI连接参数的使用方式类似。例如可以在开发和生产环境中使用不同的kettle.properties文件,以便快速切换。
尽管使用kettle.properties和jdbc.properties相似,但也有区别。首先,JNDI只用于数据库连接,而属性可用于任何情况。其次,kettle.properties里的属性名字可以是任意名字,而JNDI里的属性名是预先定义好的,只用于JDBC数据库连接。
关于kettle.properties文件还有一点要说明的:kettle.properties文件里可以定义用于资源库的一些预定义变量。如果使用资源库保存转换或作业,如下这些预定义变量就可以定义一个默认资源库:
- KETTLE_REPOSITORY:默认的资源库名称。
- KETTLE_USER:资源库用户名。
- KETTLE_PASSWORD:用户名对应的密码。
使用上面这些变量,Kettle会自动使用KETTLE_REPOSITORY定义的资源库。
(4)kettle.pwd
使用Carte服务执行作业需要授权。默认情况下,Carte只支持最基本的授权方式,就是将密码保存在kettle.pwd文件中。kettle.pwd文件位于Kettle根目录下的pwd目录下。默认情况下,kettle.pwd的内容如下:
# Please note that the default password (cluster) is obfuscated using the Encr script provided in this release
# Passwords can also be entered in plain text as before
#
cluster: OBF:1v8w1uh21z7k1ym71z7i1ugo1v9q
最后一行是唯一有用的一行,定义了一个用户cluster,以及混淆后的密码(这个密码也是cluster)。文件的注释说明了这个混淆的密码是由Encr.bat或encr.sh脚本生成的。
如果使用Carte服务,尤其当Carte服务不在局域网范围内时,就要编辑kettle.pwd文件,至少要更改默认的密码。直接使用文本编辑器就可以编辑。
(5)repositories.xml
Kettle可以通过资源库管理转换、作业和数据库连接这样的资源。如果不使用资源库,转换、作业也可以保存在文件里,每一个转换和作业都保存各自的数据库连接。
Kettle资源库存储在关系数据库里,也可以使用插件存储到其它存储系统,例如存储到一个像SVN这样的版本控制系统。为了使操作资源库更容易,Kettle在repositories.xml文件中保存了所有资源库。repositories.xml文件可以位于两个目录:
- 位于用户本地(由Java环境变量中的user.home变量指定)的.kettle目录下。Spoon、Kitchen、Pan会读取这个文件。
- Carte服务会读取当前启动路径下的repositories.xml文件。如果当前路径下没有,会使用上面的用户本地目录下的.kettle目录下的repositories.xml文件。
对开发而言,不用手工编辑这个文件。无论什么时候连接到了资源库,这个文件都由Spoon自动维护。但对部署而言,情况就不同了,在部署的转换或作业里会使用资源库的名字,所以在repositories.xml文件里必须要有一个对应的资源库的名字。和上面讲到的jdbc.properties和kettle.properties文件类似,实际运行环境的资源库和开发时使用的资源库往往是不同的。
在实践中,一般直接将repositories.xml文件从开发环境复制到运行环境,并手工编辑这个文件使之匹配运行环境。
(6)shared.xml
Kettle里有一个概念叫共享对象,共享对象就是类似于转换的步骤、数据库连接定义、集群服务器定义等这些可以一次定义,然后在转换和作业里多次引用的对象。共享对象在概念上和资源库有一些重叠,资源库也可以被用来共享数据库连接和集群服务器的定义。但还是有一些区别,资源库往往是一个中央存储,多个开发人员都访问同一个资源库,用来维护整个项目范围内所有可共享的对象。
在Spoon里单击左侧树状列表的“View”标签,找到想共享的对象。右键单击,然后在右键菜单中选择“Share”。保存文件,否则该共享不会被保存。以这种方式创建的共享可以在其它转换或作业里使用(可以通过左侧树状列表的“View”模式找到)。但是,共享的步骤或作业项不会被自动放在画布里,需要把它们从树状列表中拖到画布里,以便在转换或作业里使用。
共享对象存储在shared.xml文件中。默认情况下,shared.xml文件保存在.kettle目录下,.kettle目录位于当前系统用户的本地目录下。也可以给shared.xml文件自定义一个存储位置。这样用户就可以在转换或作业里多次使用这些预定义好的共享对象。
在转换或作业的“Properties”对话框里可以设置shared.xml文件的位置。对作业来说,在“Properties”对话框的“Settings”标签下。对转换来说,在“Properties”对话框的“Miscellaneous”标签下。
可以使用变量指定共享文件的位置。例如,在转换里可以使用类似下面的路径:
${Internal.Transformation.Filename.Directory}/shared.xml
这样不论目录在哪里,所有一个目录下的转换都可以使用同一个共享文件。对部署而言,需要确保任何在开发环境中直接或间接使用的共享文件也要在部署环境中可以找到。一般情况下,在两种环境中,共享文件应该是一样的。所有环境差异的配置应该在kettle.properties文件中设置。
2. 用于启动Kettle程序的shell脚本
在下面一些情况下,可能要调整一下启动Kettle程序的shell脚本:
- 给Java classpath增加新的jar包。通常是因为在转换和作业里直接或间接引用了非默认的Java Class文件。
- 改变Java虚拟机的参数,如可用内存大小。
(1)shell脚本的结构
所有Kettle程序用的shell脚本都类似:
- 初始化一个classpath的字符串,字符串里包括几个Kettle最核心的jar文件。
- 将libext目录下的jar包都包含在classpath字符串中。
- 将和程序相关的其它一些jar包都包含在classpath字符串中。例如Spoon启动时,要包含swt.jar文件,用于生成Spoon图形界面。
- 构造Java虚拟机选项字符串,前面构造的classpath字符串也包含在这个字符串里。虚拟机选项设置了最大内存大小。
- 利用上面构造好的虚拟机选项字符串,构造最终可以运行的Java可执行程序的字符串,包括Java可执行程序、虚拟机选项、要启动的Java类名。
上面描述的脚本结构是Kettle 3.2和以前版本的脚本文件结构,Kettle 4.0和以后版本都统一使用Pentaho的Launcher作为启动程序。
(2)classpath里增加一个jar包
在Kettle的转换里可以写Java脚本,Java脚本会引用第三方的jar包。例如可以在“Java Script”步骤里实例化一个对象,并调用对象的方法,或者在“User defined Java expression”步骤里直接写Java表达式。 当编写Java脚本或表达式时,需要注意classpath中有Java脚本里使用的各种Java类。最简单的方法就是在libext目录下新建一个目录,然后把需要的jar包都放入该目录下。因为在.sh脚本里可以加载libext目录下的所有jar文件(包括子目录),见下面的.sh文件里的代码:
# ***************************************************
# ** JDBC & other libraries used by Kettle: **
# ***************************************************
for f in `find $BASEDIR/libext -type f -name "*.jar"` \
`find $BASEDIR/libext -type f -name "*.zip"`
do
CLASSPATH=$CLASSPATH:$f
done
上面的sh脚本循环libext目录下(包括各级子目录)的所有jar和zip文件,并添加到classpath中。
在Kettle 4.2及以后的版本中,使用Launcher作为启动类,使用launcher.properties文件配置需要加载的类。用户增加了新的jar包,需要修改launcher.properties文件,不用再修改.sh脚本文件。
(3)改变虚拟机堆大小
所有Kettle启动脚本都指定了最大堆大小。如在spoon.sh中,有类似下面的语句:
# ******************************************************************
# ** Set java runtime options **
# ** Change 2048m to higher values in case you run out of memory **
# ** or set the PENTAHO_DI_JAVA_OPTIONS environment variable **
# ******************************************************************
if [ -z "$PENTAHO_DI_JAVA_OPTIONS" ]; then
PENTAHO_DI_JAVA_OPTIONS="-Xms1024m -Xmx2048m -XX:MaxPermSize=256m"
fi
当运行转换或作业时,如果遇到Out of Memory的错误,或者运行Java的机器有更多的物理内存可用,可以在这里增加堆的大小。
3. 管理JDBC驱动
随Kettle带了很多种数据库的JDBC驱动。一般一个驱动就是一个jar文件。Kettle把所有JDBC驱动都保存在lib目录下。
要增加新的JDBC驱动,只要把相应的jar文件放到lib目录下即可。Kettle的各种启动脚本会自动加载lib下的所有jar文件到classpath。添加新数据库的JDBC驱动jar包,不会对正在运行的Kettle程序起作用。需要将Kettle程序停止,添加JDBC jar包后再启动才生效。
当升级或替换驱动时,要确保删除了旧的jar文件。如果想暂时保留旧的jar文件,可以把jar文件放在Kettle之外的目录中,以避免旧的jar包也被意外加载。