利用Kettle進行數據同步(上)

版權聲明:
本文爲博主原創文章,未經博主容許不得轉載。關注公衆號 技術匯(ID: jishuhui_2015) 可聯繫到做者。

寫這篇文章,是源於公司內部的一個常見需求:將生產環境的數據同步到測試環境,以便更方便的進行測試和bug定位。數據庫

起初是用的Navicat Premium這款DB管理軟件,功能很是強大了,足以知足開發人員的平常工做需求,也包括上述的數據同步需求。安全

隨着公司業務日臻完善,對於數據的安全性提出了更爲嚴格的要求。工具

實際上,是不容許將任何環境的數據同步至生產環境的,便是生產環境的數據是錯誤的。Navicat Premium有數據傳輸這一功能,可以將一個數據庫傳輸並覆蓋到另一個數據庫,沒有任何限制。學習

此外,爲了不開發人員直接接觸到生產數據庫,筆者將高權限的帳號都收回了,只授予其只讀權限,保留了數據查看的能力。如果如此,那麼數據同步的工做壓力就指向了筆者。測試

爲了尋求更爲方便、穩定的方式去完成這個數據同步的工做,筆者把思路聚焦在了ETL工具上了。ui

若是僅僅是爲了完成數據同步的功能需求,把ETL的概念拿出來未免顯得有些班門弄斧了。考慮到之後還會有數據處理方面的需求,研究一款ETL工具勢在必行(在寫此篇文章的時候,就出現了一個導出Excel的功能需求)。spa

理論上,平常內部的ETL需求均可以經過「代碼 + 腳本」的方式實現。可是,在筆者看來都是無心義的重複造輪子,耗時耗力,若是能掌握一款ETL工具,無疑能減輕很多的工做量。設計

固然,市面上的ETL工具也不在少數,國內外的企業都有成品,可是本着開源免費,強大好用的原則,最終就只剩下kettle了。orm

使用kettle以前,仍是須要有一些基礎知識背景。說直白點,若是給不懂技術的PM使用,都將會以一句「mmp」結束。全面學習kettle是沒有必要的,可是應該知道它能有哪些功能,大體能完成哪些工做,以便從此充分利用之。推薦閱讀這篇文章
ETL的過程就是一條工做流,如下是這次要實現的數據同步流程:對象

數據同步流程

客戶端填充兩方數據庫的設置信息,如:host、user、password、database等,這些設置信息都將以variable的形式存在於kettle中。

由於指定的database中可能有多張表,因此在kettle內部中,循環的執行獲取數據,清空表,提交數據的流程。

固然,流程之間仍是有些細節的,下面將講解如何用kettle搭建數據庫同步的工程。

此工程中的做業(Job)和轉換(Transformation)有嵌套關係,本着「自頂向下的設計,自底向上的實現」的原則,咱們先將幾個子流程都配置好,再進行相關的串聯。

新建一個轉換,保存命名爲「提交數據.ktr」。

準備兩個數據庫鏈接,主對象樹->右鍵DB鏈接->新建。
DB-FROM

DB-TO

能夠看到,已經預留了DB相關的variable,使用${variable}的形式。

特別說明:密碼也是按照了這種形式填寫,kettle也能識別這是一個variable

由於其餘做業和轉換都用到了這兩個DB鏈接,能夠將其設置成共享
共享DB鏈接

新建Transformation,保存命名爲「數據同步.ktr」。
提交數據流程
T1:清空表。核心對象->腳本->執行SQL腳本。要清空的表名使用variable代替了,勾選「變量替換」的CheckBox。
清空表
T2:獲取表數據。核心對象->輸入->表輸入。獲取表裏的所有數據,選擇數據來源,表名使用variable代替了,勾選「替換SQL語句的替換」的CheckBox。
獲取表數據
T3:提交數據。核心對象->輸入->表輸出。選擇數據庫鏈接,目標表使用variable代替,提交記錄數量指的是一次commit的數據量,視實際的數據量狀況而定,默認是1000條,而且建議勾選「使用批量插入」。
提交數據

由於須要確保清空表的操做先完成,因此作了一步阻塞。也就是不完成了T1:清空表的步驟,就不會進行T3:提交數據的步驟。

核心對象->流程->阻塞數據直到步驟都完成。
阻塞數據
再按住shift鍵,將各個步驟鏈接起來,提交數據的Transformation就完成了。

接下來是獲取表名的Transformation:
獲取表名
新建Transformation,保存命名爲「獲取全量表名.ktr」。

T1:獲取表名,核心對象->輸入->獲取表名,選擇數據庫鏈接,勾選「包含表」便可,名稱字段能夠自定義,這裏設置的是table_name。
獲取表名

T2:選擇字段,核心對象->轉換->字段選擇。主要是指定須要的字段,顯然咱們須要table_name字段,也能夠自定義更名,這裏更名成tablename。
選擇字段
T3:複製記錄到結果,核心對象->做業->複製記錄到結果。主要是做爲下一個步驟的輸入。
複製結果

再按住shift鍵,將各個步驟鏈接起來,獲取表名的Transformation就完成了。

接下來是一箇中間的轉換過程,就是取出表名,而後設置到指定的變量中,以便提交數據的時候獲取${TABLENAME}。

新建轉換,保存命名爲「獲取變量.ktr」。

T1:獲取表名變量值,核心對象->做業->從結果獲取記錄,指定要獲取的字段名稱是tablename,就是上述獲取表名更名成的tablename。
獲取表名變量值
T2:設置變量值,核心對象->做業->設置變量,設置TABLENAME變量,選擇變量做用範圍「Valid in the root job」。
設置變量值
至此,全部的Transformation都完成了,須要經過Job來鏈接Transformation了。

新建Job,保存命名爲「獲取變量-數據同步.kjb」,分別在覈心對象中添加一個START,和兩個轉換,兩個轉換分別對應了上述已經準備好的「獲取變量.ktr」和「數據同步.ktr」,鏈接起來便可。
獲取變量-數據同步

接下來是最後一個Job,新建Job,保存命名爲「entrypoint.kjb」。添加一個START,一個轉換,一個做業和一個成功結束節點。
entrypoint
獲取全量表名返回的結果是一個列表,因此「獲取變量-數據同步」做業須要循環執行。在設置做業的時候,勾選「執行每個輸入行」。
執行每個輸入行

至此,整個數據同步的工程已經搭建好了,便可運行entrypoint.kjb。在運行的時候,須要設置數據庫的相關參數。
執行做業

作到這一步,仍是不夠的,每次執行做業還須要輸入這麼多參數,還有可能會出現失誤。

kettle的強大之處就是還提供了Java API,能夠基於此,作更高層次的抽象,使操做成本進一步下降。

下篇將講解如何實現一個基於kettle的數據同步系統。

關注咱們

相關文章
相關標籤/搜索