在我們做ETL工作的時候,在某些項目中往往會遇到一些特別的流程任務(wù),kettle原有的流程處理節(jié)點(diǎn)已經(jīng)不能滿足我們的要求,這時候我們就需要定制流程處理節(jié)點(diǎn)了。定制流程節(jié)點(diǎn)主要是針對數(shù)據(jù)的管理、數(shù)據(jù)的驗(yàn)證和某些特別文件數(shù)據(jù)的提取。大家通過查看kettle源代碼,就可以知道怎樣去創(chuàng)建你自己的kettle插件了。
這篇文章主要告訴大家在kettle 4.0版本上怎樣開發(fā)一個transformation類型的簡單插件,這個插件可以接受任何記錄流,然后在流后面再添加一個帶值的字段,用戶能夠定義字段的名稱,插件非常簡單。O(∩_∩)O~ 我將盡可能簡潔的介紹開發(fā)插件需要掌握的一些接口規(guī)范。
準(zhǔn)備工作:
1、下載pdi-ce-4.0.0-stable.zip,供桌面測試用。
2、下載eclipse,任何版本都可以,裝好SVN插件,后面下載kettle源代碼之用。
3、 下載標(biāo)準(zhǔn)插件源代碼模板工程。
建立插件工程:
1、 將下載的“標(biāo)準(zhǔn)插件源代碼模板工程”導(dǎo)入到您的工作空間
2、 導(dǎo)入后工程會有一些錯誤,那是因?yàn)橐蕾嚨陌鼪]有導(dǎo)入。這時,你需要解壓pdi-ce-4.0.0-stable.zip,進(jìn)入解壓目錄將lib目錄下面kettle打頭的所有jar包以及l(fā)ibswt/win32下面的swt.jar包(這個大家依賴操作系統(tǒng)導(dǎo)入)加入工程環(huán)境變量里面。
3、 重新編譯一下工程,應(yīng)該就沒有錯誤了。
kettle轉(zhuǎn)換步驟工作組件:
這里有四個類構(gòu)成了這個kettle 步驟/節(jié)點(diǎn),每一個類都有其特定的目的及所扮演的角色。
TemplateStep: 步驟類實(shí)現(xiàn)了StepInteface接口,在轉(zhuǎn)換運(yùn)行時,它的實(shí)例將是數(shù)據(jù)實(shí)際處理的位置。每一個執(zhí)行線程都表示一個此類的實(shí)例。
TemplateStepData: 數(shù)據(jù)類用來存儲數(shù)據(jù),當(dāng)插件執(zhí)行時,對于每個執(zhí)行的線程都是唯一的。執(zhí)行時里面存儲的東西主要包括數(shù)據(jù)庫連接、文件句柄、緩存等等其他東西。
TemplateStepMeta: 元數(shù)據(jù)類實(shí)現(xiàn)了StepMetaInterface接口。它的職責(zé)是保存和序列化特定步驟實(shí)例的配置,在我們這個例子中,它負(fù)責(zé)保存用戶設(shè)置的步驟名稱和輸出字段的名稱。
TemplateStepDialog:對話框類實(shí)現(xiàn)了該步驟與用戶交互的界面,它顯示一對話框,通過對話框用戶可以自己的喜好設(shè)定步驟的操作。對話框類與元數(shù)據(jù)類關(guān)系非常緊密,O(∩_∩)O~ 想想為什么吧? (元數(shù)據(jù)類可以追蹤用戶的設(shè)置)
除了上面的代碼,還有一個plugin.xml,它設(shè)置好了插件的元數(shù)據(jù),定義了步驟在kettle圖形工作臺中的顯示效果。為了更好的讓大家理解,我將利用這個步驟設(shè)計一個轉(zhuǎn)換流程并執(zhí)行它。對于插件的開發(fā),我們將從plugin.xml配置文件開始講起,然后講講元數(shù)據(jù)和對話框類,最后再講講步驟類和數(shù)據(jù)類。
書寫你自己的plugin.xml:
下面plugin.xml是我們這個插件里面的內(nèi)容,它的功能是告訴kettle插件的元數(shù)據(jù)類,插件的名稱及描敘,還有需要加載的jar包。想要了解細(xì)節(jié),可以查看文章:plug-in loading
<?xml version="1.0" encoding="UTF-8"?>
<plugin
id="TemplatePlugin"
iconfile="icon.png"
description="Template Plugin"
tooltip="Only there for demonstration purposes"
category="Demonstration"
classname="plugin.template.TemplateStepMeta"> <libraries>
<library name="templatestep.jar"/>
</libraries>
</plugin>
ID:在kettle插件中必須全局唯一,因?yàn)楸籯ettle序列化了,所以不要隨便改變
Iconfile: kettle中插件顯示的圖片,必須是png圖片
Description:插件描敘,顯示在樹形菜單里面。
Tooltip:樹形菜單中,鼠標(biāo)滑過的時候顯示的提示信息
Category:插件顯示的父目錄
Classname:元數(shù)據(jù)類
Library:指明了插件需要加載所依賴的jar包
一、元數(shù)據(jù)類:
下面顯示了元數(shù)據(jù)的幾個關(guān)鍵的方法,注意元數(shù)據(jù)類里面用私有成員變量outputField 存儲了下一個步驟的輸出字段。
// keep track of the step settings
public String getOutputField()
public void setOutputField(…)
public void setDefault()
// serialize the step settings to and from xml
public String getXML()
public void loadXML(…)
// serialize the step settings to and from a kettle repository
public void readRep(…)
public void saveRep(…)
// provide information about how the step affects the field structure of processed rows
public void getFields(…)
// perform extended validation checks for the step
public void check(…)
// provide instances of the step, data and dialog classes to Kettle
public StepInterface getStep(…)
public StepDataInterface getStepData()
public StepDialogInterface getDialog(…)
TemplateStepMeta元數(shù)據(jù)類其實(shí)還有很多方面,不過大多被他的父類BaseStepMeta給默認(rèn)實(shí)現(xiàn)了,這些默認(rèn)的實(shí)現(xiàn)足以使我們的元數(shù)據(jù)類工作良好。想要了解更多,大家可以查查關(guān)于StepMetaInteface和BaseStepMeta的kettle官方文檔。
二、對話框類:
TemeplateStepDialog為步驟實(shí)現(xiàn)了對話框的設(shè)置,kettle的用戶界面部件是使用的eclipse的swt框架,如果要開發(fā)比較復(fù)雜的對話框,你還必須熟悉大部分swt代碼。 Swt文檔大家可以從eclipse上的幫助菜單點(diǎn)擊在線獲取。在開發(fā)過程中,一個對話框?qū)ο髶碛幸粋€元數(shù)據(jù)對象,它記錄了應(yīng)該從哪里讀取配置?應(yīng)該把設(shè)置好的配置保存在哪里? 它僅僅設(shè)置了輸出字段的名稱在我們這個模板步驟里面。一個繼承自BaseStepDialog特定的對話框類必須提供open(…)方法,這個方法必須返回這個步驟的名稱(發(fā)生改變時)或NULL(對話框被取消時)
三、步驟類:
步驟類是實(shí)際的處理和轉(zhuǎn)換工作的地方。因?yàn)榇蟛糠謽颖敬a已經(jīng)由父類BaseStep提供了,大多數(shù)插件僅僅關(guān)注下面幾個特定的方法就行。
// initialization and teardown
public boolean init(…)
public void dispose(..)
// processing rows
public void run()
public boolean processRow(..)
Init()方法在轉(zhuǎn)換執(zhí)行前被kettle調(diào)用,轉(zhuǎn)換必須在所有步驟初始化成功時才真正執(zhí)行。我們這個模板步驟沒有做任何事情,這里僅僅是拿出來讓大家了解了解。
dispose()方法是在步驟執(zhí)行完之后執(zhí)行(非轉(zhuǎn)換執(zhí)行完哈),它完成資源的關(guān)閉,像文件句柄、緩存等等。
run()方法在實(shí)際處理記錄集的時候調(diào)用。里面其實(shí)是個調(diào)用processRow()方法處理記錄的小循環(huán),當(dāng)此步驟再沒有數(shù)據(jù)處理或轉(zhuǎn)換被停止時退出循環(huán)。
processRow()方法在處理單條記錄的時候被調(diào)用。這個方法通常通過調(diào)用getRow()來獲取需要處理的單條記錄。 這個方法如果有需要將會被阻塞,例如當(dāng)此步驟希望放慢腳步處理數(shù)據(jù)時。processRow()隨后的流程將執(zhí)行轉(zhuǎn)換工作并調(diào)用putRow()方法將處理過的記錄放到它的下游步驟。
注意:你的步驟可能會變記錄的結(jié)構(gòu),為了安全起見,一定要多熟悉包org.pentaho.di.core.row,特別是類RowMetaInterface和RowDataUtil。
基類BaseStep對處理的記錄提供了第一次訪問的標(biāo)識,在某些代碼只執(zhí)行一次的時候可能非常有用,例如某個費(fèi)時的查找,其實(shí)這就是緩存。
四、數(shù)據(jù)類:
大多數(shù)步驟都需要臨時的緩沖或者臨時的數(shù)據(jù)。數(shù)據(jù)類就是這些數(shù)據(jù)合適的存放位置。每一個執(zhí)行線程將得到其擁有的數(shù)據(jù)類實(shí)例,所以它能在獨(dú)立的空間里面運(yùn)行。TemplateStepData繼承自BaseStepData,作為一個經(jīng)驗(yàn)法則,不要將non-constant字段放置BaseStepData類里面,如果你必須,請將它最好放置TemplateStepData數(shù)據(jù)類里面.
我們的步驟僅僅使用了一個數(shù)據(jù)對象來存儲記錄集輸出的結(jié)構(gòu),沒有用到其他的存儲介質(zhì),例如文件等等。
本站僅提供存儲服務(wù),所有內(nèi)容均由用戶發(fā)布,如發(fā)現(xiàn)有害或侵權(quán)內(nèi)容,請
點(diǎn)擊舉報。