1. 程式人生 > >Kettle — 自定義外掛

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,那麼就將類別進行如下修改,修改完成重新打包即可。