kettle利用參數遍歷執行指定目錄下的所有對象


        使用kettle設計ETL設計完成后,我們就需要按照我們業務的需要對我們設計好的ETL程序,ktr或者kjb進行調度,以實現定時定點的數據抽取,或者說句轉換工作,我們如何實現調度呢?

       場景:在/works/wxj/test目錄下放着兩個ktr模型,我們需要每天晚上24點定時抽取數據

       如圖所示:

       

       方法一:最簡單的方法就是設計一個kjb,拖兩個ktr控件,把兩個ktr模型串起來,然后定時的調度這個kjb文件即可實現每天定時的抽取數據。

       方法二:如果隨着業務的增多,ktr文件原來越多,那么上面的情況操作起來就很麻煩,我們在目錄下新增加一個ktr模型我們就要去修改總的kjb,把新增加的ktr串進去,這樣才能保證新增加的ktr被執行到,那么下面我們來嘗試另一種方法,只要把新設計好的ktr文件放入指定目錄,調度程序就會遍歷執行該目錄下面的所有程序。

2.1:整體描述:

 大概需要的控件有:

 (1)Get repository names根據指定目錄得到所有ktr或者kjb的列表

    

(2)復制記錄到結果

 

(3)從結果獲取記錄

 

(4)設置環境變量

 

(5)表輸入與表述出job中的ktr與kjb

2.2:設計過程

 step1:新建tran_getall.ktr(讀取指定目錄下的對象,將數據寫入到內存)

 

控件1設計如下

控件2設計如下

step2:新建tran_set_variable.ktr(從內存讀取結果集,並設置環境變量)

控件3設計如下

控件4設計如下

step3:新建job_exec.kjb(傳參並執行所有指定目錄對象)

 

1處的詳細設計為

2處的詳細設計為

step4:創建job_runall.kjb(調度所有對象,根據邏輯設計執行順序)

 

從上面可以大概的看出,tran_getall是從資源庫得到目錄下面的所有內容,job_exec這個是傳參賦值並且執行所有對象,這樣的順序是正確的。

1處的詳細設計為

2處的詳細設計為

2處需要注意的是

一定要勾上對每個輸入行執行一次,這樣才會循環覆蓋一次變量值不然會報參數重復錯誤

 

job_exec的作用也就在這個地方,否則就可以講job_exec省去,把所有的邏輯放在job_runall里面來實現了,OK 設計完畢運行job_runall.

執行成功,看結果

看遍歷排序

 OK,效果實現,這樣無論目錄/works/wxj/test下有多少個ktr或者kjb都會被遍歷執行了,不必一個一個的去串起來

PS:需要注意的是如果遇到特殊的業務邏輯比如涉及到ktr執行先后順序的,必須先跑ktr1才可以跑ktr2的需要單獨拿出來處理。因為遍歷目錄的時候的順序不是我們手工可以改變的,至少現在我還沒有發現可以控制順序來執行的方法。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM