Kettle — 自定義外掛
Kettle開發體系是基於外掛的,平臺自身提供介面,開發者按照規範實現介面就能進行外掛的開發。在Kettle8.1的官方文件上有關於外掛非常詳細的介紹,如果有任何疑問可以先去官方文件檢視。下面先介紹一下需要進行外掛開發最基本的原理。
外掛型別
在Kettle中外掛涵蓋以下四種類型:
1.步驟外掛:Kettle中轉換的核心物件
2.作業輸入外掛:Kettle中作業的核心物件
3.資料庫外掛:資料庫連線中的增加新的自定義連線
4.分割槽外掛
自定義外掛核心元件
這裡只介紹轉換步驟外掛的開發流程。
轉換步驟外掛實現ETL資料流中資料處理的任務。轉換步驟是為輸入、處理或輸出而設計的。輸入步驟從外部資料來源(例如檔案或資料庫)獲取資料行。處理步驟使用資料行、執行欄位計算和流操作,例如加入或過濾。一個轉換步驟外掛至少需要實現四個介面
org.pentaho.di.trans.step.StepMetaInterface:元資料的處理,載入xml,校驗,主要是對一個步驟的定義的基本資料。
org.pentaho.di.trans.step. StepDataInterface:資料處理涉及的具體資料,以及對資料的狀態的設定和回收。
org.pentaho.di.trans.step. StepInterface:負責資料處理,轉換和流轉。這裡面主要由processRow()方法來處理。
org.pentaho.di.trans.step. StepDialogInterface:提供GUI/dialog,編輯步驟的元資料。
對於以上四個介面的實現,都有相應的基類,具體的步驟只需要繼承基類和實現相應的介面即可。
Step擴充套件介面:
Java 介面 |
基類 |
主要功能 |
StepMetaInterface |
BaseStepMeta |
儲存step設定資訊 驗證step設定資訊 序列化step設定資訊 提供獲取step類的方法 |
StepDialogInterface |
BaseStepDialog |
step屬性資訊配置視窗 |
StepInterface |
BaseStep |
處理rows |
StepDataInterface |
BaseStepData |
為資料處理提高資料儲存 |
同時開發的外掛也是符合MVC模式的。
自定義外掛開發與部署(Step Plugins)
首先官方提供了一個最小化的Sample Step Plugin(樣板步驟外掛),我們可以去指定地址下載該模板(https://sourceforge.net/projects/pentaho/files/)。選擇完8.1的模板下載後,我們可以看到有四個外掛模板,選擇Kettle-sdk-step-plugin。
將進行打包編譯是過不了的,需要將專案匯入到STS或者eclipse(官網上面說專案是基於eclipse開發的),對maven的pom.xml需要如下的修改(主要是修改外掛版本和增加maven的build資源庫):
<?xml version="1.0"?>
<project xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd" xmlns="http://maven.apache.org/POM/4.0.0"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
<modelVersion>4.0.0</modelVersion>
<!-- <parent>
<groupId>pentaho-kettle</groupId>
<artifactId>kettle-sdk-plugin-parent</artifactId>
<version>8.1.0.0-365</version>
</parent> -->
<parent>
<groupId>org.pentaho.di.plugins</groupId>
<artifactId>pdi-plugins</artifactId>
<version>8.1.0.0-SNAPSHOT</version>
</parent>
<artifactId>kettle-sdk-step-plugin</artifactId>
<version>8.1.0.0-SNAPSHOT</version>
<name>Pentaho Data Integration SDK Step Plugin</name>
<dependencyManagement>
<dependencies>
<dependency>
<groupId>xerces</groupId>
<artifactId>xercesImpl</artifactId>
<version>2.8.1</version>
</dependency>
</dependencies>
</dependencyManagement>
<dependencies>
<dependency>
<groupId>org.pentaho</groupId>
<artifactId>pentaho-metadata</artifactId>
<version>8.1.0.0-SNAPSHOT</version>
<scope>provided</scope>
</dependency>
<dependency>
<groupId>pentaho-kettle</groupId>
<artifactId>kettle-core</artifactId>
<version>8.1.0.0-SNAPSHOT</version>
<scope>provided</scope>
</dependency>
<dependency>
<groupId>pentaho-kettle</groupId>
<artifactId>kettle-engine</artifactId>
<version>8.1.0.0-SNAPSHOT</version>
<scope>provided</scope>
</dependency>
<dependency>
<groupId>pentaho-kettle</groupId>
<artifactId>kettle-ui-swt</artifactId>
<version>8.1.0.0-SNAPSHOT</version>
<scope>provided</scope>
</dependency>
<dependency>
<groupId>pentaho-kettle</groupId>
<artifactId>kettle-engine</artifactId>
<version>8.1.0.0-SNAPSHOT</version>
<classifier>tests</classifier>
<scope>test</scope>
</dependency>
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>${junit.version}</version>
<scope>test</scope>
</dependency>
<!-- <dependency>
<groupId>org.mockito</groupId>
<artifactId>mockito-all</artifactId>
<version>${mockito.version}</version>
<scope>test</scope>
</dependency> -->
</dependencies>
<build>
<plugins>
<plugin>
<artifactId>maven-assembly-plugin</artifactId>
<executions>
<execution>
<id>distro-assembly</id>
<phase>package</phase>
<goals>
<goal>single</goal>
</goals>
<configuration>
<appendAssemblyId>false</appendAssemblyId>
<descriptors>
<descriptor>src/main/assembly/assembly.xml</descriptor>
</descriptors>
</configuration>
</execution>
</executions>
</plugin>
</plugins>
</build>
<profiles>
<profile>
<id>pentaho</id>
<activation>
<activeByDefault>true</activeByDefault>
</activation>
<repositories>
<repository>
<id>pentaho-public</id>
<name>Pentaho Public</name>
<url>http://nexus.pentaho.org/content/groups/omni</url>
<releases>
<enabled>true</enabled>
<updatePolicy>always</updatePolicy>
</releases>
<snapshots>
<enabled>true</enabled>
<updatePolicy>always</updatePolicy>
</snapshots>
</repository>
</repositories>
<pluginRepositories>
<pluginRepository>
<id>pentaho-public</id>
<name>Pentaho Public</name>
<url>http://nexus.pentaho.org/content/groups/omni</url>
<releases>
<enabled>true</enabled>
<updatePolicy>always</updatePolicy>
</releases>
<snapshots>
<enabled>true</enabled>
<updatePolicy>always</updatePolicy>
</snapshots>
</pluginRepository>
</pluginRepositories>
</profile>
</profiles>
</project>
如果編譯時test有問題,就直接刪除test檔案。編譯完以後應該是如下所示:
我們將外掛的jar包放入pdi-ce-8.1.0.0-SNAPSHOT/data-integration/plugins/steps/目錄下(如果steps目錄不存在則建立)。然後開啟Spoon就應該能看到剛剛新增進入的外掛,如下所示。Kettle載入外掛原理可以檢視部落格: https://blog.csdn.net/czmacd/article/details/52957188。這裡我們的steps目錄就是在Kettle的外掛的載入目錄下。
下面講一下這個最小化外掛的功能:這個最小化外掛的功能是將原來輸入的欄位的值替換成Hello World!。最後執行的結果應該是如下的:
最小化外掛原始碼分析
下圖是外掛的原始碼。
1.pom.xm的專案的maven配置檔案,需要修改的都在上面說了
2.接下來是resources中的messages是國際化資原始檔,如果需要新增其他語言就可以在這裡新增,如下所示(增加中文):
3.在resources中的resources中存在的是圖示,可以使用@step註解指定
4.下面是四個最重要的類上面大致講過了其中的作用。如果想知道每一個基類和對於的介面是如何使用的,還有元資料注入、行使用等等,可以檢視官方文件:https://help.pentaho.com/Documentation/8.1/Developer_Center/PDI/Extend/000#Sample_Step_Plugin
自定義擴充套件元件除錯
對於開發自定義外掛來說,除錯程式碼是必不可少的。這裡就簡要的說明一下如果對自定義外掛進行除錯。
1)用STS獲取Eclipse匯入外掛專案
2)將該外掛新增到Kettle-ui-swt專案的依賴中
1.選擇Configure Build Path
2.選擇Projects,然後通過Add新增Kettle-sdk-step-plugin的依賴
上面的方式容易遇到錯誤: 找不到或無法載入主類 org.pentaho.di.ui.spoon.Spoon或者是XXXStepMeta類ClassNotFound。這裡我們也可以匯入自定義外掛的Jar包進行除錯。
3)最後在啟動配置中新增要載入的外掛配置
-DKETTLE_PLUGIN_CLASSES=value,value值就是XXXXStepMeta.java的類路徑。然後Debug啟動,看到下面提交說明外掛已經被成功註冊。
找回Kettle8放棄的控制元件
在Kettle8中發現少了很多控制元件,這麼回事呢?通過查詢Kettle-engine發現Kettle內部控制元件沒有這些丟失的控制元件。
既然engine中沒有,那我就去pdi-plugins下找,結果找到了對應的外掛。也就是說在kettle的原始碼中其實存在該外掛,經過對比發現,原來是@Step註解的categoryDescription有問題。原來的是這麼寫的。
需要按照類別進行合理的修改,比如Add XML本來就是屬於Transform,那麼就將類別進行如下修改,修改完成重新打包即可。