一種實(shí)時(shí)etl系統(tǒng)及方法
【技術(shù)領(lǐng)域】
[0001] 本發(fā)明涉及數(shù)據(jù)處理技術(shù),特別是涉及一種實(shí)時(shí)ETL系統(tǒng)及方法。
【背景技術(shù)】
[0002] ETL(Extract-Transformation-Loading)即數(shù)據(jù)的抽取、轉(zhuǎn)換和加載,也叫數(shù)據(jù)集 成,是構(gòu)建數(shù)據(jù)倉(cāng)庫(kù)的一種重要技術(shù)。
[0003]傳統(tǒng)ETL過程將批量數(shù)據(jù)從業(yè)務(wù)數(shù)據(jù)庫(kù)等數(shù)據(jù)源中抽取出來,經(jīng)過清洗、轉(zhuǎn)換等 分析統(tǒng)計(jì)處理后,最終按照預(yù)先定義好的數(shù)據(jù)倉(cāng)庫(kù)模型將結(jié)果加載到數(shù)據(jù)倉(cāng)庫(kù)中。ETL過 程通常采用定時(shí)任務(wù)調(diào)度的方式執(zhí)行,當(dāng)滿足時(shí)間條件時(shí),ETL服務(wù)器調(diào)度執(zhí)行預(yù)先定義好 的ETL任務(wù),每次對(duì)數(shù)據(jù)源中的一批數(shù)據(jù)進(jìn)行操作,將結(jié)果加載到數(shù)據(jù)倉(cāng)庫(kù)中,適用于對(duì)原 始數(shù)據(jù)進(jìn)行定時(shí)的批量處理情況,其業(yè)務(wù)流程如圖1所示。
[0004]但是,隨著電子商務(wù)、移動(dòng)互聯(lián)網(wǎng)、電信業(yè)務(wù)的發(fā)展,對(duì)業(yè)務(wù)數(shù)據(jù)分析的時(shí)限要求 越來越高,出現(xiàn)了一批諸如用戶點(diǎn)擊流分析、基于位置的服務(wù)、實(shí)時(shí)賬單查詢等應(yīng)用,這些 應(yīng)用都要求業(yè)務(wù)系統(tǒng)中的數(shù)據(jù)能盡快被后臺(tái)分析系統(tǒng)感知。傳統(tǒng)的ETL技術(shù)方案在面對(duì)實(shí) 時(shí)大數(shù)據(jù)分析應(yīng)用的情況下,其局限性非常明顯,主要表現(xiàn)在以下幾個(gè)方面:
[0005] (1)時(shí)間片調(diào)度方式不能滿足實(shí)時(shí)性要求:傳統(tǒng)ETL方案中數(shù)據(jù)處理任務(wù)按時(shí)間 片調(diào)度,即每隔一段時(shí)間調(diào)度一次任務(wù),對(duì)業(yè)務(wù)系統(tǒng)中的數(shù)據(jù)進(jìn)行抽取、轉(zhuǎn)換、加載操作,后 臺(tái)分析系統(tǒng)能否在業(yè)務(wù)系統(tǒng)的數(shù)據(jù)發(fā)生改變的情況下立即與之同步取決于調(diào)度的時(shí)間片 大小,時(shí)間片過大則分析系統(tǒng)同步時(shí)延較大,這在時(shí)延要求較高的實(shí)時(shí)分析環(huán)境下是不允 許的;時(shí)間片過小則會(huì)導(dǎo)致計(jì)算資源浪費(fèi)。
[0006] (2)大數(shù)據(jù)環(huán)境下執(zhí)行ETL任務(wù)效率不高:傳統(tǒng)ETL方案中所有任務(wù)在特定的ETL 服務(wù)器上執(zhí)行,在大數(shù)據(jù)環(huán)境下,單臺(tái)處理機(jī)的執(zhí)行效率有限,且不易擴(kuò)展。
[0007] (3)可靠性得不到保障:ETL服務(wù)器主機(jī)或網(wǎng)絡(luò)連接中斷導(dǎo)致所有正在運(yùn)行ETL任 務(wù)失敗,嚴(yán)重時(shí)會(huì)導(dǎo)致數(shù)據(jù)丟失、混亂,這在可靠性要求較高的場(chǎng)景中是不允許的。
【發(fā)明內(nèi)容】
[0008] 本發(fā)明的目的在于克服現(xiàn)有技術(shù)的不足,提供一種實(shí)時(shí)ETL系統(tǒng)及方法,具有很 高的效率,能夠解決目前ETL技術(shù)應(yīng)用在實(shí)時(shí)大數(shù)據(jù)環(huán)境下的局限性問題。
[0009]本發(fā)明的目的是通過以下技術(shù)方案來實(shí)現(xiàn)的:一種實(shí)時(shí)ETL系統(tǒng),包括ETL客戶 端、分布式數(shù)據(jù)緩存隊(duì)列、分布式狀態(tài)管理機(jī)和ETL群集。
[0010]所述ETL客戶端,用于設(shè)計(jì)ETL流程、測(cè)試ETL流程和發(fā)布ETL流程。
[0011] 所述分布式數(shù)據(jù)緩存隊(duì)列,用于緩存輸入數(shù)據(jù)。
[0012] 所述分布式狀態(tài)管理機(jī),用于存儲(chǔ)系統(tǒng)狀態(tài)信息。
[0013]所述ETL群集,用于按行從數(shù)據(jù)源獲取輸入數(shù)據(jù),并將輸入數(shù)據(jù)緩存到分布式數(shù) 據(jù)緩存隊(duì)列中,然后對(duì)輸入數(shù)據(jù)進(jìn)行處理。
[0014]所述系統(tǒng)狀態(tài)信息包括輸入數(shù)據(jù)的元數(shù)據(jù)信息和當(dāng)前的分布式數(shù)據(jù)緩存隊(duì)列的 隊(duì)列信息。
[0015] 所述ETL群集包括多個(gè)ETL節(jié)點(diǎn),多個(gè)ETL節(jié)點(diǎn)組成分布式數(shù)據(jù)處理ETL網(wǎng)絡(luò),分 布式數(shù)據(jù)處理ETL網(wǎng)絡(luò)包括抽取任務(wù)分布式子網(wǎng)絡(luò)和處理任務(wù)分布式子網(wǎng)絡(luò)。
[0016] 所述抽取任務(wù)分布式子網(wǎng)絡(luò),用于按行從數(shù)據(jù)源中獲取輸入數(shù)據(jù),并將輸入數(shù)據(jù) 緩存到分布式數(shù)據(jù)緩存隊(duì)列。
[0017] 所述處理任務(wù)分布式子網(wǎng)絡(luò),用于對(duì)輸入數(shù)據(jù)進(jìn)行處理和轉(zhuǎn)換,并輸出結(jié)果數(shù)據(jù)。
[0018] -種實(shí)時(shí)ETL方法,包括以下步驟:
[0019] SI.設(shè)計(jì)和測(cè)試ETL流程,將測(cè)試合格的ETL流程以元數(shù)據(jù)的方式存儲(chǔ)為xml文 件;
[0020] S2.將測(cè)試合格的ETL流程構(gòu)造成能夠在ETL群集中運(yùn)行的分布式數(shù)據(jù)處理ETL 流程,并將該分布式數(shù)據(jù)處理ETL流程發(fā)送到ETL群集;
[0021] S3. ETL群集中的多個(gè)ETL節(jié)點(diǎn)組成分布式數(shù)據(jù)處理ETL網(wǎng)絡(luò),構(gòu)建每個(gè)數(shù)據(jù)源的 分布式數(shù)據(jù)緩存隊(duì)列,按行從數(shù)據(jù)源中獲取輸入數(shù)據(jù),將輸入數(shù)據(jù)發(fā)送到該數(shù)據(jù)源對(duì)應(yīng)的 分布式數(shù)據(jù)緩存隊(duì)列,將該分布式數(shù)據(jù)緩存隊(duì)列的隊(duì)列信息和該分布式數(shù)據(jù)緩存隊(duì)列對(duì)應(yīng) 數(shù)據(jù)源中輸入數(shù)據(jù)的元數(shù)據(jù)信息發(fā)送到分布式狀態(tài)管理機(jī);
[0022] S4.從分布式數(shù)據(jù)緩存隊(duì)列中抽取輸入數(shù)據(jù),并使輸入數(shù)據(jù)流經(jīng)分布式數(shù)據(jù)處理 ETL網(wǎng)絡(luò)中的處理任務(wù)分布式子網(wǎng)絡(luò)中的所有ETL節(jié)點(diǎn);
[0023] S5.每條進(jìn)入分布式數(shù)據(jù)處理ETL網(wǎng)絡(luò)中的輸入數(shù)據(jù)形成一個(gè)消息樹;
[0024] S6.判斷每條輸入數(shù)據(jù)是否在分布式數(shù)據(jù)處理ETL網(wǎng)絡(luò)中被完全處理:
[0025] 若存在輸入數(shù)據(jù)未被完全處理,則從分布式數(shù)據(jù)緩存隊(duì)列中重新抽取該輸入數(shù) 據(jù),將該輸入數(shù)據(jù)發(fā)送到分布式數(shù)據(jù)處理ETL網(wǎng)絡(luò)中,重新處理;
[0026] 若所有輸入數(shù)據(jù)均被完全處理,輸出處理完成后的結(jié)果數(shù)據(jù)。
[0027] 所述步驟S2包括以下子步驟:
[0028] S21.檢測(cè)ETL流程的DAG圖中入度為0的ETL轉(zhuǎn)換單元,并將該入度為0的ETL 轉(zhuǎn)換單元?dú)w類到輸入步驟節(jié)點(diǎn)集合;檢測(cè)ETL的DAG圖中出度為0的ETL轉(zhuǎn)換單元,并將該 出度為〇的ETL轉(zhuǎn)換單元?dú)w類到輸出步驟節(jié)點(diǎn)集合;將ETL流程的DAG圖中除入度為0、出 度為〇以外的ETL轉(zhuǎn)換單元?dú)w類到中間處理步驟節(jié)點(diǎn)集合;
[0029] S22.從步驟Sl中的xml文件中讀取每個(gè)ETL轉(zhuǎn)換單元的元數(shù)據(jù),并構(gòu)建每個(gè)ETL 轉(zhuǎn)換單元的元數(shù)據(jù)對(duì)象;
[0030] S23.根據(jù)輸入步驟節(jié)點(diǎn)集合中各ETL轉(zhuǎn)換單元的元數(shù)據(jù)對(duì)象和ETL流程的DAG圖 中各ETL轉(zhuǎn)換單元間的連接關(guān)系構(gòu)成抽取任務(wù)分布式子網(wǎng)絡(luò);
[0031] S24.根據(jù)中間處理步驟節(jié)點(diǎn)集合中各ETL轉(zhuǎn)換單元的元數(shù)據(jù)對(duì)象和ETL流程的 DAG圖中各ETL轉(zhuǎn)換單元間的連接關(guān)系構(gòu)成處理任務(wù)分布式子網(wǎng)絡(luò)。
[0032] 所述步驟S3還包括:將步驟S22中的元數(shù)據(jù)存儲(chǔ)在分布式數(shù)據(jù)緩存隊(duì)列中。
[0033] 所述步驟S6中判斷輸入數(shù)據(jù)是否被處理完成的方式為:為輸入數(shù)據(jù)的消息樹分 配一個(gè)變量,并將該變量均初始化為〇,待所述輸入數(shù)據(jù)經(jīng)過處理任務(wù)分布式子網(wǎng)絡(luò)處理 后,判斷所述變量是否為〇。
[0034] 若該變量為0,則該輸入數(shù)據(jù)被完全處理。
[0035] 若該變量不為〇,則該輸入數(shù)據(jù)未被完全處理。
[0036] 所述判斷輸入數(shù)據(jù)是否被處理完成的方式包括以下子步驟:
[0037] S61.定義處理任務(wù)分布式子網(wǎng)絡(luò)中任意一個(gè)ETL節(jié)點(diǎn)為k,接收到的輸入數(shù)據(jù)為 A,則ETL節(jié)點(diǎn)k為輸入數(shù)據(jù)A生成一個(gè)隨機(jī)的64位標(biāo)識(shí)符Sa,并將標(biāo)識(shí)符Sa保存到該處 理任務(wù)分布式子網(wǎng)絡(luò)的標(biāo)識(shí)序列中,為ETL節(jié)點(diǎn)k的消息樹分配一個(gè)64位的變量result, 并將該變量result均初始化為0,然后將變量result通過公式(1)與標(biāo)識(shí)符3&進(jìn)行異或 運(yùn)算:
[0038] result =Sa XOR result 公式(I)
[0039] S62.若處理任務(wù)分布式子網(wǎng)絡(luò)中ETL節(jié)點(diǎn)k之后無用于對(duì)輸入數(shù)據(jù)A進(jìn)行處理的 ETL節(jié)點(diǎn),則ETL節(jié)點(diǎn)k處理完成后,變量result再次通過公式(1)與標(biāo)識(shí)符3&進(jìn)行異或 運(yùn)算,跳轉(zhuǎn)步驟S63 ;
[0040] 若處理任務(wù)分布式子網(wǎng)絡(luò)中ETL節(jié)點(diǎn)k之后有用于對(duì)輸入數(shù)據(jù)A進(jìn)行處理的ETL 節(jié)點(diǎn),則ETL節(jié)點(diǎn)k生成輸入數(shù)據(jù)A的一個(gè)或多個(gè)中間輸出值(A 1, A2, A3,…,AJ,并將中間 輸出值M1, A2, A3,…,AJ發(fā)送給后續(xù)ETL節(jié)點(diǎn),每個(gè)An表示ETL節(jié)點(diǎn)k的一個(gè)中間輸出值, 為每個(gè)中間輸出值4生成一個(gè)隨機(jī)的64位標(biāo)識(shí)符I5,并將標(biāo)識(shí)符記錄到該處理任務(wù) 分布式子網(wǎng)絡(luò)的標(biāo)識(shí)序列中,變量result的值通過公式(2)進(jìn)行更新:
[0041 ]result-reswltXORS,XORS....XOR 公式(2)
[0042] ETL節(jié)點(diǎn)k處理完成后,變量result再次與標(biāo)識(shí)符5&通過公式(1)進(jìn)行異或運(yùn) 算;
[0043] S63.每過間隔時(shí)間t檢測(cè)一次變量result的值:
[0044] 若變量result的值為0,則輸入數(shù)據(jù)A被完全處理;
[0045] 若變量result的值不為0,則經(jīng)過超時(shí)時(shí)長(zhǎng)p后再次檢測(cè)該result的值,若該變 量result的值仍不為0,則輸入數(shù)據(jù)A未被完全處理。
[0046] 步驟S4中每個(gè)ETL節(jié)點(diǎn)對(duì)輸入數(shù)據(jù)進(jìn)行處理,ETL節(jié)點(diǎn)對(duì)輸入數(shù)據(jù)進(jìn)行處理包括 以下步驟:
[0047] S41.處理任務(wù)分布式子網(wǎng)絡(luò)中的任意一個(gè)ETL節(jié)點(diǎn)在自己的輸入緩存區(qū)中獲取 該ETL節(jié)點(diǎn)的輸入數(shù)據(jù)和輸入數(shù)據(jù)的元數(shù)據(jù)信息;
[0048] S42.所述ETL節(jié)點(diǎn)根據(jù)自己的節(jié)點(diǎn)元數(shù)據(jù)信息中描述的操作步驟對(duì)輸入數(shù)據(jù)進(jìn) 行處理,并修改輸入數(shù)據(jù)的元數(shù)據(jù)信息,生成該ETL節(jié)點(diǎn)的輸出數(shù)據(jù)的元數(shù)據(jù)信息;
[0049] S43.所述ETL節(jié)點(diǎn)將自己的輸出數(shù)據(jù)和輸出數(shù)據(jù)的