趙亞偉
摘要:在學(xué)校各系統(tǒng)運(yùn)行管理過程中,產(chǎn)生了大量寶貴的數(shù)據(jù)資源,這些數(shù)據(jù)對(duì)學(xué)校重要決策制定及傳統(tǒng)教育模式改革有著極其重要的作用。因此,如何將不同維度的數(shù)據(jù)采集到統(tǒng)一的數(shù)據(jù)中心便成為大數(shù)據(jù)研究的重點(diǎn)之一。在數(shù)據(jù)采集過程中,很多學(xué)校沒有保存重要的歷史數(shù)據(jù)以及已刪除記錄的狀態(tài)標(biāo)記,將對(duì)數(shù)據(jù)分析中諸如時(shí)間切片分析、歷史狀態(tài)分析等產(chǎn)生致命影響。以學(xué)校人事系統(tǒng)為例,提出一種基于Kettle的無損增量數(shù)據(jù)同步方法。該方法利用全量數(shù)據(jù)比對(duì)方式,找出新增、修改和刪除的數(shù)據(jù),并對(duì)其進(jìn)行詳細(xì)記錄,從而實(shí)現(xiàn)了對(duì)歷史數(shù)據(jù)的完整保留,彌補(bǔ)了如時(shí)間切片分析等數(shù)據(jù)分析策略中數(shù)據(jù)不足的缺陷。
關(guān)鍵詞:數(shù)據(jù)采集;增量同步;Kettle;教育大數(shù)據(jù)
DOI:10.11907/rjdk.191530開放科學(xué)(資源服務(wù))標(biāo)識(shí)碼(OSID):
中圖分類號(hào):TP301文獻(xiàn)標(biāo)識(shí)碼:A 文章編號(hào):1672-7800(2019)010-0055-04
0引言
近年來,大數(shù)據(jù)為人們帶來的價(jià)值逐漸被各國認(rèn)識(shí)并重視。隨著美國聯(lián)邦部門發(fā)布《大數(shù)據(jù)研究與發(fā)展計(jì)劃》,英國出臺(tái)《把握數(shù)據(jù)帶來的機(jī)遇:英國數(shù)據(jù)能力戰(zhàn)略》,法國頒布《數(shù)字化路線圖》等,大數(shù)據(jù)發(fā)展進(jìn)入一個(gè)嶄新階段。在教育領(lǐng)域,國際著名期刊《Nature》和《Sci-enee》分別于2008和2011年推出大數(shù)據(jù)???,美國教育部于2012年10月發(fā)布《通過教育數(shù)據(jù)挖掘和學(xué)習(xí)分析促進(jìn)教與學(xué)》報(bào)告,中國計(jì)算機(jī)學(xué)會(huì)于2012年舉辦了“大數(shù)據(jù)時(shí)代,智謀未來”報(bào)告會(huì)。由此可見,數(shù)據(jù)在未來生活中有著舉足輕重的地位。
信息化建設(shè)的迅速推進(jìn)使高校業(yè)務(wù)系統(tǒng)發(fā)生了巨大變革,將許多高校工作者從繁重的重復(fù)勞動(dòng)中解放出來。然而,在學(xué)校各系統(tǒng)運(yùn)行過程中,也產(chǎn)生了很多問題,例如:各系統(tǒng)間相對(duì)獨(dú)立、編碼標(biāo)準(zhǔn)不統(tǒng)一、數(shù)據(jù)分散、信息重復(fù)、信息沖突等。在“數(shù)據(jù)即資源”的大數(shù)據(jù)時(shí)代,這些問題顯得尤為突出。要解決這些問題并實(shí)現(xiàn)數(shù)據(jù)分析的目標(biāo),首先需要建立一個(gè)標(biāo)準(zhǔn)統(tǒng)一、信息相對(duì)正確的數(shù)據(jù)中心,而數(shù)據(jù)中心的建設(shè)離不開數(shù)據(jù)采集。一般而言,數(shù)據(jù)采集分為數(shù)據(jù)庫采集、日志采集與網(wǎng)絡(luò)采集等方式,由于高校大部分業(yè)務(wù)系統(tǒng)采用關(guān)系型數(shù)據(jù)庫存儲(chǔ)數(shù)據(jù),所以本文主要針對(duì)數(shù)據(jù)庫采集方式進(jìn)行研究。
數(shù)據(jù)庫采集一般都是通過創(chuàng)建定時(shí)任務(wù)實(shí)現(xiàn)的,即在某個(gè)特定時(shí)間或周期內(nèi)將變化的數(shù)據(jù)同步到數(shù)據(jù)中心。然而在目前主流的數(shù)據(jù)采集工程中,很少有學(xué)校注意到歷史數(shù)據(jù)保存情況,也即是說,數(shù)據(jù)中心保存的只是新增與變化后的數(shù)據(jù),對(duì)于變化前的數(shù)據(jù)以及刪除的歷史數(shù)據(jù)卻缺乏相應(yīng)的保存記錄,從而導(dǎo)致在數(shù)據(jù)分析過程中存在數(shù)據(jù)缺失的情況,進(jìn)而影響到分析結(jié)果的準(zhǔn)確性。本文提出一種基于Kettle的無損增量數(shù)據(jù)同步方法,填補(bǔ)了數(shù)據(jù)中心重要?dú)v史數(shù)據(jù)缺失的空白,對(duì)于數(shù)據(jù)中心的建設(shè)可起到重要作用。
1工具介紹
數(shù)據(jù)采集中使用的主流技術(shù)是ETL技術(shù),其是Extract(抽取)、Transform(轉(zhuǎn)換)、Load(加載)首字母的縮寫組合,也是數(shù)據(jù)采集入庫的基本過程。它是指將異構(gòu)數(shù)據(jù)源中的數(shù)據(jù)經(jīng)過數(shù)據(jù)抽取以獲取有價(jià)值的信息,進(jìn)而按照一定規(guī)則對(duì)數(shù)據(jù)進(jìn)行清洗,最后裝入數(shù)據(jù)中心的過程。其中,數(shù)據(jù)源的數(shù)據(jù)形式包括各種結(jié)構(gòu)化數(shù)據(jù)及非結(jié)構(gòu)化數(shù)據(jù)。
目前ETL技術(shù)中比較流行的工具有:Oracle Ware-house Builder(簡(jiǎn)稱OWB)、Oracle Data Integrator(簡(jiǎn)稱ODI)、Informatica、Datastage、Kettle等。
其中,OWB主要用于Oracle數(shù)據(jù)庫中數(shù)據(jù)的ETL、數(shù)據(jù)審計(jì)等場(chǎng)合,但其只能用在基于Oracle的數(shù)據(jù)庫系統(tǒng)中,而不能完成異構(gòu)數(shù)據(jù)庫的數(shù)據(jù)集成工作。ODI的前身是Sunopsis Active Integration Platform,Oracle收購Sunopsis后改名為ODI。ODI可以完成幾乎所有種類RDBMS數(shù)據(jù)庫的數(shù)據(jù)集成工作,同時(shí)使用ODBC技術(shù),也可以完成對(duì)文本、Excel文件、音視頻文件等非結(jié)構(gòu)化數(shù)據(jù)的集成工作。
Informatica和Datastage都是商業(yè)化ETL工具軟件,價(jià)格較高,可提供很好的售后技術(shù)支持,Informatica需要進(jìn)行客戶端與服務(wù)器部署,Datastage的部署則比較復(fù)雜。兩者都有著圖形化的操作界面和監(jiān)控界面,便于進(jìn)行調(diào)試與優(yōu)化。由于是商業(yè)軟件,Informatica和Datastage基本無法自行擴(kuò)展。
Kettle是一款免費(fèi)、開源的ETL工具,基于Java語言開發(fā),有著大量用戶基礎(chǔ),可以跨平臺(tái)使用以及進(jìn)行項(xiàng)目移植。Kettle提供圖形化的操作界面進(jìn)行異構(gòu)數(shù)據(jù)庫以及非結(jié)構(gòu)化數(shù)據(jù)的集成工作,并采用并行、集群等方式高效率地完成數(shù)據(jù)傳輸任務(wù)。
Kettle主要使用兩種腳本文件實(shí)現(xiàn)數(shù)據(jù)集成:Trans-form(轉(zhuǎn)換)和Job(作業(yè))。其中,轉(zhuǎn)換主要完成數(shù)據(jù)庫中字段選擇、數(shù)據(jù)清洗、數(shù)據(jù)入庫等精細(xì)化工作,作業(yè)主要實(shí)現(xiàn)工作流控制及工作任務(wù)調(diào)度等。Transform和Job工程文件可以資源庫(數(shù)據(jù)庫)形式和文件(.ktr和.kjb)形式存儲(chǔ)。Kettle概念模型如圖1所示。
2數(shù)據(jù)同步方式
數(shù)據(jù)同步方式總體分為全量同步與增量同步。
2.1全量同步方式
全量同步是指在某個(gè)時(shí)間點(diǎn)或時(shí)間周期內(nèi)將所有數(shù)據(jù)拷貝到目標(biāo)數(shù)據(jù)庫的過程,一般有以下兩種方法:①先清空目標(biāo)數(shù)據(jù)庫,然后將全量數(shù)據(jù)拷貝過去;②先判斷新的全量數(shù)據(jù)與目標(biāo)數(shù)據(jù)庫中數(shù)據(jù)是否一致,如果不一致,則清空目標(biāo)數(shù)據(jù)庫,將全量數(shù)據(jù)拷貝過去,如果一致,則不進(jìn)行任何操作。該同步方式適用于第一次數(shù)據(jù)同步時(shí)(即目標(biāo)數(shù)據(jù)庫為空),數(shù)據(jù)量不大且實(shí)時(shí)性要求較低,或數(shù)據(jù)庫中不存在主鍵的場(chǎng)景。
2.2增量同步方式
增量同步是指在某個(gè)時(shí)間點(diǎn)或時(shí)間周期內(nèi)將變化的數(shù)據(jù)插入或更新到目標(biāo)數(shù)據(jù)庫的過程。在增量同步方式中,如何判斷增量數(shù)據(jù)便成為影響數(shù)據(jù)同步效率的關(guān)鍵問題。一般而言,可采用以下4種方法進(jìn)行判斷:
(1)觸發(fā)器:在源數(shù)據(jù)庫表中建立觸發(fā)器用來捕獲變化的數(shù)據(jù),將其放在臨時(shí)數(shù)據(jù)表中。同步任務(wù)執(zhí)行時(shí),將臨時(shí)表中的數(shù)據(jù)更新到目標(biāo)數(shù)據(jù)庫中。但該方式嚴(yán)重依賴于源數(shù)據(jù)庫,且需要對(duì)源數(shù)據(jù)庫的結(jié)構(gòu)進(jìn)行操作,一定程度上會(huì)影響業(yè)務(wù)系統(tǒng)運(yùn)行。由于高校業(yè)務(wù)系統(tǒng)廠商的復(fù)雜性,該數(shù)據(jù)同步方式一般使用較少。
(2)日志:通過分析源數(shù)據(jù)庫中的日志變化獲取更新數(shù)據(jù)。該方式同樣嚴(yán)重依賴于源數(shù)據(jù)庫類型,對(duì)于沒有提供日志分析工具或接口的數(shù)據(jù)庫而言,實(shí)施難度較大。
(3)時(shí)間戳:根據(jù)源數(shù)據(jù)表中的時(shí)間字段提取增量數(shù)據(jù)。主要有兩種方法:①建立一個(gè)臨時(shí)表存儲(chǔ)上次同步時(shí)間,同步任務(wù)執(zhí)行時(shí),讀取當(dāng)前時(shí)間和上次同步時(shí)間(臨時(shí)表),將源數(shù)據(jù)表中大于等于上次同步時(shí)間,且小于當(dāng)前時(shí)間的記錄讀取出來同步到目標(biāo)數(shù)據(jù)庫中。如果同步過程中沒有發(fā)生錯(cuò)誤,則更新臨時(shí)表中的上次同步時(shí)間字段,如果發(fā)生錯(cuò)誤,臨時(shí)表中的上次同步時(shí)間保持不變。該方式在數(shù)據(jù)同步出現(xiàn)錯(cuò)誤時(shí),部分?jǐn)?shù)據(jù)已經(jīng)同步到數(shù)據(jù)庫,導(dǎo)致在下次執(zhí)行同步任務(wù)時(shí)會(huì)出現(xiàn)大量重復(fù)數(shù)據(jù),需要浪費(fèi)很多時(shí)間執(zhí)行去重操作,從而大大降低了數(shù)據(jù)同步效率;②對(duì)方法①進(jìn)行改進(jìn),設(shè)置一個(gè)時(shí)間容錯(cuò)窗口t,在同步任務(wù)失敗時(shí),選取目標(biāo)表中的最新時(shí)間減去t作為臨時(shí)表中的上次同步時(shí)間,因?yàn)檫x取的是目標(biāo)表中的最新時(shí)間,所以該時(shí)間點(diǎn)已有數(shù)據(jù)被抽取到目標(biāo)數(shù)據(jù)庫,再往前回溯一小段時(shí)間t,從而保證在當(dāng)前時(shí)間點(diǎn)目標(biāo)數(shù)據(jù)庫中的數(shù)據(jù)不會(huì)缺失。然后,按照方法①同時(shí)抽取源數(shù)據(jù)庫和目標(biāo)數(shù)據(jù)庫中滿足條件的數(shù)據(jù),對(duì)這些數(shù)據(jù)進(jìn)行去重操作,最后將去重后的數(shù)據(jù)更新到目標(biāo)表中,任務(wù)完成后更新臨時(shí)表中上次的同步時(shí)間字段。該方法在一定程度上減少了同步失敗情況下的重復(fù)數(shù)據(jù)集合,提升了同步效率。然而,以上兩種方法都無法做到對(duì)已刪除數(shù)據(jù)的同步操作。
(4)全量數(shù)據(jù)比對(duì):將源數(shù)據(jù)表中的全量數(shù)據(jù)與目標(biāo)表中的數(shù)據(jù)一一進(jìn)行比對(duì),從而找出新增、修改以及刪除的數(shù)據(jù),進(jìn)而根據(jù)不同情況對(duì)不同類別的數(shù)據(jù)進(jìn)行處理。該方法能在最大程度上捕獲所有數(shù)據(jù)變化而基本不影響業(yè)務(wù)系統(tǒng)正常運(yùn)行,但是同步效率較低,適合對(duì)實(shí)時(shí)性要求不高的場(chǎng)景。
由于高校人事系統(tǒng)記錄了教師的個(gè)人基本信息、履歷、職稱變化、部門變化等,在組織機(jī)構(gòu)改革過程中涉及到部門名稱、部門人員以及部門編碼等變化,所以在將人事系統(tǒng)中的部分?jǐn)?shù)據(jù)表同步到數(shù)據(jù)中心過程中,需要考慮歷史記錄保存情況。當(dāng)然,由于操作失誤或其它情況導(dǎo)致的數(shù)據(jù)刪除記錄也需要捕獲到數(shù)據(jù)中心??傊?,針對(duì)該情況,需要一種無損的數(shù)據(jù)增量同步方法。所以本文借助Kettle多線程圖形化操作的特點(diǎn),采用全量數(shù)據(jù)比對(duì)方式,并以人事系統(tǒng)中部分?jǐn)?shù)據(jù)表為例,提出一種無損的增量數(shù)據(jù)同步方法。
3無損增量數(shù)據(jù)同步方法
以人事系統(tǒng)個(gè)人基本信息表為例,表結(jié)構(gòu)如表1所示
該流程一共分為6大步驟:
步驟1:使用SQL語句分別選取源數(shù)據(jù)表和目標(biāo)數(shù)據(jù)表中有價(jià)值的字段,并按相同規(guī)則進(jìn)行排序,得到數(shù)據(jù)集合A和B,然后將兩個(gè)數(shù)據(jù)集合按主鍵進(jìn)行合并記錄,獲得兩個(gè)數(shù)據(jù)集合比較之后的比較結(jié)果集G。因?yàn)槿耸孪到y(tǒng)中部分字段(如手機(jī)號(hào)、證件號(hào)、住址等)涉及敏感信息,所(僅列舉部分關(guān)鍵字段)。
從表1中的表結(jié)構(gòu)可以看到,職工號(hào)為主鍵,每個(gè)新人職的員工有唯一的職工號(hào),另外姓名、性別、民族、籍貫、出生日期、來校年月、畢業(yè)院校等字段信息為固定信息,一般情況下變動(dòng)不大,不需要留存歷史變化信息,如有更新,直接更新到數(shù)據(jù)中心目標(biāo)表中的對(duì)應(yīng)字段即可。但政治面貌、所在單位、黨政職務(wù)、專業(yè)技術(shù)職務(wù)、在職狀態(tài)、人員類別等字段則會(huì)隨著工作時(shí)間的延長(zhǎng)而發(fā)生巨大變化。一般情況下,政治面貌、黨政職務(wù)、專業(yè)技術(shù)職務(wù)等字段有專門的表記錄變化信息,而所在單位、在職狀態(tài)、人員類別則沒有對(duì)應(yīng)的表記錄變化的歷史數(shù)據(jù),能夠看到的只是當(dāng)前狀態(tài)數(shù)據(jù),這對(duì)于數(shù)據(jù)中心建設(shè)及后續(xù)數(shù)據(jù)分析工作是十分不利的。
例如某員工入職一年后從信息學(xué)院調(diào)到科研處,所在單位和人員類別均發(fā)生了變化,如果在數(shù)據(jù)中心只存儲(chǔ)最終數(shù)據(jù)結(jié)果,在分析歷年各部門人員數(shù)量以及學(xué)校歷年人員類型組成時(shí),則丟失了部分重要的數(shù)據(jù)支撐,最終分析結(jié)果必然是錯(cuò)誤的。所以對(duì)于這種數(shù)據(jù)同步情景,保留歷史變化記錄是必要的。再比如由于操作人員重復(fù)錄入或錄入錯(cuò)誤而刪除了一條記錄,如果在數(shù)據(jù)中心不記錄刪除結(jié)果,則在進(jìn)行相關(guān)人員變化的數(shù)據(jù)分析時(shí)也會(huì)出現(xiàn)類似錯(cuò)誤。
基于該需求,筆者設(shè)計(jì)了一種基于Kettle的無損增量數(shù)據(jù)同步方法,其流程如圖2所示。以在合并之前需要對(duì)A集合中的敏感字段進(jìn)行加密,加密算法采用Java編寫,在Kettle中導(dǎo)入并調(diào)用生成的接口包。
步驟2:G集合中包含名為flagfield的字段,此為合并記錄控件產(chǎn)生的字段,表示比較結(jié)果。其有4個(gè)值:deleted(已刪除)、new(新增)、changed(有更新)、identical(相等)。為了便于之后比較以及縮小目標(biāo)數(shù)據(jù)庫的存儲(chǔ)空間,對(duì)這幾個(gè)值進(jìn)行映射變換得到集合H。映射方式如表2所示。
步驟3:根據(jù)flagfield字段過濾H集合中的記錄,其中flagfield值為空的記錄為沒有變化的數(shù)據(jù)集合,不作操作,flagfield值不為空的記錄為有變化的數(shù)據(jù)集合T,繼續(xù)下一步操作。
步驟4:向T集合中的記錄添加當(dāng)前系統(tǒng)時(shí)間字段,作為目標(biāo)數(shù)據(jù)庫中的同步時(shí)間s_time(在流程開始前,需要先在目標(biāo)數(shù)據(jù)庫中建立相應(yīng)表結(jié)構(gòu),并額外增加flagfield和s_time兩個(gè)字段用來標(biāo)記當(dāng)前記錄的操作性質(zhì)和同步時(shí)間),接下來執(zhí)行過濾記錄控件,其中對(duì)于flagfield值為“I”的記錄集合,在目標(biāo)數(shù)據(jù)庫中執(zhí)行插入操作,對(duì)于flagfield值為“D”的記錄集合,在目標(biāo)數(shù)據(jù)庫中執(zhí)行更新flagfield及s_time字段值操作。根據(jù)Kettle控件特性,這兩種情況可以合并為一個(gè)控件執(zhí)行,也可以分開。另外,獲取系統(tǒng)當(dāng)前時(shí)間步驟也可放在add步驟之前。flagfield值為“U”的記錄集合F由于需要記錄歷史數(shù)據(jù),不能只進(jìn)行更新操作,需要進(jìn)行下一步處理。
步驟5:對(duì)集合F進(jìn)行字段選擇,留下主鍵,然后根據(jù)主鍵逐條獲取目標(biāo)數(shù)據(jù)庫中與主鍵字段相等的記錄,構(gòu)成集合R,最后將R插入到目標(biāo)數(shù)據(jù)庫對(duì)應(yīng)表的更新記錄表中。因?yàn)镵ettle是并行批量執(zhí)行的,所以需要等步驟5完成后才能進(jìn)行下一步操作,即步驟6的目標(biāo)數(shù)據(jù)表更新操作。
步驟6:對(duì)集合R進(jìn)行字段選擇,留下主鍵,然后根據(jù)主鍵逐條獲取源數(shù)據(jù)庫中與主鍵字段相等的記錄,構(gòu)成集合U,最后將集合U更新到目標(biāo)數(shù)據(jù)庫表中,與步驟1相同,在更新前需要對(duì)U集合中的敏感字段進(jìn)行加密。
4結(jié)語
本文提出的無損增量數(shù)據(jù)同步方法在實(shí)際應(yīng)用中具有一定參考價(jià)值,在小數(shù)據(jù)量、對(duì)實(shí)時(shí)性要求較低且需要完整記錄變化數(shù)據(jù)的情景下,能夠很好地滿足無損數(shù)據(jù)采集需求,對(duì)接下來的數(shù)據(jù)時(shí)間切片分析起著重要作用。然而,本方法也存在著一定局限性,即需要每次對(duì)數(shù)據(jù)進(jìn)行全量比對(duì),在數(shù)據(jù)量較大或僅增量更新(如一卡通消費(fèi))的情形下則不宜使用。