Pentaho Data Integration(Kettle)是一个免费开源的基于Java的ETL(Extract-Transform-Load的缩写,即数据抽取、转换、装载的过程)工具,纯JAVA编写,绿色无须安装,且数据抽取高效稳定,通常用作数据迁移。Kettle中有两种脚本文件,transformation和job,transformation完成针对数据的基础转换,job完成对整个工作流的控制。
下面记录下简单的使用流程:
这里需要连接两个数据库,把A数据库的数据导入到B数据库,比如从SQL Server导数到MySQL,就需要如下两个数据库驱动(这里两个数据库都是使用JDBC的方式去连接的):
在Windows系统下,双击"Spoon.bat"即可,在类Unix系统下,需要给脚本Spoon.sh添加可执行权限才行:
启动完成后页面如下:
转换主要针对数据的各种处理,包括一个或多个步骤,步骤之间通过跳(hop)来连接。跳定义了一个单向通道,允许数据从一个步骤流向另一个步骤,在Kettle中,数据的单位是行,数据流就是数据行从一个步骤到另一个步骤的移动。
上面说到的步骤,是转换的基本组成部分,以图标的形式出现,如表输入、表输出等。步骤将数据写到与之相连的一个或多个输出,再传送到跳的另一端的步骤,即跳是步骤之间带箭头的连接线。
在Kettle中,所有的步骤都以并发的方式运行。当转换启动后,所有的步骤都同时启动。
作业包括一个或多个作业项,作业项以某种顺序来执行。
作业项与转换中的步骤类似,作业项也以图标的方式图形化展示。作业项之间可以传递结果对象。结果对象里包含了数据行,它们不是以流的方式来传递的,而是等一个作业项执行完了,再传递给下一个作业项,默认情况下,所有的作业项以串行的方式执行的。
了解了作业和转换的基本概念,下面来简单使用一下(为了简单,这里不做异库数据迁移,仅仅从一个数据库读取数据,然后写到本地文件)。
1. 新建作业(文件类型后缀为kjb)
2. 新建转换(文件类型后缀为ktr)
3. 在第1步的Transformation这个步骤右键->Edit关联第2步的转换文件
4. 新建数据库连接
在作业的View栏里的DatabaseConnection新建数据库连接,并右键->'Share',这样,当前作业的所有转换都可以使用这个数据库连接
5. 编辑转换的表数据步骤如下
6. 执行作业
结果文件如下:
7. 界面使用Kettle就到这里,Kettle还有很多组件可以使用,可以根据实际需求摸索一下。
界面操作难免对于自动化处理来说不方便,这时,可以使用Java程序对其调用来实现。
-------------------------------------------------------------------- 华丽丽的分割线 --------------------------------------------------------------
8. 修改Maven的settings.xml文件,增加下载kettle依赖的仓库中心地址,编辑profiles子节点如下所示:
pentaho
true
pentaho.resolve.repo
Pentaho Omni
http://nexus.pentaho.org/content/groups/omni
true
always
true
always
plugins
Maven Central
http://nexus.pentaho.org/content/groups/omni
true
always
true
always
central
true
pentaho.resolve.repo
Pentaho Omni
http://nexus.pentaho.org/content/groups/omni
true
always
true
always
plugins
Maven Central
http://repo1.maven.org/maven2
true
daily
true
always
9. 新建基于maven管理的Java项目,修改pom.xml,增加如下内容:
com.google.guava
guava
22.0
pentaho-kettle
kettle-core
7.0.0.0-25
pentaho
pentaho-database-model
7.0.0.0-25
pentaho-kettle
kettle-engine
7.0.0.0-25
org.eclipse.jetty
jetty-server
org.eclipse.jetty
jetty-servlet
org.eclipse.jetty
jetty-webapp
org.eclipse.jetty
jetty-xml
org.eclipse.jetty
jetty-plus
org.eclipse.jetty
jetty-security
org.pentaho.reporting.library
libformula
7.0.0.0-25
pentaho-kettle
kettle-ui-swt
7.0.0.0-25
pentaho-kettle
kettle-dbdialog
7.0.0.0-25
pentaho-kettle
kettle5-log4j-plugin
7.0.0.0-25
zip
org.pentaho.reporting.engine
classic-extensions-kettle
7.0.0.0-25
pentaho-releases
http://repository.pentaho.org/artifactory/repo/
public
Public Repositories
http://maven.aliyun.com/nexus/content/groups/public/
10. 测试类
package cn.linjk.kettle;
import org.pentaho.di.core.KettleEnvironment;
import org.pentaho.di.core.logging.LogLevel;
import org.pentaho.di.job.Job;
import org.pentaho.di.job.JobMeta;
public class Main {
public static void main(String[] args) throws Exception {
KettleEnvironment.init();
JobMeta jobMeta = new JobMeta("D:\\Programming\\test.kjb", null);
Job job = new Job(null, jobMeta);
job.setLogLevel(LogLevel.ROWLEVEL);
job.start();
job.waitUntilFinished();
}
}
运行报如下错误:
需要修改转换的引用路径为实际路径,原来为kettle自己的表达式:
再次运行错误:
pom.xml加数据库依赖:
mysql
mysql-connector-java
runtime
5.1.46
运行成功:
流程就是这样子,也可以直接运行转换:
更多的Java调用kettle的API可以自己看源码接口进行调用尝试。