元數(shù)據(jù)信息打包后發(fā)給處理 任務(wù)分布式子網(wǎng)絡(luò)中后續(xù)ETL節(jié)點(diǎn)。
[0050] 所述ETL節(jié)點(diǎn)一直保持運(yùn)行狀態(tài),除非主動(dòng)停止該ETL節(jié)點(diǎn)。
[0051] 本發(fā)明的有益效果是:
[0052] (1)本發(fā)明中ETL群集節(jié)點(diǎn)一直保持運(yùn)行狀態(tài),輸入數(shù)據(jù)到來(lái)后能夠很快被處理;
[0053] (2)輸入數(shù)據(jù)緩存到分布式數(shù)據(jù)緩存隊(duì)列中,ETL群集節(jié)點(diǎn)直接從分布式數(shù)據(jù)緩 存隊(duì)列中獲取新數(shù)據(jù),ETL群集節(jié)點(diǎn)從而能夠獲取實(shí)時(shí)更新的數(shù)據(jù);
[0054] (3)在分布式數(shù)據(jù)處理ETL網(wǎng)絡(luò)中進(jìn)行數(shù)據(jù)的流處理,每秒支持百萬(wàn)級(jí)數(shù)據(jù)的流 量,具有很高的數(shù)據(jù)吞吐量;
[0055] (4)分布式數(shù)據(jù)緩存隊(duì)列將輸入數(shù)據(jù)分散存儲(chǔ)在ETL群集中的多個(gè)ETL群集節(jié)點(diǎn) 上,降低了 ETL系統(tǒng)中單個(gè)ETL群集節(jié)點(diǎn)的訪問瓶頸問題;
[0056] (5)分布式數(shù)據(jù)處理ETL網(wǎng)絡(luò)中某個(gè)ETL群集節(jié)點(diǎn)失效導(dǎo)致輸入數(shù)據(jù)處理失敗后, 會(huì)重新將該輸入數(shù)據(jù)網(wǎng)送到分布式數(shù)據(jù)處理ETL網(wǎng)絡(luò)中,避免了因單個(gè)ETL群集節(jié)點(diǎn)失效 導(dǎo)致ETL系統(tǒng)整個(gè)任務(wù)失??;
[0057] (6)分布式數(shù)據(jù)緩存隊(duì)列中,隊(duì)列分布在多個(gè)節(jié)點(diǎn)之上,且每個(gè)節(jié)點(diǎn)在ETL群集中 均有備份,避免了因某個(gè)節(jié)點(diǎn)失效導(dǎo)致分布式數(shù)據(jù)緩存隊(duì)列不可用;
[0058] (7)ETL系統(tǒng)各部件之間的狀態(tài)管理由分布式狀態(tài)管理機(jī)完成,狀態(tài)信息分布在 ETL群集的多個(gè)ETL群集節(jié)點(diǎn)上,且每個(gè)ETL群集節(jié)點(diǎn)的數(shù)據(jù)在ETL群集中均有備份,避免 了因單個(gè)ETL群集節(jié)點(diǎn)失效造成的狀態(tài)信息不可用。
【附圖說明】
[0059] 圖1為現(xiàn)有的ETL技術(shù)的處理流程;
[0060] 圖2為本發(fā)明一種實(shí)時(shí)ETL系統(tǒng)的結(jié)構(gòu)框圖;
[0061] 圖3為本發(fā)明一種實(shí)時(shí)ETL方法的流程圖;
[0062] 圖4為ETL執(zhí)彳丁流程完全性檢測(cè)不意圖。
【具體實(shí)施方式】
[0063] 下面結(jié)合附圖進(jìn)一步詳細(xì)描述本發(fā)明的技術(shù)方案,但本發(fā)明的保護(hù)范圍不局限于 以下所述。
[0064] 如圖2所示,一種實(shí)時(shí)ETL系統(tǒng),包括ETL客戶端、分布式數(shù)據(jù)緩存隊(duì)列、分布式狀 態(tài)管理機(jī)和ETL群集。
[0065] 所述ETL客戶端,用于設(shè)計(jì)ETL流程、測(cè)試ETL流程和發(fā)布ETL流程。ETL客戶端 還用于創(chuàng)建每個(gè)數(shù)據(jù)源的分布式數(shù)據(jù)緩存隊(duì)列,發(fā)送ETL流程的輸入數(shù)據(jù)的元數(shù)據(jù)信息和 分布式數(shù)據(jù)緩存隊(duì)列信息到分布式狀態(tài)管理機(jī)。
[0066] 所述分布式數(shù)據(jù)緩存隊(duì)列,用于緩存輸入數(shù)據(jù)。分布式數(shù)據(jù)緩存隊(duì)列用于緩存一 端時(shí)間期限內(nèi)的實(shí)時(shí)輸入數(shù)據(jù),當(dāng)發(fā)生ETL節(jié)點(diǎn)失效時(shí),ETL流程可以從該分布式數(shù)據(jù)緩存 隊(duì)列中重新獲取輸入數(shù)據(jù)。
[0067] 所述分布式狀態(tài)管理機(jī),用于存儲(chǔ)系統(tǒng)狀態(tài)信息。分布式狀態(tài)管理機(jī)還用于ETL 系統(tǒng)運(yùn)行時(shí)各部件之間的狀態(tài)信息交換,所述系統(tǒng)狀態(tài)信息包括輸入數(shù)據(jù)的元數(shù)據(jù)和當(dāng)前 的分布式數(shù)據(jù)緩存隊(duì)列。
[0068] 所述ETL群集,用于按行從數(shù)據(jù)源獲取輸入數(shù)據(jù),并將輸入數(shù)據(jù)緩存到分布式數(shù) 據(jù)緩存隊(duì)列中,然后對(duì)輸入數(shù)據(jù)進(jìn)行處理。
[0069] 所述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ò)。
[0070] 所述抽取任務(wù)分布式子網(wǎng)絡(luò),用于按行從數(shù)據(jù)源中獲取輸入數(shù)據(jù),并將輸入數(shù)據(jù) 緩存到分布式數(shù)據(jù)緩存隊(duì)列。
[0071] 所述處理任務(wù)分布式子網(wǎng)絡(luò),用于對(duì)輸入數(shù)據(jù)進(jìn)行處理和轉(zhuǎn)換,并輸出結(jié)果數(shù)據(jù)。
[0072] 如圖3所示,一種實(shí)時(shí)ETL方法,包括以下步驟:
[0073] SI.設(shè)計(jì)和測(cè)試ETL流程,將測(cè)試合格的ETL流程以元數(shù)據(jù)的方式存儲(chǔ)為xml文 件。
[0074] ETL客戶端有可視化的界面用來(lái)設(shè)計(jì)和測(cè)試ETL流程,測(cè)試ETL流程是在ETL客戶 端所在的機(jī)器上模擬運(yùn)行該ETL流程,用于測(cè)試所設(shè)計(jì)的ETL流程能否按預(yù)期設(shè)想運(yùn)行并 得到正確的結(jié)果。
[0075] 將測(cè)試好的ETL流程以元數(shù)據(jù)的方式存儲(chǔ)為xml文件,具體的元數(shù)據(jù)有:轉(zhuǎn)換中每 個(gè)步驟所做的工作、每個(gè)步驟輸出行的元數(shù)據(jù)以及轉(zhuǎn)換的數(shù)據(jù)庫(kù)連接。
[0076] S2.將測(cè)試合格的ETL流程構(gòu)造成能夠在ETL群集中運(yùn)行的分布式數(shù)據(jù)處理ETL 流程,并將該分布式數(shù)據(jù)處理ETL流程發(fā)送到ETL群集。
[0077] 所述ETL流程包括一個(gè)或多個(gè)輸入步驟、中間處理步驟(即轉(zhuǎn)換步驟)和輸出步 驟。ETL流程運(yùn)行時(shí)按行從數(shù)據(jù)源中獲取輸入數(shù)據(jù),經(jīng)過中間步驟的處理,將結(jié)果數(shù)據(jù)通過 輸出步驟存儲(chǔ)到目標(biāo)倉(cāng)庫(kù)中。
[0078] 本發(fā)明中輸入數(shù)據(jù)從分布式數(shù)據(jù)緩存隊(duì)列中獲取,一項(xiàng)簡(jiǎn)單的ETL流程中包括至 少一個(gè)分布式數(shù)據(jù)緩存隊(duì)列,輸入數(shù)據(jù)從ETL系統(tǒng)外部被推送到分布式數(shù)據(jù)緩存隊(duì)列中。 輸入數(shù)據(jù)的元數(shù)據(jù)信息包括行的字段名、類型和精度信息。
[0079] 輸入步驟獲取輸入數(shù)據(jù)后,將輸入數(shù)據(jù)流到中間處理步驟(轉(zhuǎn)換步驟),中間處理 步驟包括多種不同的類型,如字段查詢、記錄行合并、字段添加或修改、記錄行拆分等。每個(gè) 中間處理步驟代表對(duì)行的一種操作。多個(gè)中間處理步驟連接起來(lái)就可以完成復(fù)雜的數(shù)據(jù)處 理任務(wù)。輸出步驟通常包括將結(jié)果數(shù)據(jù)輸出到數(shù)據(jù)庫(kù)表、日志文件、數(shù)據(jù)倉(cāng)庫(kù)等目標(biāo)存儲(chǔ) 中。輸入步驟、中間處理步驟和輸出步驟一起構(gòu)成了數(shù)據(jù)流的DAG網(wǎng)絡(luò)。
[0080] 所述步驟S2包括以下子步驟:
[0081] 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)集合;
[0082] S22.從步驟Sl中的xml文件中讀取每個(gè)ETL轉(zhuǎn)換單元的元數(shù)據(jù),并構(gòu)建每個(gè)ETL 轉(zhuǎn)換單元的元數(shù)據(jù)對(duì)象;
[0083] S23.根據(jù)輸入步驟節(jié)點(diǎn)集合中各ETL轉(zhuǎn)換單元的元數(shù)據(jù)對(duì)象和ETL流程的DAG圖 中各ETL轉(zhuǎn)換單元間的連接關(guān)系構(gòu)成抽取任務(wù)分布式子網(wǎng)絡(luò);
[0084] S24.根據(jù)中間處理步驟節(jié)點(diǎn)集合中各ETL轉(zhuǎn)換單元的元數(shù)據(jù)對(duì)象和ETL流程的 DAG圖中各ETL轉(zhuǎn)換單元間的連接關(guān)系構(gòu)成處理任務(wù)分布式子網(wǎng)絡(luò)。
[0085] 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ī)。
[0086] 所述步驟S3還包括:將步驟S22中的元數(shù)據(jù)存儲(chǔ)在分布式數(shù)據(jù)緩存隊(duì)列中。
[0087] S4.從分布式數(shù)據(jù)緩存隊(duì)列中抽取輸入數(shù)據(jù),并使輸入數(shù)據(jù)流經(jīng)分布式數(shù)據(jù)處理 ETL網(wǎng)絡(luò)中的處理任務(wù)分布式子網(wǎng)絡(luò)中的所有ETL節(jié)點(diǎn)。
[0088] 步驟S4中每個(gè)ETL節(jié)點(diǎn)對(duì)輸入數(shù)據(jù)進(jìn)行處理,ETL節(jié)點(diǎn)對(duì)輸入數(shù)據(jù)進(jìn)行處理包括 以下步驟:
[0089] S41.處理任務(wù)分布式子網(wǎng)絡(luò)中的任意一個(gè)ETL節(jié)點(diǎn)在自己的輸入緩存區(qū)中獲取 該ETL節(jié)點(diǎn)的輸入數(shù)據(jù)和輸入數(shù)據(jù)的元數(shù)據(jù)信息;
[0090] 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ù)信息;
[0091] S43.所述ETL節(jié)點(diǎn)將自己的輸出數(shù)據(jù)和輸出數(shù)據(jù)的元數(shù)據(jù)信息打包后發(fā)給處理 任務(wù)分布式子網(wǎng)絡(luò)中后續(xù)ETL節(jié)點(diǎn)。
[0092] S5.每條進(jìn)入分布式數(shù)據(jù)處理ETL網(wǎng)絡(luò)中的輸入數(shù)據(jù)形成一個(gè)消息樹;
[0093] S6.判斷每條輸入數(shù)據(jù)是否在分布式數(shù)據(jù)處理ETL網(wǎng)絡(luò)中被完全處理:
[0094] 若存在輸入數(shù)據(jù)未被完全處理,則從分布式數(shù)據(jù)緩存隊(duì)列中重新抽取該輸入數(shù) 據(jù),將該輸入數(shù)據(jù)發(fā)送到分布式數(shù)據(jù)處理ETL網(wǎng)絡(luò)中,重新處理;
[0095] 若所有輸入數(shù)據(jù)均被完全處理,輸出處理完成后的結(jié)果數(shù)據(jù)。
[0096] 所述步驟S6中判斷輸入數(shù)據(jù)是否被處理完成的方式為:為輸入數(shù)據(jù)的消息樹分 配一個(gè)變量,并將該變量均初始化為〇,待所述輸入數(shù)據(jù)經(jīng)過處理任務(wù)分布式子網(wǎng)絡(luò)處理 后,判斷所述變量是否為〇:
[0097] 若該變量為〇,則該輸入數(shù)據(jù)被完全處理;
[0098] 若該變量不為〇,則該輸入數(shù)據(jù)未被完全處理。
[0099] 所述判斷輸入數(shù)據(jù)是否被處理完成的方式包括以下子步驟:
[0100] 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í)序列中,如圖4所示,為ETL節(jié)點(diǎn)k的消息樹分配一個(gè)64位的變 量result,并將該變量r