郭德卿,徐國強,李娜
(中國汽車技術(shù)研究中心有限公司 中汽數(shù)據(jù)(天津)有限公司,天津 300300)
隨著數(shù)字時代的到來,數(shù)據(jù)科學技術(shù)不斷發(fā)展,社會各行各業(yè)都越發(fā)地重視數(shù)據(jù),數(shù)據(jù)使得行業(yè)間更加密切,企業(yè)對數(shù)據(jù)需求的及時性也相應(yīng)提高?;A(chǔ)數(shù)據(jù)點對點傳輸、數(shù)據(jù)更新同步則尤為重要。
數(shù)據(jù)傳輸和同步的方法多種多樣,本文將介紹以Kettle作為工具的一些使用方法。
Kettle是一款開源的ETL工具,主要用來完成數(shù)據(jù)的抽取,清洗、轉(zhuǎn)換和加載等數(shù)據(jù)處理方面的工作。Kettle不僅提供了簡單明了的圖形界面,它的流程式設(shè)計也非常方便易用。功能特點方面,Kettle支持全面的數(shù)據(jù)訪問及多平臺部署,擁有優(yōu)秀的插件架構(gòu)擴展性,經(jīng)過長期的優(yōu)化升級,全面實現(xiàn)高效穩(wěn)定的數(shù)據(jù)處理[1]。
Kettle的控件包含兩個部分,即作業(yè)(Job)和轉(zhuǎn)換(Trans-form)。
作業(yè)屬于步驟流,是將若干獨立的步驟,按照先后的執(zhí)行順序形成一個工作流。生活中大部分事務(wù)都可以形成工作流,比如我們沖咖啡這一舉動,需要經(jīng)過以下步驟:燒水、準備咖啡杯、倒入咖啡,開水沖泡。每個步驟有著先后順序,按照順序組合后,就完成了沖咖啡的舉動。Kettle作業(yè)原理也是如此,作業(yè)中的每一個步驟,都必須等前面的步驟執(zhí)行完畢,后面的步驟才會執(zhí)行,如此待完成全部步驟后就完成了此作業(yè)。
轉(zhuǎn)換屬于數(shù)據(jù)流,是指從輸入(Input)到輸出(Output)之間的數(shù)據(jù)流動,針對的是在數(shù)據(jù)流動過程中的每一條記錄的處理,比如通過一定邏輯的輸入,經(jīng)過轉(zhuǎn)換,再輸出為我們想要的數(shù)據(jù)。轉(zhuǎn)換通常作為作業(yè)中的一個步驟而存在。轉(zhuǎn)換是Kettle開發(fā)的基礎(chǔ),也是本文主要介紹的功能模塊[2]。
Kettle作為ETL工具包含了三方面核心技術(shù)功能,即抽取(Extract)、轉(zhuǎn)換(Transform)、裝載(Load)。
數(shù)據(jù)抽取是所有工作的前提,是將各種生產(chǎn)環(huán)境中的數(shù)據(jù)提取到開發(fā)環(huán)境中,一般情況下,企業(yè)在生產(chǎn)制造過程中,會產(chǎn)生大量的相關(guān)生產(chǎn)數(shù)據(jù),而我們的生產(chǎn)環(huán)境通常包含多個不同的數(shù)據(jù)源。Kettle可以支持多種數(shù)據(jù)源輸入,通常我們用到的有兩種:數(shù)據(jù)庫輸入和文本文件輸入。
圖1 數(shù)據(jù)輸入
然后通過預(yù)設(shè)定的邏輯進行數(shù)據(jù)轉(zhuǎn)換處理,通常有:字段選擇、過濾、排序和字段處理等。
圖2 數(shù)據(jù)轉(zhuǎn)換
最后輸出結(jié)果數(shù)據(jù),主要包括表輸出、插入/更新、文本輸出等(圖3)。
Kettle以工作流的方式定義數(shù)據(jù)傳輸與同步的規(guī)則,通過執(zhí)行任務(wù)實現(xiàn)對數(shù)據(jù)的更新加載。此過程有多種方案可以采納,如:
(1)通過觸發(fā)器進行數(shù)據(jù)同步,此方法實現(xiàn)了實時數(shù)據(jù)同步,但由于要在生產(chǎn)環(huán)境建立觸發(fā)器,可能會對生產(chǎn)環(huán)境產(chǎn)生一定影響。
圖3 數(shù)據(jù)輸出
(2)通過時間戳進行數(shù)據(jù)同步,此方法原理是數(shù)據(jù)發(fā)生變化時,時間戳會記錄數(shù)據(jù)發(fā)生變化的時間,根據(jù)時間比較進行數(shù)據(jù)傳輸同步。
(3)通過數(shù)據(jù)比較進行同步,此方法原理是兩邊數(shù)據(jù)比對進行數(shù)據(jù)傳輸同步,相對時間戳法效率較低,一般用于實時性較低的需求場景。
(4)通過全表拷貝進行同步,此方法是定期清空目標數(shù)據(jù)源,并將源數(shù)據(jù)整體導入目標數(shù)據(jù)源,此方案開發(fā)簡單,但只適用于體積較小的數(shù)據(jù)[3]。
以上四種方法,我們會根據(jù)不同的業(yè)務(wù)場景,酌情進行使用。在數(shù)據(jù)同步過程中,包含以下幾點核心處理環(huán)節(jié):
(1)數(shù)據(jù)庫連接:Kettle提供了多種數(shù)據(jù)庫連接方式,打開Kettle的DB連接中,可以配置所有數(shù)據(jù)庫的連接,包括JDBC、ODBC和JNDI,多數(shù)情況下,我們使用JDBC和ODBC兩種方式。值得注意的是在成功配置數(shù)據(jù)源之后,該數(shù)據(jù)源默認為局部數(shù)據(jù)源,可將此數(shù)據(jù)源共享為全局數(shù)據(jù)源,在創(chuàng)建其他新轉(zhuǎn)換時可直接使用。
(2)抽取數(shù)據(jù):Kettle數(shù)據(jù)抽取主要使用輸入模塊的表輸入來實現(xiàn),通過SELECT語句,從數(shù)據(jù)庫抽取輸入數(shù)據(jù)。提取表中數(shù)據(jù)后,選擇、比對、修改需要同步的數(shù)據(jù),根據(jù)業(yè)務(wù)邏輯進行相應(yīng)的新增、修改、刪除目標表的數(shù)據(jù),需要注意的是前后數(shù)據(jù)表需要同步數(shù)據(jù)的字段必須一一對應(yīng)。
(3)數(shù)據(jù)轉(zhuǎn)換:Kettle里面沒有單一的數(shù)據(jù)轉(zhuǎn)換步驟,是有許多步驟組合起來完成數(shù)據(jù)轉(zhuǎn)換的功能。由于各業(yè)務(wù)系統(tǒng)數(shù)據(jù)格式不統(tǒng)一、數(shù)據(jù)不規(guī)范,需要使用大量的數(shù)據(jù)清洗轉(zhuǎn)換工作來實現(xiàn)數(shù)據(jù)規(guī)范化,針對具體數(shù)據(jù)內(nèi)容,通過建立數(shù)據(jù)標準化邏輯,完成對基礎(chǔ)數(shù)據(jù)的規(guī)范化處理。Kettle一整套的數(shù)據(jù)處理轉(zhuǎn)換組件功能十分強大,下面就我們經(jīng)常用到的功能進行介紹:
增加常量,經(jīng)常用到ID作為主鍵,我們可以在Kettle中增加序列,并且能夠自定義序列步長;
計算器功能,做一些簡單的數(shù)學運算及日期相關(guān)計算;
字符串處理,替換指定字符,大小寫轉(zhuǎn)換和特殊字符轉(zhuǎn)換等;
行列轉(zhuǎn)換,先進行數(shù)據(jù)聚合排序,然后進行列轉(zhuǎn)換;
字段篩選,常用作數(shù)據(jù)轉(zhuǎn)換條件,當滿足條件時可執(zhí)行其他轉(zhuǎn)換。
(4)數(shù)據(jù)校驗:基于各業(yè)務(wù)場景的數(shù)據(jù)質(zhì)量問題,實現(xiàn)數(shù)據(jù)項的基礎(chǔ)邏輯關(guān)系校驗,剔除不符合校驗規(guī)則的數(shù)據(jù),完成數(shù)據(jù)質(zhì)量檢查,解決業(yè)務(wù)數(shù)據(jù)排查困難的問題。
(5)數(shù)據(jù)輸出:Kettle數(shù)據(jù)輸出主要使用輸出模塊的表輸出來實現(xiàn),但根據(jù)業(yè)務(wù)需求不同,我們可以選擇需要的插件,比如插入/更新插件具備更新、插入等功能,但此插件相對于表輸出來說效率相對較低[4]。
對于數(shù)據(jù)及時性有較高要求的業(yè)務(wù)場景中,比如我們汽車產(chǎn)業(yè)中的生產(chǎn)制造數(shù)據(jù),每時每刻都會有汽車下線,這就是說汽車生產(chǎn)數(shù)據(jù)是實時變化的,要求我們數(shù)據(jù)同步相應(yīng)迅速快捷,此業(yè)務(wù)場景需要使用觸發(fā)器來實現(xiàn)數(shù)據(jù)的同步傳輸。以insert為例,我們在生產(chǎn)環(huán)境的源表中建立一個insert觸發(fā)器和一個表結(jié)構(gòu)與源表相同的臨時表,每當有新數(shù)據(jù)插入時,都會將新插入的數(shù)據(jù)自動的導入臨時表,然后使用全表拷貝的方法將臨時表同步到開發(fā)環(huán)境中,并將臨時表插入目標表中,這樣就完成了數(shù)據(jù)庫之間增量數(shù)據(jù)的更新。除了insert可以建立觸發(fā)器,還可以在update和delete時建立觸發(fā)器,原理是一樣的。
在日常工作中,我們用到最多的數(shù)據(jù)同步方法是時間戳法。相較于觸發(fā)器的使用,時間戳開發(fā)和使用上更加簡單,不足之處就是時間戳必須在兩邊增加一個時間字段,會占用存儲空間,并且此方法不能進行delete的同步操作。時間戳法使用上,我們首先要創(chuàng)建一個時間戳表,記錄每一次抽取數(shù)據(jù)的時間。然后,每次獲取時間戳中最后一次抽取數(shù)據(jù)的時間,我們采用大于max(取數(shù)時間)作為同步條件,取到上次抽取以后的數(shù)據(jù),再將其插入到目標表中。最后將本次取數(shù)時間插入時間戳表,完成時間戳的更新,為下一次數(shù)據(jù)同步做準備。具體工作流程如下:
圖4 數(shù)據(jù)轉(zhuǎn)換
圖5 表輸入
數(shù)據(jù)比較的同步方法,多數(shù)情況在需要將新老數(shù)據(jù)對比,做相應(yīng)操作轉(zhuǎn)換中進行數(shù)據(jù)同步,可根據(jù)數(shù)據(jù)比對變化做相應(yīng)的刪除,插入和更新操作。相對時間戳法,數(shù)據(jù)比較法是一個更加完善的數(shù)據(jù)同步方法,但由于同步效率較低,我們一般用于數(shù)據(jù)體量相對較小的數(shù)據(jù)庫中。它的核心思想是將新老數(shù)據(jù)合并處理,根據(jù)主鍵判斷兩表對應(yīng)數(shù)據(jù)是否一致,合并記錄后會形成標識位,用于判斷每一條數(shù)據(jù)的狀態(tài),即更新、刪除、新增和不變。最后根據(jù)數(shù)據(jù)狀態(tài)標識來對目標表進行刪除、插入和更新等相對應(yīng)的操作。
圖6 表輸出
圖7 數(shù)據(jù)同步
全表拷貝法,顧名思義,就是清空目標表,將源表整體插入到目標表中,此種方法多數(shù)用于維度表同步方案中,要求更新頻次較低,數(shù)據(jù)量較少,同時開發(fā)維護也最為簡單便捷。
在進行數(shù)據(jù)同步之前,我們需要根據(jù)業(yè)務(wù)需求,制訂一套專業(yè)的數(shù)據(jù)傳輸與同步方案,編譯為Kettle可識別的流程和規(guī)則,從而持續(xù)高效地實現(xiàn)數(shù)據(jù)的自動同步[5]。
本文通過對Kettle工具在數(shù)據(jù)傳輸與同步的應(yīng)用研究,針對四種數(shù)據(jù)傳輸與同步方法,進行了詳細的解析說明。實現(xiàn)了數(shù)據(jù)庫中新老數(shù)據(jù)表的同步更新,構(gòu)建了業(yè)務(wù)數(shù)據(jù)庫的正常維護流程。Kettle允許用戶管理來自不同數(shù)據(jù)庫的數(shù)據(jù),通過提供一個圖形化的開發(fā)環(huán)境,實現(xiàn)數(shù)據(jù)傳輸與同步。Kettle支持絕大部分數(shù)據(jù)庫,可以做到不同類型的多個數(shù)據(jù)庫之間數(shù)據(jù)的同步更新,既滿足了業(yè)務(wù)場景需求,降低了運維管理人員成本,提高了數(shù)據(jù)庫使用效率,解決了不同數(shù)據(jù)庫之間的共享問題。