專利名稱::一種數(shù)據(jù)處理方法及系統(tǒng)的制作方法
技術領域:
:本發(fā)明涉及一種數(shù)據(jù)處理方法及系統(tǒng)。
背景技術:
:對于基于Map/Reduce(映射/化簡)框架對SQL(StructuredQueryLanguage,結構化查詢語言)查詢進行處理和計算的數(shù)據(jù)處理系統(tǒng)來說,數(shù)據(jù)存儲任務由分布式文件系統(tǒng)完成。在Map/Reduce框架中,針對客戶端提交的數(shù)據(jù)處理任務,可以首先將該數(shù)據(jù)處理任務拆分成若干個Map任務,分配到不同的機器上執(zhí)行,每一個Map任務將查詢輸入文件的一部分作為自己的輸入,并通過計算生成中間文件;與此同時,系統(tǒng)會生成若干個Reduce任務,并分配到不同的機器上執(zhí)行,從而將Map任務生成的中間文件拉取到相應的Reduce任務本地進行計算處理后,匯總到最終的輸出文件中去。在該種數(shù)據(jù)處理系統(tǒng)處理的SQL查詢中,Join(連接)查詢和Groupby(分組)查詢占較多的比重。在進行Join查詢時,通常需要使用一個完整的Map/Reduce作業(yè)來完成。具體地,在Map階段,各個Map任務分別讀取參與Join計算的兩個(或多個)數(shù)據(jù)表的部分數(shù)據(jù),并將讀取到的數(shù)據(jù)按照要連接的key(鍵)分別轉發(fā)到相應的Reduce任務上去;在Reduce階段,Reduce任務在獲取Map任務轉發(fā)的鍵值對后,根據(jù)鍵值對所屬的數(shù)據(jù)表進行分類并按key進行排序,生成與上述兩個數(shù)據(jù)表分別對應的兩個鍵值對的有序列表,并對兩個有序列表進行連接操作。在對數(shù)據(jù)表進行Groupby操作時,Map/Reduce框架需要通過Map任務從數(shù)據(jù)表中讀取數(shù)據(jù),并根據(jù)Groupby鍵將讀取到的數(shù)據(jù)分發(fā)到Reduce任務,Groupby鍵相同的鍵值對映射到同一個Reduce任務,從而在Reduce任務中對排好序的鍵值對執(zhí)行Groupby操作。此外,為了方便、快速地讀取數(shù)據(jù)表中用戶查詢涉及到的列,有些該種數(shù)據(jù)處理系統(tǒng)支持對數(shù)據(jù)表中的數(shù)據(jù)的按列存儲,因此,對于同一個數(shù)據(jù)表中的數(shù)據(jù)而言,即使位于同一行,也可能因為屬于不同列而位于不同的文件中,從而被分布式文件系統(tǒng)保存到不同的節(jié)點上。因此,對采用列存儲的數(shù)據(jù)表進行查詢時,可能需要從多個節(jié)點讀取數(shù)據(jù),進行查詢和最后結果的整合?,F(xiàn)有技術存在以下不足現(xiàn)有技術在進行Join查詢和Groupby查詢時開銷比較大,以及查詢按列存儲的數(shù)據(jù)表時開銷較大。
發(fā)明內容本發(fā)明所解決的技術問題在于提供了一種數(shù)據(jù)處理方法及系統(tǒng),用以減小Join查詢和Groupby查詢的開銷,以及對列存儲數(shù)據(jù)表的查詢開銷,提高數(shù)據(jù)處理系統(tǒng)的計算效率。本發(fā)明實施例中提供了一種數(shù)據(jù)處理方法,包括如下步驟在基于映射/化簡Map/Reduce框架完成對查詢的處理和計算的數(shù)據(jù)處理中,將數(shù)據(jù)表定義為采用哈希Hash分區(qū)的方式,并在Hash分區(qū)中存儲數(shù)據(jù);在確定所需執(zhí)行的查詢?yōu)檫B接查詢或分組查詢,且源數(shù)據(jù)表為Hash分區(qū)數(shù)據(jù)表、連接鍵或分組鍵為分區(qū)列時,將該查詢修改為在Map端以Hash分區(qū)為單位的連接查詢或分組查詢后執(zhí)行查詢。本發(fā)明實施例中提供了一種數(shù)據(jù)處理系統(tǒng),包括存儲引擎,用于在基于Map/Reduce框架完成對查詢的處理和計算的數(shù)據(jù)處理中,將數(shù)據(jù)表定義為采用哈希Hash分區(qū)的方式,并在Hash分區(qū)中存儲數(shù)據(jù);查詢引擎,用于在確定所需執(zhí)行的查詢?yōu)檫B接查詢或分組查詢,且源數(shù)據(jù)表為Hash分區(qū)數(shù)據(jù)表、連接鍵或分組鍵為分區(qū)列時,將該查詢修改為在Map端以Hash分區(qū)為單位的連接查詢或分組查詢后執(zhí)行查詢。本發(fā)明有益效果如下在本發(fā)明實施例提供的技術方案中,在基于Map/Reduce框架完成對SQL查詢的處理和計算,數(shù)據(jù)存儲任務由分布式文件系統(tǒng)完成的數(shù)據(jù)處理中,將數(shù)據(jù)表定義為采用Hash分區(qū)的方式,并在Hash分區(qū)中存儲數(shù)據(jù);在確定所需執(zhí)行的查詢?yōu)镴oin查詢或Groupby查詢,且源數(shù)據(jù)表為Hash分區(qū)數(shù)據(jù)表、連接鍵或分組鍵為分區(qū)列時,將該查詢修改為在Map端以Hash分區(qū)為單位的Join查詢或Grouby查詢后執(zhí)行查詢。本方案中,為分布式數(shù)據(jù)倉庫增加Hash分區(qū)的分區(qū)方式,將數(shù)據(jù)按照Hash分區(qū)鍵映射到不同的Hash分區(qū)保存,由于鍵相等的數(shù)據(jù)均已被映射到同一個Hash分區(qū)中,因此,對于Join查詢和Groupby查詢而言,可以將Hash分區(qū)作為Map任務的劃分依據(jù),每個Hash分區(qū)由一個Map任務處理,在Map端完成數(shù)據(jù)的處理操作,從而達到節(jié)約網(wǎng)絡帶寬、磁盤帶寬和網(wǎng)絡資源,提高計算效率的目的。圖I為本發(fā)明實施例中的數(shù)據(jù)處理方法實施流程示意圖2為本發(fā)明實施例中的數(shù)據(jù)表入庫時的Hash分區(qū)流程示意圖3為本發(fā)明實施例中的數(shù)據(jù)協(xié)同擺放示意圖4為本發(fā)明實施例中的新節(jié)點加入時的數(shù)據(jù)協(xié)同擺放示意圖5為本發(fā)明實施例中的Join查詢轉換為Map端進行的Join計算的實施流程示意圖6為本發(fā)明實施例中的以數(shù)據(jù)表a和數(shù)據(jù)表b為例的Join查詢轉換為Map端進行的Join計算的實施流程示意圖7為本發(fā)明實施例中的以數(shù)據(jù)表a和數(shù)據(jù)表b為例的Join查詢流程圖8為本發(fā)明實施例中的數(shù)據(jù)處理系統(tǒng)結構示意圖。具體實施例方式發(fā)明人在發(fā)明過程中注意到由于Map/Reduce結構的基本工作原理的內在原因,導致其在查詢中比重較多的連接(Join)查詢和分組(Groupby)查詢需要通過網(wǎng)絡拉取大量的數(shù)據(jù)并在Reduce端進行計算。而在集群系統(tǒng)中網(wǎng)絡帶寬是比較稀缺的資源,并且,Reduce任務的執(zhí)行開銷也相對較大。因此,如果能把在應用中使用較多的Join查詢和Groupby查詢轉換成在Map端進行的計算將在很大程度上節(jié)約帶寬、計算資源和磁盤I/o。因此,發(fā)明人認為通過實現(xiàn)Hash分區(qū),將數(shù)據(jù)分而治之是在Map端完成計算的必要手段。而就Join計算而言,通過實現(xiàn)Hash分區(qū),可以將Join計算轉換為Map端進行的計算,因為相同的鍵(key)值(需要與Hash分區(qū)的分區(qū)key—致)必然位于同一個Hash分區(qū)中,而且,還可以通過控制Hash分區(qū)的數(shù)目控制MapJoin計算的粒度來進一步優(yōu)化對計算資源的利用。就Groupby計算而言,通過Hash分區(qū),可以將相關的key集中到同一個Hash分區(qū)中,此外,通過入庫操作,可以將相同key的數(shù)據(jù)有序的存放在一起,這可以看做Groupby操作的預處理操作。最后,通過Hash分區(qū)以及本發(fā)明實施例中將提供的Co-Location(協(xié)同擺放)功能,可以實現(xiàn)數(shù)據(jù)的統(tǒng)一擺放,屬于同一Hash分區(qū)的數(shù)據(jù)可以擺放到相同的節(jié)點上,此時再進一步通過有效地調度手段,可以將任務調度到數(shù)據(jù)所在的節(jié)點可以使得在Map端完成Join操作和Groupby操作時的效率更高,網(wǎng)絡1/0更少。Co-Location功能還能優(yōu)化對采用列存儲方式的數(shù)據(jù)表的查詢性能?;谝陨习l(fā)明構思,下面將結合本發(fā)明中的附圖對本發(fā)明的具體實施方式進行說明。圖I為數(shù)據(jù)處理方法實施流程示意圖,如圖所示,在基于Map/Reduce框架完成對SQL查詢的處理和計算,數(shù)據(jù)存儲任務由分布式文件系統(tǒng)完成的數(shù)據(jù)處理中,可以包括如下步驟步驟101、將數(shù)據(jù)表定義為采用Hash分區(qū)的方式,并在Hash分區(qū)中存儲數(shù)據(jù);步驟102、在確定所需執(zhí)行的查詢?yōu)镴oin查詢或Groupby查詢,且源數(shù)據(jù)表為Hash分區(qū)數(shù)據(jù)表、連接鍵或分組鍵為分區(qū)列時,將該查詢修改為在MaP端以Hash分區(qū)為單位的Join查詢或Grouby查詢后執(zhí)行查詢。一個市場上可買到的可在其上實現(xiàn)本發(fā)明(以及相關發(fā)明)實施例的基于查詢引擎、Map/Reduce計算框架和分布式文件系統(tǒng)相關技術提供海量數(shù)據(jù)存儲和計算服務的分布式數(shù)據(jù)倉庫解決方案是來自騰訊公司的TDW(TencentdistributedDataWarehouse,騰訊分布式數(shù)據(jù)倉庫)。在下述實施方式說明中將主要以TDW為例進行說明,以TDW為例進行具體說明是因為騰訊公司在數(shù)據(jù)處理業(yè)務上的領導地位所決定的,該方案也是目前許多分布式數(shù)據(jù)倉庫的主要解決方案之一,當以其為例時,經(jīng)過相應的改進后便可以很容易的用于其他具有相同工作原理的數(shù)據(jù)處理系統(tǒng)。然而注意,盡管相關發(fā)明和本發(fā)明的討論大多都是關于TDW的,但具有創(chuàng)造性的概念適用于提供類似功能的其他類型的數(shù)據(jù)處理框架,因此對TDW的引用僅作為示例而不起限制的作用。具體的,TDff是一套符合騰訊的業(yè)務需求的、使用基于查詢引擎、Map/Reduce計算框架和分布式文件系統(tǒng)相關技術提供海量數(shù)據(jù)存儲和計算服務的分布式數(shù)據(jù)倉庫解決方案,也是目前許多分布式數(shù)據(jù)倉庫的主要解決方案之一。分布式數(shù)據(jù)倉庫中經(jīng)常需要對T/P級的海量數(shù)據(jù)進行分析處理,這些數(shù)據(jù)邏輯上通常以表(Table)的形式展現(xiàn)給用戶,具體存儲格式可以是文本文件、結構化存儲文件或者列存儲文件。為了方便查找和分類,數(shù)據(jù)表可能采用范圍分區(qū)(RangePartition)或者列表分區(qū)(ListPartition)的方式組織,分區(qū)層次可能是單層或者兩層。下面對各要點的具體實施方式進行說明。一、在Hash分區(qū)中存儲數(shù)據(jù)的處理。實施中,在Hash分區(qū)中存儲數(shù)據(jù)時,可以按如下方式進行處理。數(shù)據(jù)按照Hash分區(qū)鍵映射到不同的Hash分區(qū)保存,Hash分區(qū)鍵為常用的Join鍵或Groupby鍵。具體的,在數(shù)據(jù)入庫時,可以根據(jù)數(shù)據(jù)的Hash分區(qū)鍵(例如,列)計算數(shù)據(jù)的Hash值,并根據(jù)計算得到的Hash值將數(shù)據(jù)映射并存放到對應的Hash分區(qū),Hash值相同的數(shù)據(jù)被映射到同一個Hash分區(qū)中。使用Hash分區(qū)的數(shù)據(jù)表會將Hash分區(qū)作為一個目錄層次,將相應的數(shù)據(jù)表根據(jù)Hash分區(qū)進行分割后,分別保存到不同的Hash分區(qū)目錄中。Hash分區(qū)可以完全對應用透明,用戶無法獲知Hash分區(qū)的具體劃分方式,通常無法專門針對某一個Hash分區(qū)進行查詢,也無法指定對某個Hash分區(qū)的數(shù)據(jù)或者元數(shù)據(jù)進行修改。以TDW為例,TDff系統(tǒng)中允許按照Range(范圍)或List(列表)對數(shù)據(jù)表進行分區(qū),根據(jù)Hash分區(qū)的特點和含義,可以認為Hash分區(qū)可以作為最低一級分區(qū)。因此,可以將Hash分區(qū)作為最低一級分區(qū)。具體地,如果數(shù)據(jù)表含有兩級分區(qū),則Hash分區(qū)可以作為二級分區(qū);如果數(shù)據(jù)表只有一級分區(qū),則該分區(qū)可以是Range分區(qū)或List分區(qū),也可以是Hash分區(qū)。與TDW系統(tǒng)現(xiàn)有的分區(qū)方法不同,本發(fā)明實施例中的Hash分區(qū)需要進行Reduce端的計算。假設數(shù)據(jù)表的一級分區(qū)是Range分區(qū)或List分區(qū),二級分區(qū)是Hash分區(qū),圖2為數(shù)據(jù)表入庫時的Hash分區(qū)流程示意圖,如圖所示,可以包括以下步驟步驟201,創(chuàng)建使用Hash分區(qū)的數(shù)據(jù)表。具體地,針對入庫數(shù)據(jù),可以在數(shù)據(jù)倉庫中預先創(chuàng)建使用Hash分區(qū)的數(shù)據(jù)表tablel_t,tablel_t在創(chuàng)建完畢后的初始狀態(tài)為空表,用于按照Hash分區(qū)存儲入庫數(shù)據(jù)。步驟202,接口機接收用戶上傳的源數(shù)據(jù)文件。其中,接口機位于TDW系統(tǒng)和用戶之間,用戶可以通過接口機上傳源數(shù)據(jù)文件和下載查詢結果,源數(shù)據(jù)文件中包含入庫數(shù)據(jù)。步驟203,TDW創(chuàng)建關聯(lián)源數(shù)據(jù)文件的外表。具體地,可以在TDW中創(chuàng)建與源數(shù)據(jù)文件關聯(lián)的外表ext_tableO,并將源數(shù)據(jù)文件中的入庫數(shù)據(jù)映射到該外表中。步驟204,向查詢引擎提交用于數(shù)據(jù)入庫的SQL語句。其中,查詢引擎可以為TDW系統(tǒng)中的獨立節(jié)點,可以通過ETL(Extract-Transform-Load,抽取-轉換-裝載)模塊向查詢引擎發(fā)送SQL語句,該語句用于將外表中的入庫數(shù)據(jù)導入到經(jīng)過Hash分區(qū)的數(shù)據(jù)表中,可以具體為fromext_tableOinsertintotablel_tselect*;其中,ext_tableO為外表,tabIel_t為經(jīng)過Hash分區(qū)的數(shù)據(jù)表。步驟205,查詢引擎將SQL語句轉換為Map/Reduce任務,并將該任務轉發(fā)給Map/Reduce框架中的主控節(jié)點。其中,Map/Reduce任務可以包含多個Map任務和Reduce任務。步驟206,主控節(jié)點將接收到的Map/Reduce任務分配到多個從節(jié)點。其中,主控節(jié)點與從節(jié)點一起構成TDW系統(tǒng)的Map/Reduce框架(即計算引擎),其中,主控節(jié)點可以為TDW系統(tǒng)中的獨立節(jié)點,用于接收查詢引擎發(fā)送的數(shù)據(jù)處理任務,并將該任務分配到從節(jié)點;從節(jié)點用于執(zhí)行主控節(jié)點分配的任務。步驟207,從節(jié)點執(zhí)行主控節(jié)點分配的任務,將外表中的入庫數(shù)據(jù)導入到經(jīng)過Hash分區(qū)的數(shù)據(jù)表中。具體地,接收到主控節(jié)點分配的Map任務的從節(jié)點為Map端,接收到主控節(jié)點分配的Reduce任務的從節(jié)點為Reduce端。Map端根據(jù)自身對應的Map任務從外表讀取數(shù)據(jù),并根據(jù)Hash分區(qū)鍵確定讀取到的數(shù)據(jù)行對應的Reduce任務;Reduce端根據(jù)自身對應的Reduce任務,從Map端拉取歸其處理的鍵值對,抽取鍵值對中的Hash分區(qū)鍵,并根據(jù)該Hash分區(qū)鍵計算數(shù)據(jù)的Hash值,根據(jù)計算得到的Hash值確定數(shù)據(jù)所歸屬的Hash分區(qū),將該數(shù)據(jù)寫入到對應的分區(qū)目錄。在上述執(zhí)行Map/Reduce任務的過程中,每個Reduce任務可以對應相同數(shù)量的Hash分區(qū),以便每個Reduce任務可以盡可能處理相當?shù)臄?shù)據(jù)量,因此,Reduce任務的數(shù)目可以小于或等于Hash分區(qū)數(shù),且可以整除Hash分區(qū)數(shù),也就是說,一個Reduce任務可以對一個或多個Hash分區(qū)進行寫操作。此外,實施中,在Hash分區(qū)中存儲數(shù)據(jù)時,還可以進一步包括在入庫的Map/Reduce作業(yè)中將Hash分區(qū)鍵設置為Map/Reduce任務的sortkey。具體的,在數(shù)據(jù)入庫的Map/Reduce作業(yè)中,還可以將Map/Reduce任務的排序鍵(sortkey)設置為Hash分區(qū)鍵,由于排序鍵用于對Map任務計算得到的中間結果進行排序,通過將排序鍵設置為Hash分區(qū)鍵,可以對同一Hash分區(qū)內的數(shù)據(jù)對應的中間結果使用同一排序鍵進行排序,實現(xiàn)數(shù)據(jù)的按序存放。二、數(shù)據(jù)協(xié)同擺放(Co-Location)策略。實施中,進一步的,還可以將同一Hash分區(qū)的數(shù)據(jù)或保存到不同列存儲文件的同一邏輯文件的數(shù)據(jù)存放在相同的節(jié)點。實施中,上述Hash分區(qū)只是在邏輯上實現(xiàn)了相關數(shù)據(jù)的聚合,為了實現(xiàn)從邏輯聚合到物理聚集的轉變,還可以進一步使用數(shù)據(jù)協(xié)同擺放技術,具體地,在向分布式文件系統(tǒng)存放數(shù)據(jù)塊時,可以按照Hash分區(qū)或邏輯文件為單位進行數(shù)據(jù)協(xié)同擺放,將同一Hash分區(qū)的數(shù)據(jù)塊存放到相同的節(jié)點上;對于沒有保存到Hash分區(qū)中的列存儲文件,可以將屬于同一個邏輯文件(但可能屬于不同列存儲文件)的數(shù)據(jù)塊存放到同一個節(jié)點,從而達到相關數(shù)據(jù)的物理聚合。TDW系統(tǒng)的數(shù)據(jù)協(xié)同擺放功能可以對用戶完全透明。TDW系統(tǒng)管理的數(shù)據(jù)位于分布式文件系統(tǒng)中,分布式文件系統(tǒng)包括主節(jié)點和數(shù)據(jù)節(jié)點,其中,數(shù)據(jù)節(jié)點用于存儲數(shù)據(jù),主控節(jié)點可以為分布式文件系統(tǒng)中的獨立節(jié)點,用于控制數(shù)據(jù)節(jié)點存儲數(shù)據(jù)。分布式文件系統(tǒng)中數(shù)據(jù)節(jié)點可以同時是Map/Reduce框架中的從節(jié)點,即,該節(jié)點既可以存儲數(shù)據(jù),也可以處理數(shù)據(jù)。分布式文件系統(tǒng)中的文件可以被分割成定長的數(shù)據(jù)塊,該數(shù)據(jù)塊為申請存儲空間和存放數(shù)據(jù)的基本單位。當客戶端向分布式文件系統(tǒng)中存放數(shù)據(jù)時,主節(jié)點將隨機地將新數(shù)據(jù)塊的副本保存到不同的節(jié)點上。為了實現(xiàn)數(shù)據(jù)的協(xié)同擺放,TDW系統(tǒng)可以根據(jù)新申請的數(shù)據(jù)塊所屬的Hash分區(qū)編號或者列存儲文件的路徑名的hash值(對Hash分區(qū)數(shù)取模),利用下面實施例中提出的“順環(huán)一致性Hash算法”確定該數(shù)據(jù)塊的副本擺放位置。也就是說,TDW系統(tǒng)的Co-Location功能能夠在不犧牲分布式文件系統(tǒng)的可靠性的前提下,保證了數(shù)據(jù)的合理擺放。“順環(huán)一致性Hash算法”是根據(jù)數(shù)據(jù)處理系統(tǒng)的特點對“一致性Hash算法”的簡化而成的?!耙恢滦訦ash算法”原本是為了解決網(wǎng)絡中熱點問題,它只考慮了單個數(shù)據(jù),而“順環(huán)一致性Hash算法”將支持多個副本的存放?!绊槶h(huán)一致性Hash算法”更為簡單高效,而且支持虛擬節(jié)點的概念,即將一個實節(jié)點影射為多個虛擬節(jié)點,這些虛擬節(jié)點可以比較均勻的分布在環(huán)上。因此,當新節(jié)點加入時,虛擬節(jié)點上的數(shù)據(jù)可以比較均勻的轉移到新的節(jié)點上;當有節(jié)點失效時,可以將該節(jié)點上的數(shù)據(jù)副本遷移到某個虛節(jié)點上,待節(jié)點恢復后再遷移回原節(jié)點,從而保證不犧牲數(shù)據(jù)的副本數(shù)目。具體的,在進行“順環(huán)一致性Hash算法”處理時,可以進一步包括將數(shù)據(jù)節(jié)點分為實節(jié)點和虛節(jié)點,一個實節(jié)點映射為多個虛節(jié)點;對每個數(shù)據(jù)節(jié)點計算出該節(jié)點的Hash值,并將其配置到一個Hash環(huán)上,該Hash環(huán)的長度等于系統(tǒng)統(tǒng)一配置的Hash分區(qū)數(shù);主節(jié)點分配數(shù)據(jù)塊副本的存放位置時,確定該數(shù)據(jù)塊的Hash值;根據(jù)數(shù)據(jù)塊的Hash值沿Hash環(huán)將數(shù)據(jù)塊映射到距離其最近的節(jié)點上,在數(shù)據(jù)塊需要保持多個副本時,則順環(huán)選取與副本數(shù)相同的節(jié)點并將數(shù)據(jù)副本保存到這些節(jié)點上。具體實施中,為了實現(xiàn)數(shù)據(jù)協(xié)同擺放,當客戶端向分布式文件系統(tǒng)中存放數(shù)據(jù)時,分布式文件系統(tǒng)中的主節(jié)點可以根據(jù)正在寫入的數(shù)據(jù)塊的Hash值和數(shù)據(jù)節(jié)點的Hash值確定該數(shù)據(jù)塊的存放位置。其中,數(shù)據(jù)節(jié)點的Hash值可以保存在主節(jié)點的配置文件中,可以是根據(jù)數(shù)據(jù)節(jié)點的IP地址計算得到,也可以是管理人員人為設定的。主節(jié)點可以根據(jù)各個數(shù)據(jù)節(jié)點的Hash值,將數(shù)據(jù)節(jié)點配置到Hash環(huán)上。數(shù)據(jù)節(jié)點可以均勻分布在Hash環(huán)上,該Hash環(huán)的長度可以為系統(tǒng)統(tǒng)一配置的Hash分區(qū)數(shù)。Hash環(huán)中的數(shù)據(jù)節(jié)點可以在邏輯上劃分為實節(jié)點和虛擬節(jié)點,一個實節(jié)點可以映射為多個虛擬節(jié)點,虛擬節(jié)點可以均勻地分布在Hash環(huán)上。針對不同的數(shù)據(jù)塊,存放該數(shù)據(jù)塊的數(shù)據(jù)節(jié)點可以是實節(jié)點,也可以是虛擬節(jié)點。當新的數(shù)據(jù)節(jié)點加入Hash環(huán)時,虛擬節(jié)點上的數(shù)據(jù)可以均勻地轉移到該數(shù)據(jù)節(jié)點上;當數(shù)據(jù)節(jié)點失效時,可以將該數(shù)據(jù)節(jié)點上的數(shù)據(jù)遷移到其他的虛擬節(jié)點上,并在該數(shù)據(jù)節(jié)點恢復后,將之前遷移到其他虛擬節(jié)點的數(shù)據(jù)遷移回該數(shù)據(jù)節(jié)點,從而保證數(shù)據(jù)的副本數(shù)目不受影響。主節(jié)點分配數(shù)據(jù)塊的存放位置時,可以計算該數(shù)據(jù)塊的Hash值,并根據(jù)數(shù)據(jù)塊的Hash值以及數(shù)據(jù)節(jié)點的Hash值,沿Hash環(huán)的順時針方向將數(shù)據(jù)塊映射到與Hash值最接近的數(shù)據(jù)節(jié)點上。對于Hash分區(qū)中的數(shù)據(jù)塊而言,該數(shù)據(jù)塊的Hash值為該數(shù)據(jù)塊對應的Hash分區(qū)號;對于沒有使用Hash分區(qū)的列存儲文件而言,主節(jié)點可以根據(jù)客戶端提供的文件名確定其文件類型,將數(shù)據(jù)塊所屬文件的路徑名去除列標簽,再對去除列標簽后的路徑名進行Hash運算,并將得到的Hash結果對Hash分區(qū)數(shù)取模,即可得到數(shù)據(jù)塊的Hash值。如果需要對數(shù)據(jù)塊保存多個副本,可以根據(jù)數(shù)據(jù)塊的Hash值與數(shù)據(jù)節(jié)點的Hash值之間的關系,沿Hash環(huán)的順時針方向選取Hash值最接近的、與副本數(shù)相同數(shù)量的數(shù)據(jù)節(jié)點,并將數(shù)據(jù)塊保存到選取的數(shù)據(jù)節(jié)點上。若所選取的節(jié)點為虛擬節(jié)點,且該虛擬節(jié)點所對應的實節(jié)點上已經(jīng)存放了該數(shù)據(jù)塊的一個副本,則跳過該虛擬節(jié)點,繼續(xù)尋找下一個節(jié)點。若選取的數(shù)據(jù)節(jié)點出現(xiàn)磁盤滿或節(jié)點異常等狀況,則沿Hash環(huán)的順時針方向跳過該數(shù)據(jù)節(jié)點,繼續(xù)尋找下一個數(shù)據(jù)節(jié)點。以下通過具體的實例對數(shù)據(jù)協(xié)同擺放進行詳細的敘述,圖3為數(shù)據(jù)協(xié)同擺放示意圖,如圖3所示,系統(tǒng)統(tǒng)一配置的Hash分區(qū)數(shù)為400,則Hash環(huán)的長度也定義成400,且TDW系統(tǒng)中的數(shù)據(jù)節(jié)點數(shù)為nl,則可以將nl個數(shù)據(jù)節(jié)點根據(jù)Hash值分別均勻映射為0-399中的一個序號,數(shù)據(jù)節(jié)點的序號可以分別為0、5、.......S、s+t、s+t+p,Hash分區(qū)1-5中的數(shù)據(jù)塊可以保存到節(jié)點5上,Hash分區(qū)s+1到s+t中的數(shù)據(jù)塊將保存到節(jié)點s+t上。為了支持數(shù)據(jù)的備份存儲,假定對每個數(shù)據(jù)塊均保存c個副本,則可以在節(jié)點s之后的節(jié)點s+t和s+t+p等(c-Ι)個數(shù)據(jù)節(jié)點上,對節(jié)點s上保存的數(shù)據(jù)進行備份。為了提供更好的容災能力,在將數(shù)據(jù)節(jié)點映射為Hash環(huán)上的序號時,可以將IP地址相鄰的數(shù)據(jù)節(jié)點隨機分布到Hash環(huán)上,使得同機架或者同批次的數(shù)據(jù)節(jié)點的下架不會對數(shù)據(jù)的完整性構成影響。當向TDW系統(tǒng)中加入新的數(shù)據(jù)節(jié)點時,可以按照節(jié)點序號將新的數(shù)據(jù)節(jié)點均勻插入到原有的數(shù)據(jù)節(jié)點中,并完成數(shù)據(jù)的重新分布。圖4為新節(jié)點加入時的數(shù)據(jù)協(xié)同擺放示意圖,如圖4所示,假定新的數(shù)據(jù)節(jié)點的序號為s+t/2,位于節(jié)點s和節(jié)點s+t之間,則可以將Hash分區(qū)s+1到s+t/2的數(shù)據(jù)從節(jié)點s+t上復制到節(jié)點s+t/2中,受到影響的節(jié)點將是局部的、有限的。如果節(jié)點s+t/2暫時不可用,則可以將該節(jié)點上的數(shù)據(jù)塊副本統(tǒng)一遷移到節(jié)點s+t上,也可以利用原有的實節(jié)點虛擬出新的虛節(jié)點s+t/2,由新的s+t/2節(jié)點負責存放原節(jié)點s+t/2上的數(shù)據(jù)副本,待原節(jié)點s+t/2恢復后將該數(shù)據(jù)副本重新交由原節(jié)點s+t/2負責。上述數(shù)據(jù)遷移可以是漸進進行的,以免帶來太大的網(wǎng)絡負擔和節(jié)點負擔。上述實施例說明了對Hash分區(qū)利用順環(huán)一致性Hash算法進行Co-Location數(shù)據(jù)存放的方式。對于列存儲文件,客戶端在申請新的數(shù)據(jù)塊的時候,主節(jié)點根據(jù)客戶端提供的文件名可以判斷出該文件是一個列存儲文件,則可以取文件的路徑名去除列標簽后的Hash值并對環(huán)長度求模,從而將其映射到Hash環(huán)上,同樣可以進行數(shù)據(jù)的Co-Location擺放。三、HashMapJoin。HashMapJoin功能在本申請中是指以Hash分區(qū)為單位在Map端完成Join查詢計算,以期提高計算效率,節(jié)約網(wǎng)絡帶寬、磁盤帶寬和計算資源。該功能可以與Hash分區(qū)以及Co-Location功能一起為分布式數(shù)據(jù)倉庫實現(xiàn)了高效的Join查詢操作解決方法。Hash分區(qū)是實現(xiàn)HashMapJoin的必要條件,而Co-Location是為了進一步提高性能的措施。下面先介紹將Join查詢轉換為Map端進行的Join計算的實施過程。通過對數(shù)據(jù)表的數(shù)據(jù)進行Hash分區(qū),具有相同Hash分區(qū)鍵的數(shù)據(jù)位于同一個Hash分區(qū)中,通過將Hash分區(qū)作為Map任務的劃分依據(jù),可以使得每個Map任務處理一個Hash分區(qū)中的數(shù)據(jù),將Join查詢轉換為Map端進行的Join計算,圖5為Join查詢轉換為Map端進行的Join計算的實施流程示意圖,具體流程如圖5所示,包括以下步驟步驟501,查詢引擎獲取用戶提示信息,根據(jù)該用戶提示信息確定當前的Join查詢?yōu)镸ap端的Join操作。具體地,查詢引擎可以獲取用戶寫入的用戶提示信息,該用戶提示信息可以通過SQL語句的形式表達,用戶可以通過用戶提示信息請求進行Map端的Join操作。步驟502,查詢引擎判斷參與Join查詢的兩個數(shù)據(jù)表是否均對相同的列進行了Hash分區(qū)且Hash分區(qū)數(shù)相同,如果判斷結果為是,則執(zhí)行步驟504;否則,執(zhí)行步驟503。步驟503,按照常規(guī)流程對兩個數(shù)據(jù)表執(zhí)行Join查詢。具體地,查詢引擎可以針對兩個數(shù)據(jù)表,生成基于Join查詢的Map/Reduce任務,并將該任務轉發(fā)給Map/Reduce框架中的主控節(jié)點。主控節(jié)點將接收到的Map/Reduce任務分配到多個從節(jié)點,由從節(jié)點執(zhí)行Map/Reduce任務,完成Join查詢。步驟504,查詢引擎根據(jù)Hash分區(qū)數(shù)生成Map端的Join計算任務。具體地,查詢引擎可以將每個Hash分區(qū)作為一個計算單位,生成Map端的Join計算任務,該Map端的Join計算任務的個數(shù)可以與Hash分區(qū)數(shù)相同,每個Join計算任務負責針對同一個Hash分區(qū)進行Join計算。屬于同一個Hash分區(qū)的數(shù)據(jù)可以作為一個分片(split),交由同一個Map端的Join計算任務來處理。例如,數(shù)據(jù)表a和數(shù)據(jù)表b都只有一級Hash分區(qū),同一個Hash分區(qū)Hash-XXXX內的數(shù)據(jù)由同一個Map計算任務進行Join計算,如圖6所示。步驟505,查詢引擎將Map端的Join計算任務發(fā)送給Map/Reduce框架中的主控節(jié)點。步驟506,主控節(jié)點將Map端的Join計算任務分配給多個從節(jié)點。步驟507,從節(jié)點執(zhí)行Map端的Join計算任務,并對計算結果進行匯總,得到Join查詢結果。具體地,作為Map端,各個從節(jié)點執(zhí)行主控節(jié)點分配的Join計算任務,并將計算結果保存到同一個目錄中,通過該目錄對Join計算任務的計算結果進行匯總,匯總結果即為Join查詢結果。利用TDW的Co-Location功能,兩個數(shù)據(jù)表的相同Hash分區(qū)的所有數(shù)據(jù)位于同一個節(jié)點上,通過將Map任務調度到數(shù)據(jù)所在的節(jié)點將能進一步提高HashMapJoin的計算效率和性能,節(jié)省網(wǎng)絡帶寬和計算資源。由圖6可見,HashMapJoin算法中的每個Map任務將負責處理同一個Hash分區(qū)中的所有文件,而在Map/Reduce框架中,一般地,每個Map任務通常只負責處理一個分布式文件系統(tǒng)數(shù)據(jù)塊(filesplit)。通過實現(xiàn)新的輸入格式類,HashMapJoin允許將屬于同一個Hash分區(qū)的所有文件作為一個分片(split),都交由同一個Map任務來處理。上述實施例說明了在單個MapJoin任務中的實施流程。假定用戶在SQL語句的提示中指出,數(shù)據(jù)表a為小表,數(shù)據(jù)表b為大表(即流式表)。按照MapJoin算法,小表的數(shù)據(jù)將首先被讀取,最后讀取大表的同一Hash分區(qū)的數(shù)據(jù)。圖7為本發(fā)明實施例中的以數(shù)據(jù)表a和數(shù)據(jù)表b為例的Join查詢流程圖;在上述流程中,Map端的Join計算流程如圖7所示,可以包括以下步驟步驟701,Map端讀取參與Join查詢的數(shù)據(jù)表中的數(shù)據(jù)。具體地,在執(zhí)行Join計算任務時,Map端可以通過獲取用戶提示信息,或者對參與計算的兩個數(shù)據(jù)表的大小進行比較的方式,確定數(shù)據(jù)量較大的數(shù)據(jù)表(即,大表)和數(shù)據(jù)量較小的數(shù)據(jù)表(即,小表)。Map端可以先讀取小表中的數(shù)據(jù),再從大表(流式表)中讀取與上述小表中的數(shù)據(jù)位于同一Hash分區(qū)的數(shù)據(jù)。假定用戶在SQL語句的用戶提示信息中指出,數(shù)據(jù)表a為小表,數(shù)據(jù)表b為大表,則在執(zhí)行Map端的Join計算任務時,Map端先讀取數(shù)據(jù)表a中的數(shù)據(jù),再從數(shù)據(jù)表b中讀取與數(shù)據(jù)表a中的數(shù)據(jù)位于同一Hash分區(qū)的數(shù)據(jù)。步驟702,Map端判斷讀取到的數(shù)據(jù)是否來自小表,如果判斷結果為是,則執(zhí)行步驟703;否則,執(zhí)行步驟706。步驟703,Map端檢查內存容器是否已滿,如果未滿,則執(zhí)行步驟704;否則執(zhí)行步驟705。步驟704,Map端將讀取到的數(shù)據(jù)放入內存容器。需要說明的是,在執(zhí)行完本步驟后,繼續(xù)執(zhí)行步驟706。步驟705,Map端將讀取到的數(shù)據(jù)存入硬盤文件。步驟706,Map端從內存容器或硬盤文件中選擇與讀取到的數(shù)據(jù)的Join鍵相同的小表數(shù)據(jù),將讀取到的Join鍵相同的兩部分數(shù)據(jù)進行Join計算,并將計算結果存入分布式文件系統(tǒng)。需要說明的是,在執(zhí)行Map端的Join計算任務的過程中,可以使用HashMap內存容器保存小表數(shù)據(jù),以提高查找數(shù)據(jù)的效率;也可以利用有序列表對內存容器和硬盤文件中的數(shù)據(jù)進行組織存放,即,按照Join鍵對內存容器和硬盤文件中的數(shù)據(jù)進行排列,可以按照Join鍵對大表數(shù)據(jù)進行有序的讀取,并且能夠非常容易地在內存容器或者硬盤文件中查找到與大表數(shù)據(jù)匹配的小表數(shù)據(jù),使得Join計算簡單高效,且節(jié)約內存資源。此外,對于具備數(shù)據(jù)協(xié)同擺放功能的TDW系統(tǒng)而言,參與Join查詢的兩個數(shù)據(jù)表中的同一Hash分區(qū)的所有數(shù)據(jù)存放在同一個數(shù)據(jù)節(jié)點上,通過將Map任務調度到存儲有與該Map任務對應的Hash分區(qū)的數(shù)據(jù)的節(jié)點,在調度時,具體可以根據(jù)數(shù)據(jù)所在的位置和該節(jié)點是否有空閑任務槽進行來調度。該方式能夠提高Join查詢的計算效率和性能,節(jié)省網(wǎng)絡帶寬和計算資源。四、HashMapGroupby0HashMapGroupby功能在本申請中是指以Hash分區(qū)為單位在Map端完成Groupby查詢計算,以期提高計算效率,節(jié)約網(wǎng)絡帶寬、磁盤帶寬和計算資源。該功能可以與Hash分區(qū)以及Co-Location功能一起為分布式數(shù)據(jù)倉庫實現(xiàn)了高效的Groupby查詢操作解決方法。基于Hash分區(qū)進行Groupby查詢的處理流程與上述Join查詢的處理流程類似,不同之處在于,Groupby查詢只處理一個數(shù)據(jù)表,通常會根據(jù)Groupby鍵對該數(shù)據(jù)表進行分組,并根據(jù)分組結果進行匯總計算。在數(shù)據(jù)入庫時,可以根據(jù)Groupby鍵對數(shù)據(jù)進行Hash分區(qū),屬于同一個分組的鍵值對(Groupby鍵相同的一組值)位于同一個Hash分區(qū)中。因此,在進行Groupby查詢時,可以以Hash分區(qū)為單位將同一個Hash分區(qū)中所有數(shù)據(jù)交由同一個Map任務處理。此外,在數(shù)據(jù)入庫時,還可以將Groupby鍵作為Map/Reduce任務的排序鍵,可以保證Groupby鍵相同的數(shù)據(jù)有序地匯聚在一起,Map端進行分組操作時,只需要順序讀入數(shù)據(jù)并對數(shù)據(jù)進行分組即可,簡化了計算流程,提高了計算效率。在對數(shù)據(jù)表中的數(shù)據(jù)進行Hash分區(qū)和數(shù)據(jù)協(xié)同擺放之后,Join查詢和Groupby查詢中的每個Map任務所需的全部數(shù)據(jù)被保存到相同的數(shù)據(jù)節(jié)點上。為了最大程度上利用數(shù)據(jù)協(xié)同擺放的優(yōu)勢,Map/Reduce框架還可以對Map任務根據(jù)數(shù)據(jù)存放位置進行調度。五、基于數(shù)據(jù)擺放位置的Map任務調度的實施。由于Map/Reduce框架僅能保證盡可能將Map任務調度到數(shù)據(jù)所在的節(jié)點上進行。但是,由于進行了基于Hash分區(qū)的協(xié)同數(shù)據(jù)擺放,HashMapJoin和HashMapGroupby查詢中每個Map任務所需的全部數(shù)據(jù)已經(jīng)被保存到相同的節(jié)點上,因此,為了最大程度上利用數(shù)據(jù)協(xié)同擺放的優(yōu)勢,在Map/Reduce框架下還可以進一步提供更強的Map任務調度限制。因此,實施中,還可以進一步包括在Join和Groupby查詢的生命期中,首先優(yōu)先調度執(zhí)行數(shù)據(jù)所在節(jié)點有空閑Map任務槽的那些Map任務;如果列表中的每個Map任務數(shù)據(jù)所在的那幾個節(jié)點都沒有空閑的Map任務槽,則將逐個判斷待調度Map任務數(shù)據(jù)所在節(jié)點正在執(zhí)行的Map任務的執(zhí)行進度;如果執(zhí)行進度高于特定閥值且預期任務完成時間早于特定閥值,則該Map任務將等待直到數(shù)據(jù)副本所在的節(jié)點空閑再調度到該節(jié)點上執(zhí)行,否則,在其他鄰近的空閑節(jié)點上調度執(zhí)行該Map任務。具體地,在Join查詢和Groupby查詢的生命期內,如果Map任務所需的數(shù)據(jù)所在的節(jié)點上有空閑的Map任務槽,則優(yōu)先將該Map任務調度到該節(jié)點上執(zhí)行;如果每個Map任務所需的數(shù)據(jù)所在的節(jié)點上都沒有空閑的Map任務槽,則逐個確定待調度的Map任務所需的數(shù)據(jù)所在的節(jié)點上正在執(zhí)行的Map任務的執(zhí)行進度,如果節(jié)點上正在執(zhí)行的Map任務的執(zhí)行進度高于第一預設閥值且任務預期完成時間早于第二預設閥值,則在該節(jié)點空閑后,將待調度的Map任務調度到該節(jié)點上執(zhí)行;否則,將待調度的Map任務調度到其他鄰近的空閑節(jié)點上執(zhí)行。通過上述任務調度流程,能夠有效地利用數(shù)據(jù)的存放位置,提高計算效率??梢?通過Hash分區(qū)將Join查詢和Groupby查詢轉換成在Map端完成數(shù)據(jù)的處理操作,能夠節(jié)約網(wǎng)絡帶寬、計算資源和磁盤1/0,提高計算效率。通過控制Hash分區(qū)的數(shù)目,可以控制在Map端的Join計算的粒度,從而優(yōu)化對計算資源的利用。此外,數(shù)據(jù)協(xié)同擺放功能支持多個數(shù)據(jù)副本的存放,能夠在不犧牲分布式文件系統(tǒng)的可靠性的前提下,保證了數(shù)據(jù)的合理擺放。通過數(shù)據(jù)協(xié)同擺放,將計算任務分配到該任務所需的數(shù)據(jù)存放的節(jié)點,可以提高Join查詢和Groupby查詢的計算效率。上述數(shù)據(jù)協(xié)同擺放也可以優(yōu)化TDW系統(tǒng)中的其他類型的查詢操作。當然,實施本發(fā)明的實施例的任一產(chǎn)品并不一定需要同時達到以上所述的所有優(yōu)點?;谕话l(fā)明構思,本發(fā)明實施例中還提供了一種數(shù)據(jù)處理系統(tǒng),由于該系統(tǒng)解決問題的原理與一種數(shù)據(jù)處理方法相似,因此該系統(tǒng)的實施可以參見方法的實施,重復之處不再贅述。圖8為數(shù)據(jù)處理系統(tǒng)結構示意圖,如圖所示,在系統(tǒng)中可以包括存儲引擎801,用于在基于Map/Reduce框架完成對SQL查詢的處理和計算,數(shù)據(jù)存儲任務由分布式文件系統(tǒng)完成的數(shù)據(jù)處理中,將數(shù)據(jù)表定義為采用Hash分區(qū)的方式,并在Hash分區(qū)中存儲數(shù)據(jù);查詢引擎802,用于在確定所需執(zhí)行的查詢?yōu)镴oin查詢或Groupby查詢,且源數(shù)據(jù)表為Hash分區(qū)數(shù)據(jù)表、連接鍵或分組鍵為分區(qū)列時,將該查詢修改為在Map端以Hash分區(qū)為單位的Join查詢或Grouby查詢后執(zhí)行查詢。實施中,存儲引擎還可以進一步用于在Hash分區(qū)中存儲數(shù)據(jù)時,將數(shù)據(jù)按照Hash分區(qū)鍵映射到不同的Hash分區(qū)保存,Hash分區(qū)鍵為常用的Join鍵或Groupby鍵。實施中,存儲引擎還可以進一步用于在Hash分區(qū)中存儲數(shù)據(jù)時,在入庫的Map/Reduce作業(yè)中將Hash分區(qū)鍵設置為Map/Reduce任務的sortkey。實施中,存儲引擎還可以進一步用于將同一Hash分區(qū)的數(shù)據(jù)或保存到不同列存儲文件的同一邏輯文件的數(shù)據(jù)存放在相同的節(jié)點。實施中,存儲引擎還可以進一步用于將數(shù)據(jù)節(jié)點分為實節(jié)點和虛節(jié)點,一個實節(jié)點映射為多個虛節(jié)點;對每個數(shù)據(jù)節(jié)點計算出該節(jié)點的Hash值,并將其配置到一個Hash環(huán)上,該Hash環(huán)的長度等于系統(tǒng)統(tǒng)一配置的Hash分區(qū)數(shù);在主節(jié)點分配數(shù)據(jù)塊副本的存放位置時,確定該數(shù)據(jù)塊的Hash值;根據(jù)數(shù)據(jù)塊的Hash值沿Hash環(huán)將數(shù)據(jù)塊映射到距離其最近的節(jié)點上,在數(shù)據(jù)塊需要保持多個副本時,則順環(huán)選取與副本數(shù)相同的節(jié)點并將數(shù)據(jù)副本保存到這些節(jié)點上。實施中,還可以進一步包括計算引擎803,用于在Join和Groupby查詢的生命期中,首先優(yōu)先調度執(zhí)行數(shù)據(jù)所在節(jié)點有空閑Map任務槽的那些Map任務;如果列表中的每個Map任務數(shù)據(jù)所在的幾個節(jié)點都沒有空閑的Map任務槽,則將逐個判斷待調度Map任務數(shù)據(jù)所在節(jié)點正在執(zhí)行的Map任務的執(zhí)行進度;如果執(zhí)行進度高于特定閥值且預期任務完成時間早于特定閥值,則該Map任務將等待直到數(shù)據(jù)副本所在的節(jié)點空閑再調度到該節(jié)點上執(zhí)行,否則,在其他鄰近的空閑節(jié)點上調度執(zhí)行該Map任務。為了描述的方便,以上所述裝置的各部分以功能分為各種引擎、模塊或單元分別描述。當然,在實施本發(fā)明時可以把各引擎、模塊或單元的功能在同一個或多個軟件或硬件中實現(xiàn)。由上述實施例可見,在本發(fā)明實施例提供的技術方案中,為分布式數(shù)據(jù)倉庫增加Hash分區(qū)的分區(qū)方式,將數(shù)據(jù)按照Hash分區(qū)鍵映射到不同的Hash分區(qū)保存。由于鍵相等的數(shù)據(jù)均已被映射到同一個Hash分區(qū)中,因此,對于Join查詢和Groupby查詢而言,可以將Hash分區(qū)作為Map任務的劃分依據(jù),每個Hash分區(qū)由一個Map任務處理,在map端完成數(shù)據(jù)的處理操作,從而達到節(jié)約網(wǎng)絡帶寬、磁盤帶寬和網(wǎng)絡資源,提高計算效率的目的。進一步的,還可以以Hash分區(qū)或邏輯文件(針對列存儲格式)為單位進行數(shù)據(jù)的協(xié)同擺放(Co-Location),也就是說,將屬于同一個Hash分區(qū)的數(shù)據(jù)存放到同一個節(jié)點上,如果列存儲文件沒有保存到Hash分區(qū)中,則把屬于同一個邏輯文件的所有列存儲文件擺放到同一個節(jié)點上。通過這種數(shù)據(jù)的協(xié)同擺放,可以達到進一步提高HashMapJoin和HashMapGroupby計算效率的目的。這種數(shù)據(jù)的協(xié)同擺放也可以優(yōu)化其他相似的查詢。此外,通過盡可能將計算任務分配到數(shù)據(jù)所在的節(jié)點,最大程度的利用數(shù)據(jù)協(xié)同擺放的優(yōu)點。本領域內的技術人員應明白,本發(fā)明的實施例可提供為方法、系統(tǒng)、或計算機程序產(chǎn)品。因此,本發(fā)明可采用完全硬件實施例、完全軟件實施例、或結合軟件和硬件方面的實施例的形式。而且,本發(fā)明可采用在一個或多個其中包含有計算機可用程序代碼的計算機可用存儲介質(包括但不限于磁盤存儲器、CD-ROM、光學存儲器等)上實施的計算機程序產(chǎn)品的形式。本發(fā)明是參照根據(jù)本發(fā)明實施例的方法、系統(tǒng)(設備)、和計算機程序產(chǎn)品的流程圖和/或方框圖來描述的。應理解可由計算機程序指令實現(xiàn)流程圖和/或方框圖中的每一流程和/或方框、以及流程圖和/或方框圖中的流程和/或方框的結合??商峁┻@些計算機程序指令到通用計算機、專用計算機、嵌入式處理機或其他可編程數(shù)據(jù)處理設備的處理器以產(chǎn)生一個機器,使得通過計算機或其他可編程數(shù)據(jù)處理設備的處理器執(zhí)行的指令產(chǎn)生用于實現(xiàn)在流程圖一個流程或多個流程和/或方框圖一個方框或多個方框中指定的功能的裝置。這些計算機程序指令也可存儲在能引導計算機或其他可編程數(shù)據(jù)處理設備以特定方式工作的計算機可讀存儲器中,使得存儲在該計算機可讀存儲器中的指令產(chǎn)生包括指令裝置的制造品,該指令裝置實現(xiàn)在流程圖一個流程或多個流程和/或方框圖一個方框或多個方框中指定的功能。這些計算機程序指令也可裝載到計算機或其他可編程數(shù)據(jù)處理設備上,使得在計算機或其他可編程設備上執(zhí)行一系列操作步驟以產(chǎn)生計算機實現(xiàn)的處理,從而在計算機或其他可編程設備上執(zhí)行的指令提供用于實現(xiàn)在流程圖一個流程或多個流程和/或方框圖一個方框或多個方框中指定的功能的步驟。盡管已描述了本發(fā)明的優(yōu)選實施例,但本領域內的技術人員一旦得知了基本創(chuàng)造性概念,則可對這些實施例作出另外的變更和修改。所以,所附權利要求意欲解釋為包括優(yōu)選實施例以及落入本發(fā)明范圍的所有變更和修改。顯然,本領域的技術人員可以對本發(fā)明進行各種改動和變型而不脫離本發(fā)明的精神和范圍。這樣,倘若本發(fā)明的這些修改和變型屬于本發(fā)明權利要求及其等同技術的范圍之內,則本發(fā)明也意圖包含這些改動和變型在內。權利要求1.ー種數(shù)據(jù)處理方法,其特征在于,包括如下步驟在基于映射/化簡Map/Reduce框架完成對查詢的處理和計算的數(shù)據(jù)處理中,將數(shù)據(jù)表定義為采用哈希Hash分區(qū)的方式,并在Hash分區(qū)中存儲數(shù)據(jù);在確定所需執(zhí)行的查詢?yōu)檫B接查詢或分組查詢,且源數(shù)據(jù)表為Hash分區(qū)數(shù)據(jù)表、連接鍵或分組鍵為分區(qū)列時,將該查詢修改為在Map端以Hash分區(qū)為單位的連接查詢或分組查詢后執(zhí)行查詢。2.如權利要求I所述的方法,其特征在于,在Hash分區(qū)中存儲數(shù)據(jù),包括將數(shù)據(jù)按照Hash分區(qū)鍵映射到不同的Hash分區(qū)保存,Hash分區(qū)鍵為連接鍵或分組鍵。3.如權利要求I所述的方法,其特征在于,在Hash分區(qū)中存儲數(shù)據(jù)時,進一歩包括在入庫的Map/Reduce作業(yè)中將Hash分區(qū)鍵設置為Map/Reduce任務的排序鍵。4.如權利要求I所述的方法,其特征在干,進ー步包括將同一Hash分區(qū)的數(shù)據(jù)或保存到不同列存儲文件的同一邏輯文件的數(shù)據(jù)存放在相同的節(jié)點。5.如權利要求I所述的方法,其特征在干,進ー步包括將數(shù)據(jù)節(jié)點分為實節(jié)點和虛節(jié)點,一個實節(jié)點映射為多個虛節(jié)點;對姆個數(shù)據(jù)節(jié)點計算出該節(jié)點的Hash值,并將其配置到ー個Hash環(huán)上,該Hash環(huán)的長度等于系統(tǒng)統(tǒng)ー配置的Hash分區(qū)數(shù);在主節(jié)點分配數(shù)據(jù)塊副本的存放位置吋,確定該數(shù)據(jù)塊的Hash值;根據(jù)數(shù)據(jù)塊的Hash值沿Hash環(huán)將數(shù)據(jù)塊映射到距離其最近的節(jié)點上,在數(shù)據(jù)塊需要保持多個副本吋,則順環(huán)選取與副本數(shù)相同的節(jié)點并將數(shù)據(jù)副本保存到這些節(jié)點上。6.如權利要求I至5任一所述的方法,其特征在干,進ー步包括在連接和分組查詢的生命期中,首先優(yōu)先調度執(zhí)行數(shù)據(jù)所在節(jié)點有空閑Map任務槽的Map任務;如果列表中的每個Map任務數(shù)據(jù)所在的節(jié)點都沒有空閑的Map任務槽,則將逐個判斷待調度Map任務數(shù)據(jù)所在節(jié)點正在執(zhí)行的Map任務的執(zhí)行進度;如果執(zhí)行進度高于特定閥值且預期任務完成時間早于特定閥值,則該Map任務將等待直到數(shù)據(jù)副本所在的節(jié)點空閑再調度到該節(jié)點上執(zhí)行,否則,在其他鄰近的空閑節(jié)點上調度執(zhí)行該Map任務。7.ー種數(shù)據(jù)處理系統(tǒng),其特征在于,包括存儲引擎,用于在基于Map/Reduce框架完成對查詢的處理和計算的數(shù)據(jù)處理中,將數(shù)據(jù)表定義為采用哈希Hash分區(qū)的方式,并在Hash分區(qū)中存儲數(shù)據(jù);查詢引擎,用于在確定所需執(zhí)行的查詢?yōu)檫B接查詢或分組查詢,且源數(shù)據(jù)表為Hash分區(qū)數(shù)據(jù)表、連接鍵或分組鍵為分區(qū)列時,將該查詢修改為在Map端以Hash分區(qū)為單位的連接查詢或分組查詢后執(zhí)行查詢。8.如權利要求7所述的系統(tǒng),其特征在于,查詢引擎進ー步用于在Hash分區(qū)中存儲數(shù)據(jù)時,將數(shù)據(jù)按照Hash分區(qū)鍵映射到不同的Hash分區(qū)保存,Hash分區(qū)鍵為常用的連接鍵或分組鍵。9.如權利要求7所述的系統(tǒng),其特征在于,查詢引擎進ー步用于在Hash分區(qū)中存儲數(shù)據(jù)時,在入庫的Map/Reduce作業(yè)中將Hash分區(qū)鍵設置為Map/Reduce任務的排序鍵。10.如權利要求7所述的系統(tǒng),其特征在于,存儲引擎進一歩用于將同一Hash分區(qū)的數(shù)據(jù)或保存到不同列存儲文件的同一邏輯文件的數(shù)據(jù)存放在相同的節(jié)點。11.如權利要求7所述的系統(tǒng),其特征在于,存儲引擎進ー步將數(shù)據(jù)節(jié)點分為實節(jié)點和虛節(jié)點,一個實節(jié)點映射為多個虛節(jié)點;對每個數(shù)據(jù)節(jié)點計算出該節(jié)點的Hash值,并將其配置到ー個Hash環(huán)上,該Hash環(huán)的長度等于系統(tǒng)統(tǒng)ー配置的Hash分區(qū)數(shù);在主節(jié)點分配數(shù)據(jù)塊副本的存放位置吋,確定該數(shù)據(jù)塊的Hash值;根據(jù)數(shù)據(jù)塊的Hash值沿Hash環(huán)將數(shù)據(jù)塊映射到距離其最近的節(jié)點上,在數(shù)據(jù)塊需要保持多個副本吋,則順環(huán)選取與副本數(shù)相同的節(jié)點并將數(shù)據(jù)副本保存到這些節(jié)點上。12.如權利要求7至11任一所述的系統(tǒng),其特征在干,進ー步包括計算引擎,用于在連接和分組查詢的生命期中,首先優(yōu)先調度執(zhí)行數(shù)據(jù)所在節(jié)點有空閑Map任務槽的Map任務;如果列表中的每個Map任務數(shù)據(jù)所在的節(jié)點都沒有空閑的Map任務槽,則將逐個判斷待調度Map任務數(shù)據(jù)所在節(jié)點正在執(zhí)行的Map任務的執(zhí)行進度;如果執(zhí)行進度高于特定閥值且預期任務完成時間早于特定閥值,則該Map任務將等待直到數(shù)據(jù)副本所在的節(jié)點空閑再調度到該節(jié)點上執(zhí)行,否則,在其他鄰近的空閑節(jié)點上調度執(zhí)行該Map任務。全文摘要本發(fā)明公開了一種數(shù)據(jù)處理方法及系統(tǒng),包括在基于映射/化簡框架完成對結構化查詢語言查詢的處理和計算,數(shù)據(jù)存儲任務由分布式文件系統(tǒng)完成的數(shù)據(jù)處理中,將數(shù)據(jù)表定義為采用哈希分區(qū)的方式,并在哈希分區(qū)中存儲數(shù)據(jù);在確定所需執(zhí)行的查詢?yōu)檫B接查詢或分組查詢,且源數(shù)據(jù)表為哈希分區(qū)數(shù)據(jù)表、連接鍵或分組鍵為分區(qū)列時,將該查詢修改為在映射端以哈希分區(qū)為單位的連接查詢或分組查詢后執(zhí)行查詢。本發(fā)明可以減小連接查詢和分組查詢的開銷,實現(xiàn)節(jié)約網(wǎng)絡帶寬、磁盤帶寬和網(wǎng)絡資源,提高了計算效率。文檔編號G06F17/30GK102831120SQ201110160630公開日2012年12月19日申請日期2011年6月15日優(yōu)先權日2011年6月15日發(fā)明者張書彬,趙彥榮,郭瑋,李均,趙偉,洪坤乾,徐釗申請人:騰訊科技(深圳)有限公司