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