本發明涉及分布式數據計算技術,尤其涉及一種基于流水線的分布式多表連接方法及系統。
背景技術:
大數據時代的到來,帶動了數據量的迅猛增長,急需一種技術來存儲和處理如此龐大的數據量,由此,谷歌的dfs(分布式文件系統)和分布式計算模型mapreduce(映射和規約)應運而生,如今分布式計算技術已成為海量數據存儲分析的主流技術。對于海量數據分析,連接查詢是一種重要的操作,并且在實際應用時,所需的數據可能不僅僅局限于某一個表,而是涉及到多個表,這給連接操作帶來了一定的難度。
在執行連接查詢之前,首先要對相應數據進行分割,通常的做法是對數據進行哈希分割或范圍分割。現有技術中提出了一種自適應的分割方法。此方法使用了一種雙階段的分割算法對數據進行了基于屬性的分割:第一階段,依據連接屬性對最頂層數據進行分割;第二階段,依據數據規模和規約器(reduce)個數對底層數據進行進一步的分割。這樣的分割算法保證了每一個分割樹都包含單一的連接屬性。當這種自適應的分割算法檢測到一個包含著新的連接屬性的輸入查詢時,它將以同樣的雙階段方法生成一個新的分割樹,該分割樹以新的查詢操作包含的連接屬性為劃分依據,并且初始狀態為空。隨著查詢操作的進行,這種分割算法將隨機地從舊的分割樹中選取適當規模的數據進行重分割,并逐漸地將數據移動到新的分割樹中,直至新的分割樹中包含的數據滿足新的查詢操作。這種基于雙階段的自適應分割算法可以有效地對數據進行基于連接屬性的分割,并且避免了出現包含新的連接屬性的查詢操作時,全部數據的重新分割,實現了自適應。
然而,這種自適應分割算法主要針對兩表連接的情況,如將其應用于多表連接上,則需要首先執行前兩個表的連接操作,再把連接的結果看作一個新的表,和下一個表進行連接,以此類推,直到完成所有表的連接。顯然這會產生大量的中間結果,造成很大的i/o開銷,是一種效率極低的方法,而在實際應用中,多表連接又是非常常見的操作。
技術實現要素:
本發明要解決的技術問題是,針對現有的數據分割方法在應用于對多表進行連接時效率低的缺陷,提供一種基于流水線的分布式多表連接方法及系統。
為了解決上述技術問題,本發明提供了一種基于流水線的分布式多表連接方法,該方法包括并行執行的以下步驟:
a、映射處理單元從分布式文件系統讀取待連接表,將所述待連接表進行映射處理后得到對應的數據塊,并以每兩個待連接表為一組,將第一組表的數據塊輸出至第一規約處理單元,將第二組至末尾組表的數據塊按序輸出至第二規約處理單元;
b、第二規約處理單元按序讀取第二組至末尾組表的數據塊,并對每組表的兩個數據塊進行哈希連接得到每組表的兩表連接結果;
c、第一規約處理單元讀取第一組表的兩個數據塊進行哈希連接后作為初始的多表連接結果,并在等待第二規約處理單元完成一組表的哈希連接后,將當前的多表連接結果與該組表的兩表連接結果進行順序連接以更新多表連接結果,直至所有組表完成連接后輸出多表連接結果。
在根據本發明所述的基于流水線的分布式多表連接方法中,所述步驟a包括以下步驟:
在t1時刻,映射處理單元讀取待連接表t1至t4,對所述待連接表t1至t4進行映射處理后得到對應的數據塊b1至b4,并將第一組表的數據塊b1和b2輸出至所述第一規約處理單元,將第二組表的數據塊b3和b4輸出至所述第二規約處理單元;
在ti時刻,其中i=2,3,…,j-1,j為待連接表的組數;映射處理單元讀取待連接表t2i+1和t2i+2,對所述待連接表t2i+1和t2i+2進行映射處理后得到第i+1組表的數據塊b2i+1至b2i+2,并輸出至第二規約處理單元。
在根據本發明所述的基于流水線的分布式多表連接方法中,所述步驟b包括以下步驟:在ti時刻,其中i=2,3,…,j;第二規約處理單元讀取第i組表的數據塊b2i-1至b2i進行哈希連接后得到第i組表的兩表連接結果hi。
在根據本發明所述的基于流水線的分布式多表連接方法中,所述步驟c包括以下步驟:
在t2時刻,第一規約處理單元讀取第一組表的數據塊b1至b2進行哈希連接后作為初始的多表連接結果s1;
在ti時刻,其中i=3,4,…,j+1;第一規約處理單元在等待第二規約處理單元完成第i-1組表的哈希連接后,將當前的多表連接結果si-2與第i-1組表的兩表連接結果hi-1進行順序連接得到更新的多表連接結果si-1。
在根據本發明所述的基于流水線的分布式多表連接方法中,所述步驟a中還包括:在判斷待連接表的總數n為奇數時,在待連接表中增加一個空表,且待連接表的組數
在根據本發明所述的基于流水線的分布式多表連接方法中,所述步驟a的映射處理為自適應的雙階段分割。
在根據本發明所述的基于流水線的分布式多表連接方法中,所述自適應的雙階段分割包括:在第一階段依據連接屬性對頂層數據進行分割;在第二階段依據數據規模和規約器的個數對底層數據進行分割。
本發明還提供了一種基于流水線的分布式多表連接系統,包括:
映射處理單元,用于從分布式文件系統讀取待連接表,將所述待連接表進行映射處理后得到對應的數據塊,并以每兩個待連接表為一組,將第一組表的數據塊輸出至第一規約處理單元,將第二組至末尾組表的數據塊按序輸出至第二規約處理單元;
第二規約處理單元,用于按序讀取所述第二組至末尾組表的數據塊,并對每組表的兩個數據塊進行哈希連接得到每組表的兩表連接結果;
第一規約處理單元,用于讀取第一組表的兩個數據塊進行哈希連接后作為初始的多表連接結果,并在等待第二規約處理單元完成一組表的哈希連接后,將當前的多表連接結果與該組表的兩表連接結果進行順序連接以更新多表連接結果,直至所有組表完成連接后輸出多表連接結果。
在根據本發明所述的基于流水線的分布式多表連接系統中,所述映射處理單元還在判斷待連接表的總數n為奇數時,在待連接表中增加一個空表,則待連接表的組數
在根據本發明所述的基于流水線的分布式多表連接系統中,所述映射處理單元執行的映射處理為自適應的雙階段分割。
實施本發明的基于流水線的分布式多表連接方法及系統,具有以下有益效果:本發明通過并行執行的流水線實現多表連接,采用調度器對流水線中的多個任務進行有序、高效的調度,避免了兩兩連接中產生過多中間結果、i/o開銷過大的情況,可以快速高效地實現多個表的連接。
附圖說明
圖1為根據本發明的基于流水線的分布式多表連接系統的結構圖;
圖2為根據本發明的基于流水線的分布式多表連接方法的任務流水線圖。
具體實施方式
為使本發明實施例的目的、技術方案和優點更加清楚,下面將結合本發明實施例中的附圖,對本發明實施例中的技術方案進行清楚、完整地描述,顯然,所描述的實施例是本發明的一部分實施例,而不是全部的實施例。基于本發明中的實施例,本領域普通技術人員在沒有做出創造性勞動的前提下所獲得的所有其他實施例,都屬于本發明保護的范圍。
本發明提供了一種基于流水線的分布式多表連接方法,通過并行執行兩條流水線,既實現了查詢操作時的自適應分割,又能快速高效的完成。
請參閱圖1,為根據本發明的基于流水線的分布式多表連接系統的結構圖。mapreduce(映射規約)是現有應用于大規模數據處理的一種系統架構,至少包括映射處理(map)和規約處理(reduce)。該基于流水線的分布式多表連接系統至少包括:映射處理單元map、第一規約處理單元r1和第二規約處理單元r2。其中映射處理單元map用于從分布式文件系統hdfs讀取初始數據,并進行映射處理后,產生中間數據存入隨機存儲器(ram),隨后通過合并(combine)和分區(partitioner),輸出中間結果至對應規約分區的對應緩沖區,如圖1中的d1和d2。第一規約處理單元r1和第二規約處理單元r2分別從各自對應的分區讀取數據并完成規約處理。本發明中的映射處理單元map、第一規約處理單元r1和第二規約處理單元r2均可以由各自的機器集群實現,分別稱為映射機器群、第一規約機器群和第二規約機器群。
本發明第一方面,提供了一種基于流水線的分布式多表連接方法。主要包括并行執行的以下步驟:
a、映射處理單元map從分布式文件系統讀取待連接表,將待連接表進行映射處理后得到對應的數據塊,并以每兩個待連接表為一組,將第一組表的數據塊輸出至第一規約處理單元r1,將第二組至末尾組表的數據塊按序輸出至第二規約處理單元r2。該步驟中映射處理為,所述步驟a的映射處理為自適應的雙階段分割。該自適應的雙階段分割包括:首先,在第一階段依據連接屬性對頂層數據進行分割;其次,在第二階段依據數據規模和規約(reduce)器的個數對底層數據進行進一步的分割。這樣的分割算法保證了每一個分割樹都包含單一的連接屬性。當查詢操作中出現新的連接屬性時,以同樣的雙階段方法生成一個包含新連接屬性的分割樹,隨著查詢操作的進行隨機地從舊的分割樹中選取適當規模的數據進行重分割,并逐漸地將數據移動到新的分割樹中,直至新的分割樹中包含的數據滿足新的查詢操作。
假設讀取的待連接表為t1、t2、t3、t4……tn,n為待連接表的總數,將待連接表以兩個為一組劃分為j組表。在本發明的一種優選實施方式中,在向分布式文件系統輸入待連接表t1至tn時,便檢測如n是否為奇數,如果是則增加一個空表。在本發明的另一種優選實施方式中,步驟a在分組時還包括以下步驟:在判斷待連接表的總數n為奇數時,在待連接表中增加一個空表,則待連接表的組數
在t1時刻,映射處理單元map讀取待連接表t1至t4,對待連接表t1至t4進行自適應的雙階段分割后得到對應的數據塊b1至b4,并將第一組表的數據塊b1和b2輸出至第一規約處理單元r1,將第二組表的數據塊b3和b4輸出至所述第二規約處理單元r2。
在ti時刻,其中i=2,3,…,j-1,j為待連接表的組數;映射處理單元map讀取待連接表t2i+1和t2i+2,對所述待連接表t2i+1和t2i+2進行映射處理后得到第i+1組表的數據塊b2i+1至b2i+2,并輸出至第二規約處理單元r2。
b、第二規約處理單元r2按序讀取第二組至末尾組表的數據塊,并對每組表的兩個數據塊進行哈希連接得到每組表的兩表連接結果。
該步驟b包括分時執行的以下步驟:
在ti時刻,其中i=2,3,…,j;第二規約處理單元r2讀取第i組表的數據塊b2i-1至b2i進行哈希連接后得到第i組表的兩表連接結果hi。
c、第一規約處理單元r1讀取第一組表的兩個數據塊進行哈希連接后作為初始的多表連接結果,并在等待第二規約處理單元r2完成一組表的哈希連接后,將當前的多表連接結果與該組表的兩表連接結果進行順序連接以更新多表連接結果,直至所有組表完成連接后輸出多表連接結果。
該步驟c包括分時執行的以下步驟:
在t2時刻,第一規約處理單元r1讀取第一組表的數據塊b1至b2進行哈希連接后作為初始的多表連接結果s1。
在ti時刻,其中i=3,4,…,j+1;第一規約處理單元r1在等待第二規約處理單元r2完成第i-1組表的哈希連接后,將當前的多表連接結果si-2與第i-1組表的兩表連接結果hi-1進行順序連接得到更新的多表連接結果si-1。該順序連接是指先讀取待連接表中的所有key值,再選擇key值相同的進行連接操作。
因此,本發明通過雙階段的方法對數據進行動態的劃分,并且并行執行兩條mapreduce任務流水線,采用調度器對流水線中的多個mapreduce任務進行有序、高效的調度,最終實現自適應的多表連接。本發明的任務流水線圖如圖2所示,包括以下步驟:
步驟一:在t1時刻,映射處理單元map從hdfs上讀取待連接表t1、t2、t3、t4,在t1時間段內完成對這四個表的自適應的雙階段分割,得到對應的數據塊b1、b2、b3、b4,并將第一組表的數據塊b1和b2輸出至所述第一規約處理單元r1,將第二組表的數據塊b3和b4輸出至所述第二規約處理單元r2。
步驟二:在t2時刻,映射處理單元map完成對待連接表t5、t6的雙階段分割得到數據塊b5、b6,同時第一規約處理單元r1完成對數據塊b1、b2的哈希連接,得到第1組表的兩表連接結果作為初級的多表連接結果s1;第二規約處理單元r2完成對數據塊b3、b4的哈希連接操作,得到第2組表的兩表連接結果h2。
步驟四:在t3時刻,映射處理單元map完成對待連接表t7、t8的雙階段分割得到數據塊b7、b8;同時第一規約處理單元r1將初級的多表連接結果s1和兩表連接結果h2進行順序連接后得到多表連接結果s2;同時在第二規約處理單元r2上完成對b5、b6的哈希連接,得到第3組表的兩表連接結果h3。
步驟五:在t4時刻,映射處理單元map完成對待連接表t9、t10的雙階段分割得到數據塊b9、b10;同時第一規約處理單元r1完成s2和h3的順序連接得到多表連接結果s3;同時第二規約處理單元r2上完成對b7、b8的哈希連接,得到第4組表的兩表連接結果h4。
步驟六:以此類推,流水線一直運行下去,直到完成所有表的連接。
也就是說,為了控制集群中機器的任務分配,本發明引入一個調度器來控制流水線上各個操作執行的時間點,該調度器維護著一個記錄集群中所有機器信息的調度表,該調度表記錄著機器執行何種任務以及機器是否忙碌等信息。映射處理單元執行的是所有表的雙階段分割操作,當映射處理單元執行完一組表的分割操作后,調度器按順序把下一組表發送給它繼續執行。第一規約處理單元r1執行的是b1、b2數據塊的哈希連接和所有表的順序連接操作。當第一規約處理單元r1完成b1、b2的哈希連接后,它向調度器詢問第二規約處理單元r2上b3、b4的哈希連接是否也已完成連接,若完成則第一規約處理單元r2接著執行s1和h2的順序連接,否則進入等待狀態,并持續向調度器發起詢問,直到第二規約處理單元r2完成連接。第二規約處理單元r2執行的是除b1、b2外其他所有表的哈希連接。
本發明還相應提供了上述基于流水線的分布式多表連接系統。
其中映射處理單元map從分布式文件系統讀取待連接表,將待連接表進行映射處理后得到對應的數據塊,并以每兩個待連接表為一組,將第一組表的數據塊輸出至第一規約處理單元r1,將第二組至末尾組表的數據塊按序輸出至第二規約處理單元r2。該映射處理單元map的實現原理及過程與前述方法中步驟a一致。
第二規約處理單元r2與映射處理單元map連接,用于按序讀取第二組至末尾組表的數據塊,并對每組表的兩個數據塊進行哈希連接得到每組表的兩表連接結果。該第二規約處理單元r2的實現原理及過程與前述方法中步驟b一致。
第一規約處理單元r1與映射處理單元map連接,用于讀取第一組表的兩個數據塊進行哈希連接后作為初始的多表連接結果,并在等待第二規約處理單元r2完成一組表的哈希連接后,將當前的多表連接結果與該組表的兩表連接結果進行順序連接以更新多表連接結果,直至所有組表完成連接后輸出多表連接結果。該第一規約處理單元r1的實現原理及過程與前述方法中步驟c一致。
在本發明優選地實施方式中,該系統中還可以包括作業調度單元,用于存儲調度表,并根據該調度表發送指令控制系統中其它單元的任務調度,實現調度器的功能。相應地,第二規約處理單元r2在對每組表的兩個數據塊進行哈希連接得到每組表的兩表連接結果后返回完成信息給作業調度單元。第一規約處理單元r1在讀取第一組表的兩個數據塊進行哈希連接后作為初始的多表連接結果后,向作業調度單元詢問第二規約處理單元r2是否完成一組表的哈希連接,否則繼續等待,是則將當前的多表連接結果與該組表的兩表連接結果順序連接以更新多表連接結果,直至所有組表完成連接后輸出多表連接結果。
綜上所述,本發明在規約機器群中進行的哈希連接不同于傳統的依據key值進行的順序連接,而是將待連接的數據庫bi、bi+1中的bi構建哈希表,再將哈希表與bi+1進行連接,這將大大減少讀取磁盤的次數。因此本發明采用流水線模型將自適應的雙階段分割方法應用于多表連接上,通過并行執行兩條任務流水線,采用調度器對流水線中的多個mapreduce任務進行有序、高效的調度,避免了兩兩連接中產生過多中間結果,i/o開銷過大的情況,可以快速高效地實現多個表的連接。并且與傳統的依據key值或依據范圍的分割算法相比,這種方法既保證了每一個數據樹都有唯一的連接屬性,又具有自適應的特點。
最后應說明的是:以上實施例僅用以說明本發明的技術方案,而非對其限制;盡管參照前述實施例對本發明進行了詳細的說明,本領域的普通技術人員應當理解:其依然可以對前述各實施例所記載的技術方案進行修改,或者對其中部分技術特征進行等同替換;而這些修改或者替換,并不使相應技術方案的本質脫離本發明各實施例技術方案的精神和范圍。