專利名稱:Discosql結(jié)構(gòu)化查詢的分布式處理的制作方法
DISCOSQL:結(jié)構(gòu)化查詢的分布式處理
背景
因為計算設(shè)備在全世界的互連性日益增加,這些計算設(shè)備所收集和生成的 數(shù)據(jù)以指數(shù)速率增長。使用傳統(tǒng)方法處理這一數(shù)量日益增加的數(shù)據(jù)的時間因此 也將指數(shù)增長。對于企業(yè)、教育和政府機構(gòu)以及提供或者消費從數(shù)十億個單獨 數(shù)據(jù)點導(dǎo)出的服務(wù)的其它機構(gòu)而言,以高效的方式管理這樣大量的數(shù)據(jù)變得至 關(guān)緊要。因而,隨著所收集和生成的數(shù)據(jù)量增長,用于存儲、管理和操作這些 數(shù)據(jù)的基礎(chǔ)設(shè)施也需要擴展。
傳統(tǒng)上,使用容錯存儲系統(tǒng)和并行處理算法來高效地處理大量數(shù)據(jù)。容錯 存儲系統(tǒng)使大量數(shù)據(jù)能夠跨數(shù)百或甚至數(shù)千廉價的存儲介質(zhì)來存儲,而不管這 些存儲介質(zhì)中至少一個出現(xiàn)故障而使存儲在其上的數(shù)據(jù)無法訪問的風(fēng)險。并行 處理或者算法使大量數(shù)據(jù)能夠通過簡單地跨廉價的處理設(shè)備諸如存在于現(xiàn)代 計算硬件中的多核微處理器來劃分必要的運算量來得到高效的收集和處理。
然而,盡管容錯存儲系統(tǒng)可按通用方式實現(xiàn),使得單個容錯存儲算法可用 于存儲任何類型的信息,但并行處理算法按其性質(zhì)是專用于它們所尋求解決的 特定問題或者它們所尋求完成的特定任務(wù)的。因而,搜索引擎可使用相同的容 錯存儲機制作為氣象預(yù)報引擎,但明顯地它們各自依賴于極為不同的并行處理 算法。
概述
即使對于有經(jīng)驗的程序設(shè)計者而言,生成執(zhí)行并行處理所需的計算指令也 是一項令人氣餒的任務(wù)。例如,為生成可利用并行處理的算法,程序設(shè)計者必 須考慮數(shù)量不斷變化的各獨立進程,必須標(biāo)識和劃出其算法中可以并行執(zhí)行的 那些方面,以及必須慮及跨進程邊界的信息通信,等等。因此,在一個實施例 中,普通的結(jié)構(gòu)化査詢命令可以翻譯成中間形式,從而允許簡化從并行處理中 受益的算法的生成。該中間形式可充分利用可包含針對并行處理來優(yōu)化的、可 在沒有任何并行處理方法的高級知識的情況下使用的若干核心命令的現(xiàn)有技
5術(shù)。這些核心命令可基于在并行或分布式計算中普遍使用的操作,諸如將數(shù)據(jù)
劃分成各個集合或者"桶(bucket)"中、聚合并行輸出、并行地處理數(shù)據(jù)、
以及聯(lián)結(jié)兩個并行輸出。
在一替換實施例中,提供了支持將結(jié)構(gòu)化査詢包含在用諸如可提供針對并 行處理來優(yōu)化的核心命令的語言等較高級程序設(shè)計語言編寫的程序代碼中的 機制。該結(jié)構(gòu)化査詢最初可被翻譯成與該較高級程序設(shè)計語言兼容的形式,并 且這樣的翻譯可利用針對并行處理來優(yōu)化的核心命令。接著,可將原始地以該 較高級程序設(shè)計語言編程的代碼與該結(jié)構(gòu)化査詢的翻譯形式一起編譯成針對 并行處理來優(yōu)化的形式。
在另一替換實施例中,提供了支持將結(jié)構(gòu)化查詢包含在使用諸如可提供針 對并行處理來優(yōu)化的核心命令的腳本語言等腳本語言編寫的腳本中的機制。該 結(jié)構(gòu)化査詢最初可被翻譯成中間形式,諸如與一較高級程序設(shè)計語言兼容的形 式。接著,該結(jié)構(gòu)化査詢的翻譯形式可被編譯成針對并行處理來優(yōu)化的形式而 腳本可解釋成針對并行處理來優(yōu)化的形式。腳本的解釋和結(jié)構(gòu)化査詢的翻譯形
式的編譯兩者都可以引用用于生成針對并行處理來優(yōu)化的指令的等價庫。 提供本概述以便用簡化形式介紹在下面的詳細描述中進一步描述的一些
概念。本概述不旨在標(biāo)識所要求保護的主題的關(guān)鍵特征或必要特征,也不旨在
用于限制所要求保護的主題的范圍。
通過參考附圖閱讀以下詳細描述,將使其它特征和優(yōu)點顯而易見。
附圖描述
結(jié)合附圖閱讀下面的詳細描述將最好地理解它們,附圖中
圖1是包括多個互連設(shè)備的示例性網(wǎng)絡(luò)的框圖,這些互連設(shè)備中的一些可 并行地執(zhí)行操作;
圖2是示例性計算設(shè)備的框圖; 圖3是"處理"核心命令的框圖; 圖4是"分發(fā)"核心命令的框圖; 圖5是"聚合"核心命令的框圖6是在"分發(fā)"核心命令之后執(zhí)行的"聚合"核心命令的框6圖7是"聯(lián)結(jié)"核心命令的框圖; 圖8是"叉積"核心命令的框圖; 圖9是示出結(jié)構(gòu)化査詢的翻譯的框圖;以及 圖IO是示出對嵌入式結(jié)構(gòu)化查詢的支持的框圖。
詳細描述
下面的描述涉及提供用于基于一個或多個結(jié)構(gòu)化査詢生成針對并行處理 來優(yōu)化的指令的機制。結(jié)構(gòu)化査詢可以基于所使用的結(jié)構(gòu)化查詢命令來翻譯成 中間形式。在一個實施例中,中間形式可以包括高級程序設(shè)計語言中的指令或 者與之兼容,使得中間形式的后續(xù)編譯可以充分利用預(yù)先存在的用于生成針對 并行處理來優(yōu)化的指令的機制。獨立的結(jié)構(gòu)化查詢首先可翻譯成中間形式且隨 后可編譯成可并行地跨多個進程或處理器執(zhí)行的較低級的計算機可執(zhí)行指令。
在一替換實施例中,結(jié)構(gòu)化查詢可以與用高級程序設(shè)計語言或者用腳本語 言編寫的命令和指令合并。與高級程序設(shè)計語言指令合并的結(jié)構(gòu)化査詢首先可 翻譯成與高級程序設(shè)計語言兼容或者甚至與之等價的形式,且隨后經(jīng)翻譯的結(jié) 構(gòu)化查詢和其它高級程序設(shè)計語言指令可編譯成針對并行處理來優(yōu)化的較低 級計算機可執(zhí)行指令。相反,合并到腳本中的結(jié)構(gòu)化査詢首先可翻譯成與高級 程序設(shè)計語言兼容的形式,且隨后經(jīng)翻譯的結(jié)構(gòu)化査詢可編譯成針對并行處理 來優(yōu)化的較低級計算機可執(zhí)行指令,同時支持腳本可解釋成針對并行處理來優(yōu) 化的較低級計算機可執(zhí)行指令。在一個實施例中,結(jié)構(gòu)化查詢的翻譯形式的解 釋和支持腳本的編譯都可引用等價的較低級計算機可執(zhí)行指令庫。
在此描述的技術(shù)集中于但非限制于基于結(jié)構(gòu)化査詢語言(SQL)語句生成 針對并行處理來優(yōu)化的指令。然而,下面描述的實施例都不使用在用于結(jié)構(gòu)化
査詢的其它計算機語言中不存在的SQL的任何方面。因此,盡管下面提供的 特定示是使用SQL示出的,但在此提供的描述不旨在受此限制。同樣,盡管 在下面提供的特定示例示出將SQL語句翻譯成CW吾句,但所依賴的0#計算機 程序設(shè)計語言的任何方面都可在諸如Visual Basic⑧或0++等大量其它較高級 計算機程序設(shè)計語言中找到。因而,僅出于說明目的而對C弁的使用不意味著 將下面的描述限制于任何特定的較高級計算機程序設(shè)計語言。
7轉(zhuǎn)到圖l,示出示例性網(wǎng)絡(luò)系統(tǒng)99,它包括網(wǎng)絡(luò)90本身、客戶機計算設(shè) 備50、文件系統(tǒng)41、以及諸如服務(wù)器計算設(shè)備10、 20和30等多個服務(wù)器計 算設(shè)備,它們都連接到網(wǎng)絡(luò)90。文件系統(tǒng)41可以在客戶機計算設(shè)備50、服務(wù) 器計算設(shè)備IO、 20和30之一或者某個其它計算設(shè)備的本地,或者它可以分布 在諸如計算設(shè)備10、 20、 30或50等多個計算設(shè)備之間。文件系統(tǒng)41可以包 括可用作SQL語句60所針對的輸入數(shù)據(jù)40的一個或多個文件。更具體地, SQL語句60可以包含用于對輸入數(shù)據(jù)40進行排序、分類或其它處理的SQL 命令。
在一個實施例中,SQL語句60可以由翻譯器70處理,翻譯器70可以產(chǎn) 生在圖1中由程序80表示的中間形式。程序80可以包含計算機編程命令,包 括針對并行處理來優(yōu)化的核心命令。在編譯后,程序80的命令可以產(chǎn)生一個 或多個可以用SQL語句60所指定的方式與諸如輸入數(shù)據(jù)40等數(shù)據(jù)進行交互 的計算機可執(zhí)行程序。盡管在圖1中SQL語句60被示為獨立元素,但在一替 換實施例中,SQL語句被合并到用較高級程序設(shè)計語言編寫的程序代碼中,或 者合并到用腳本語言編寫的腳本中。在任一情形中,SQL語句60仍可由翻譯 器70翻譯成中間形式,諸如程序80。然而在這些情形中,所得到的計算機可 執(zhí)行程序可以包含從程序80的編譯和宿主程序代碼的編譯或宿主腳本的解釋 而導(dǎo)出的指令。
通過針對并行處理進行優(yōu)化,程序80可以在編譯后執(zhí)行至少部分地由 SQL語句60指定的數(shù)據(jù)操縱,這比由單個進程執(zhí)行該處理的情況快了若干數(shù) 量級。例如,如果輸入數(shù)據(jù)40包含數(shù)百萬億字節(jié)的數(shù)據(jù),則使用單個計算設(shè) 備處理該數(shù)據(jù)要花費數(shù)日甚至數(shù)星期才能完成。為在合理的時間內(nèi)處理這樣大 小的數(shù)據(jù),多個計算設(shè)備(其每一個可以主存一個或多個獨立進程)可以獨立 地并且并行地處理輸入數(shù)據(jù)40的某個部分,從而以與并行操作的獨立進程的 數(shù)量成比例的因子來減少了處理時間。
現(xiàn)代服務(wù)器計算設(shè)備通常包括能夠執(zhí)行多個同時進程的多個處理器。此 外,虛擬機技術(shù)通常使這樣的服務(wù)器計算設(shè)備能夠并行地執(zhí)行比所安裝處理器 的物理數(shù)量更多的進程。然而,僅為了簡化說明和描述,并且不是因為所描述 的機制中有任何固有限制,下面的描述將按照服務(wù)器計算設(shè)備10、 20和30包括能夠同時執(zhí)行單個進程的單個處理器來進行。
盡管并非所需,但下面的描述將在由一個或多個計算設(shè)備執(zhí)行的計算機可 執(zhí)行指令(諸如程序模塊)的一般上下文中進行。更具體地,除非另有說明, 否則這些描述將參考由一個或多個計算設(shè)備或外圍設(shè)備執(zhí)行的動作和操作的 符號表示。因此,可以理解,有時稱為由計算機執(zhí)行的這些動作和操作包括處 理單元對表示結(jié)構(gòu)化形式的數(shù)據(jù)的電信號的操縱。該操縱變換數(shù)據(jù)或者在存儲 器的單元中維護該數(shù)據(jù),這用本領(lǐng)域技術(shù)人員所熟知的方式重新配置或者以其 它方式改變計算設(shè)備或者外圍設(shè)備的操作。在其中維護數(shù)據(jù)的數(shù)據(jù)結(jié)構(gòu)是具有 由該數(shù)據(jù)的格式所定義的特定屬性的物理單元。
一般而言,程序模塊包括執(zhí)行特定任務(wù)或者實現(xiàn)特定抽象數(shù)據(jù)類型的例 程、程序、對象、組件、數(shù)據(jù)結(jié)構(gòu)等等。此外,本領(lǐng)域技術(shù)人員將會了解,計 算設(shè)備不必限于常規(guī)的個人計算機,并且包括其它計算配置,包括手持式設(shè)備、 多處理器系統(tǒng)、基于微處理器或者可編程消費電子產(chǎn)品、網(wǎng)絡(luò)PC、小型計算 機、大型計算機等等。同樣,計算設(shè)備不必限于獨立的計算設(shè)備,因為這些機 制也可在其中任務(wù)由通過通信網(wǎng)絡(luò)鏈接的遠程處理設(shè)備來執(zhí)行的分布式計算 環(huán)境中實踐。在分布式計算環(huán)境中,程序模塊可以位于本地和遠程存儲器存儲 設(shè)備中。
參考圖2,示出示例性計算設(shè)備100。計算設(shè)備100可以表示圖1的計算 設(shè)備10、 20、 30或50中的任一個。示例性計算設(shè)備100可包括但不限于一個 或多個中央處理單元(CPU) 120、系統(tǒng)存儲器130、和將包含系統(tǒng)存儲器在內(nèi) 的各種系統(tǒng)組件耦合到處理單元120的系統(tǒng)總線121。系統(tǒng)總線121可以是若 干總線結(jié)構(gòu)中的任一種,包括存儲器總線或存儲器控制器、外圍總線、和使用 各種總線體系結(jié)構(gòu)中的任一種的局部總線。
計算設(shè)備100 —般還包括計算機可讀介質(zhì),計算機可讀介質(zhì)可包括可由計 算設(shè)備100訪問的任何可用介質(zhì)并且包括易失性和非易性介質(zhì)以及可移動和不 可移動介質(zhì)。作為示例而非限制,計算機可讀介質(zhì)可包括計算機存儲介質(zhì)和通 信介質(zhì)。計算機存儲介質(zhì)包括以存儲諸如計算機可讀指令、數(shù)據(jù)結(jié)構(gòu)、程序模 塊或其它數(shù)據(jù)等信息的任何方法或技術(shù)實現(xiàn)的介質(zhì)。計算機存儲介質(zhì)包括但不 限于RAM、 ROM、 EEPROM、閃存或其它存儲器技術(shù),CD-ROM、數(shù)字多功能盤(DVD)或其它光盤存儲,磁盒、磁帶、磁盤存儲或其它磁存儲設(shè)備,或
者可用于存儲所需信息并且可由計算設(shè)備ioo訪問的任何其它介質(zhì)。通信介質(zhì)
一般以諸如載波或者其它傳輸機制等已調(diào)制數(shù)據(jù)信號來體現(xiàn)計算機可讀指令、 數(shù)據(jù)結(jié)構(gòu)、程序模塊或其它數(shù)據(jù),并且包括任何信息傳送介質(zhì)。作為示例而非 限制,通信介質(zhì)包括有線介質(zhì),諸如有線網(wǎng)絡(luò)或直接線連接,以及無線介質(zhì),
諸如聲學(xué)、RF、紅外和其它無線介質(zhì)。任何上述各項的組合也應(yīng)當(dāng)包括在計算 機可讀介質(zhì)的范圍內(nèi)。
系統(tǒng)存儲器130包括易失性和/或非易失性存儲器形式的計算機存儲介質(zhì), 諸如只讀存儲器(ROM) 131和隨機存取存儲器(RAM) 132?;据斎?輸出 系統(tǒng)133 (BIOS)包含在諸如啟動時幫助在計算設(shè)備100內(nèi)的元件之間傳送信 息的基本例程,它通常存儲在ROM131中。RAM132—般包含可由處理單元 120立即訪問和/或當(dāng)前正在操作的數(shù)據(jù)和/或程序模塊。作為示例而非限制, 圖2示出了操作系統(tǒng)134、其它程序模塊135和程序數(shù)據(jù)136。
計算設(shè)備100還可包括其它可移動/不可移動、易失性/非易失性計算機存 儲介質(zhì)。僅作為示例,圖2示出了讀寫不可移動、非易失性磁介質(zhì)的硬盤驅(qū)動 器141??膳c該示例性計算設(shè)備一起使用的其它可移動/不可移動、易失性/非 易失性計算機存儲介質(zhì)包括但不限于,磁帶盒、閃存卡、數(shù)字多功能盤、數(shù)字 錄像帶、固態(tài)RAM、固態(tài)ROM等等。硬盤驅(qū)動器141通常通過不可移動存 儲器接口,諸如接口 140連接到系統(tǒng)總線121。
上面討論且在圖2所示出的驅(qū)動器及其相關(guān)聯(lián)的計算機存儲介質(zhì)為計算 設(shè)備100提供對計算機可讀指令、數(shù)據(jù)結(jié)構(gòu)、程序模塊和其它數(shù)據(jù)的存儲。例 如在圖2中,硬盤驅(qū)動器141被示為存儲操作系統(tǒng)144、其它程序模塊145和 程序數(shù)據(jù)146。注意這些組件可以與操作系統(tǒng)134、其它程序模塊135和程序 數(shù)據(jù)136相同,也可以不同。操作系統(tǒng)144、其它程序模塊145和程序數(shù)據(jù)146 在此給出不同的標(biāo)號以說明至少它們是不同的副本。
與下面的描述相關(guān),計算設(shè)備100可在使用到一個或多個遠程計算機的邏 輯連接的網(wǎng)絡(luò)化環(huán)境中運行。為了簡化說明,計算設(shè)備100在圖2中示為連接 到不限于任何特定網(wǎng)絡(luò)或連網(wǎng)協(xié)議的網(wǎng)絡(luò)90。圖2所示的邏輯連接是一般網(wǎng)絡(luò) 連接171,它可以是局域網(wǎng)(LAN)、廣域網(wǎng)(WAN)或其它網(wǎng)絡(luò)。計算設(shè)備100通過網(wǎng)絡(luò)接口或適配器170連接到一般網(wǎng)絡(luò)連接171,而網(wǎng)絡(luò)接口或適配 器170進而連接到系統(tǒng)總線121。在網(wǎng)絡(luò)化環(huán)境中,相對于計算設(shè)備100所描 繪的程序模塊或者其部分或外圍設(shè)備可以存儲在通過一般網(wǎng)絡(luò)連接171在通信 上耦合到計算設(shè)備100的一個或多個其它計算設(shè)備的存儲器中??梢粤私?,所 示的網(wǎng)絡(luò)連接是示例性的并且可以使用在計算設(shè)備之間建立通信鏈路的其它 手段。
然而,無論使用什么特定的網(wǎng)絡(luò)連接和通信協(xié)議,只要計算設(shè)備50可以 用適當(dāng)?shù)姆绞脚c服務(wù)器計算設(shè)備IO、 20和30通信,則該計算設(shè)備可以使用這 些服務(wù)器計算設(shè)備來并行地執(zhí)行可完成針對輸入數(shù)據(jù)40的功能的程序80的編 譯版本。為使程序80的創(chuàng)建更容易,可以提供可像較高級程序設(shè)計語言的任 何其它命令一樣使用的核心命令,除了這些命令并非生成用于在單個處理器上 執(zhí)行的指令而是改為生成為在多個并行處理器上正確執(zhí)行所需的適當(dāng)指令以 外。
圖1的翻譯器70可以在將SQL語句60的SQL命令變換成程序80時利 用這些核心命令。具體地,程序80可以包括較高級計算機編程指令,包括下 面詳細描述的核心命令中的一個或多個。此外,程序80的后續(xù)編譯可以利用 與支持程序設(shè)計者直接使用的核心命令的庫相同的庫。
為描述對用于并行地執(zhí)行結(jié)構(gòu)化査詢的機制的提供,下面的描述最初以對 可用于生成程序80的核心命令的描述來進行。后續(xù)描述隨后將集中于使用這 些核心命令作為用于生成針對并行處理來優(yōu)化的計算機可執(zhí)行指令的過程的 一部分。
轉(zhuǎn)到這些核心命令,一個這樣的核心命令可以使程序設(shè)計者能夠并行地將 一個函數(shù)應(yīng)用于數(shù)據(jù),從而與串行執(zhí)行該函數(shù)相比有可能顯著地減少執(zhí)行該函 數(shù)所需的時間。例如,如果程序設(shè)計者想要從幾十億個網(wǎng)頁的集合中標(biāo)識出使 用某個特定詞語的每個網(wǎng)頁,則程序設(shè)計者所編寫的搜索函數(shù)可由數(shù)千個并行 操作的獨立處理器來執(zhí)行,每一獨立處理器使用該函數(shù)搜索僅僅幾千個網(wǎng)頁。 因而搜索這些網(wǎng)頁的速度將比單個處理器由其自己執(zhí)行同一函數(shù)來搜索所有 幾十億個網(wǎng)頁的情況要快幾千倍。
轉(zhuǎn)到圖3,參考功能圖200示出了這樣一個核心命令,其在下文稱為"處理"命令。在程序80內(nèi)使用處理命令210可以允許執(zhí)行參考服務(wù)器計算設(shè)備 10、 20和30所示出的操作。具體地,程序設(shè)計者可以指定要作為輸入來提供 給處理命令210的函數(shù)。處理命令210隨后可跨多個進程來并行地應(yīng)用該函數(shù)。 例如,如圖3所示,如果程序設(shè)計者所指定的函數(shù)相對于輸入數(shù)據(jù)40執(zhí)行某 個動作,則可跨服務(wù)器計算設(shè)備10、 20和30來將該數(shù)據(jù)劃分成數(shù)據(jù)段230、 240和250,隨后所指定的函數(shù)220可如圖所示地并行地操作每個數(shù)據(jù)段。
因為處理核心命令210向程序設(shè)計者提供并行地處理可由程序設(shè)計者自 己編寫來適合其特定需求的各種各樣的函數(shù)的能力,所以處理命令是非常通用 的。然而,特別是在數(shù)據(jù)交互領(lǐng)域內(nèi)存在若干常用函數(shù),可以將這些函數(shù)提供 給程序設(shè)計者以避免迫使每個程序設(shè)計者在不必進行定制的時候獨立地編寫 他們自己的版本。因而,設(shè)想了其它一些核心函數(shù),它們向程序設(shè)計者提供了 對較為普遍使用的數(shù)據(jù)處理函數(shù)的簡化訪問。
一個這樣的核心命令可以允許根據(jù)可由程序設(shè)計者指定的一個或多個準 則來并行地將多個數(shù)據(jù)段劃分成子部分。這樣一個核心命令(下文中稱為"分 發(fā)"命令)由圖4的功能圖300示出。如圖所示,在程序80中與一個由圖4 中的變量"N"表示的指定值一起使用分發(fā)命令310,使程序設(shè)計者能夠?qū)⒏?個數(shù)據(jù)部分并行地劃分成由值"N"所指定的多個子部分。例如,輸入數(shù)據(jù)40 可以在并行操作的多個不同進程之間分發(fā),諸如由獨立的服務(wù)器計算設(shè)備10、 20和30所表示的進程。每個分發(fā)的數(shù)據(jù)230、 240和250隨后可分別由服務(wù)器 計算設(shè)備10、 20和30并行地劃分成子部分320、 330和340。
除了將數(shù)據(jù)劃分成子部分之外,數(shù)據(jù)處理領(lǐng)域中常見的另一個操作是將兩 個或多個獨立的數(shù)據(jù)集合聚合成單個數(shù)據(jù)集合。因而,可以向編程者提供對普 遍使用的命令的簡化訪問的另一個核心命令是"聚合"核心命令,在一個實施 例中該核心命令的操作由圖5的功能圖400示出。如圖所示,聚合命令410在 被用于程序80中時可以使各自分別有權(quán)訪問數(shù)據(jù)段230、 240和250的服務(wù)器 計算設(shè)備10、 20和30將這些數(shù)據(jù)段中的每一個組合到單個數(shù)據(jù)集合420中。
在一替換實施例中,當(dāng)與先前描述的分發(fā)命令310結(jié)合使用時,聚合命令 410可以執(zhí)行略有不同的默認函數(shù)。轉(zhuǎn)到圖6,所示的功能圖500示出在一起 使用分發(fā)和聚合命令時它們的操作。具體地,在程序80中組合分發(fā)和聚合命令510可以使由服務(wù)器計算設(shè)備10、 20和30分別并行處理的數(shù)據(jù)段230、 240 和250在最初分別被劃分成子部分320、 330和340,然后分別被聚合到數(shù)據(jù)集 合520、 530和540中。具體地,通過將子部分320的第一子部分與子部分330 和340的第一子部分聚合到第一聚合數(shù)據(jù)集合520中、通過將子部分320的第 二子部分與子部分330和340的第二子部分聚合到第二聚合數(shù)據(jù)集合530中、 并通過以此方式聚合子部分320、 330和340的所有子部分來聚合子部分320、 330和340。
如本領(lǐng)域技術(shù)人員將認識到的,圖6所示的分發(fā)和聚合命令的組合510 是經(jīng)常使用的映射命令,可通過它們根據(jù)某個指定準則來分類其各部分為數(shù)據(jù) 段230、 240和250的數(shù)據(jù)集合。因此,在一個實施例中,分發(fā)和聚合核心命 令的組合可以通過根據(jù)圖6的功能圖500執(zhí)行的映射命令來抽象。
盡管聚合命令410可以組合來自由單個在前命令所輸出的多個數(shù)據(jù)集合
的或存儲在文件中的數(shù)據(jù),但在另一個實施例中,可以提供核心命令來用于組 合來自其中每個集合都是一個在前命令的輸出的多個集合的數(shù)據(jù)。因而,這樣
的核心命令將能夠組合兩個或多個在前命令的輸出。
圖7的功能圖600所示出的一個這樣的核心命令是"聯(lián)結(jié)"核心命令。通 過在程序80中使用聯(lián)結(jié)命令610,程序設(shè)計者可使先前執(zhí)行的并由輸出620、 630和640表示的第一操作的輸出與也是在先前執(zhí)行的并由輸出625、 635和 645表示的第二操作的輸出組合起來。更具體地,將被稱為"左"和"右"的 這兩個在前操作的結(jié)果相組合,使得第一位的"左"結(jié)果與第一位的"右"結(jié) 果組合起來,第二位的"左"與第二位的"右"結(jié)果組合起來,并且以該方式 繼續(xù)直到組合了所有結(jié)果為止。例如,如圖7所示,第一操作的第一位的輸出 630與第二操作的第一位的輸出625組合起來,即使輸出630是由與輸出625 的計算設(shè)備不相同的計算設(shè)備所生成的。同樣,第一操作的第二位的輸出620 與第二操作的第二位的輸出645組合起來。因為這種配對,在一個實施例中, 聯(lián)結(jié)命令可應(yīng)用于具有相同數(shù)量的結(jié)果的兩個在前操作。
可以提供來用于組合兩個在前命令的輸出的另一個核心命令是"叉積"核 心命令,該命令組合第一命令輸出的每個數(shù)據(jù)段與第二命令輸出的每個數(shù)據(jù) 段。更具體地,第一命令的第一位的輸出可與第二命令的第一位的輸出、第二
13命令的第二位的輸出以及實際上與第二命令的每一個輸出組合起來。同樣,第 一命令的第二位的輸出可以與第二命令的每個輸出組合起來,對于第一命令的 所有輸出都繼續(xù)這樣的組合。因而,由叉積核心命令產(chǎn)生的輸出段可以等于第 一命令的輸出的數(shù)量與第二命令的輸出的數(shù)量的乘積。因為由叉積核心命令執(zhí) 行的組合的性質(zhì),第一和第二命令的輸出的數(shù)量對于叉積命令不必相等就能正 確地操作。
轉(zhuǎn)到圖8,功能圖700示出叉積命令710的示例性操作。具體地,如在圖 7中所示,第一操作可生成輸出620、 630和640,而第二操作可生成輸出625、 635和645。然而,如在圖8所示,叉積命令710可使得第一操作的第一輸出 630不僅與第二操作的第一輸出625組合起來,還如圖所示,與第二操作的第 二輸出645以及第二操作的由框635概括表示的所有其它輸出組合起來。同樣, 如圖所示,第一操作的第二輸出620可與第二操作的第一輸出625、第二操作 的第二輸出645以及第二操作的所有其它輸出635組合起來。因此,叉積命令 710分別跨并行執(zhí)行叉積命令的各處理器(諸如服務(wù)器計算設(shè)備10、 20和30) 產(chǎn)生多個輸出720、多個輸出730和多個輸出740。
除了上述核心命令之外,還可提供對核心命令的抽象以允許更容易地訪問 核心命令的經(jīng)常使用的版本。 一個這樣的抽象是上述映射命令,它抽象了分發(fā) 和聚合核心命令的組合。另一個抽象是"分類"命令,它可以是專門用于并行 地應(yīng)用分類函數(shù)的處理核心命令210。這樣一個分類命令鏡像上述處理核心命 令210,除了分類命令專門將分類函數(shù)并行地應(yīng)用于數(shù)據(jù)段之外。核心命令的 另一個抽象是"合并"命令,它是專門用于聚合在前操作的分類結(jié)果的聚合核 心命令410。具體地,聚合核心命令410的另一個抽象是"輸出"命令,它可 以將在前操作的結(jié)果聚合到文件或者其它輸出目的地中。
上述核心命令可以使程序設(shè)計者能夠生成可被編譯成針對跨多個處理器 或進程并行執(zhí)行而優(yōu)化的形式的程序,諸如程序80。然而,在許多情形中,需 要對例如輸入數(shù)據(jù)40執(zhí)行的數(shù)據(jù)處理可以更高效地按照結(jié)構(gòu)化查詢來表示, 如使用諸如SQL這樣的語言生成的結(jié)構(gòu)化查詢。在這些情形中,不需要對程 序80進行編程,而是翻譯器70可以自動地從諸如SQL語句60等結(jié)構(gòu)化査詢 中生成程序80。因此,翻譯器70可以通過充分利用支持上述核心命令的較高級程序設(shè)計語言來提供對SQL語句60的并行處理以及其伴隨而來的所有好 處。
轉(zhuǎn)到圖9,所示的功能圖800包括SQL語句890、程序810、翻譯器70 和可由程序810的編譯版本執(zhí)行的操作的功能圖示。圖9所示的示例性SQL 語句890包括用于從在該示例中名為"sample.txt"的文件820獲得信息的SQL 命令。具體地,如熟悉SQL的技術(shù)人員所知道的,示例性SQL語句890請求 在輸入文件820中出現(xiàn)超過五次的所有"token (標(biāo)記)"的列表。同樣,如前 所示,如果輸入文件820是若干萬億字節(jié)的大小,這樣的請求在由單個處理器 執(zhí)行的情況下需要花費若干小時或更多。
可在諸如圖9的SQL語句890等SQL語句中使用的一個非標(biāo)準的SQL 命令是"SCHEMA (模式)"關(guān)鍵字。如將示出的,因為翻譯器70可利用上 述核心命令,包含諸如分類、聯(lián)結(jié)等各種比較操作,所以存在對有意義地解釋 由SQL語句890所引用的數(shù)據(jù)(諸如輸入數(shù)據(jù)820)的數(shù)據(jù)類型的需求。因此, 可提供SCHEMA關(guān)鍵字來定義在輸入數(shù)據(jù)820中出現(xiàn)的數(shù)據(jù)類型。例如,在 所示的示例SQL語句890中,SCHEMA關(guān)鍵字可伴隨有表示輸入數(shù)據(jù)802包 含數(shù)據(jù)的單個部分或"列"并且在該部分內(nèi)的數(shù)據(jù)可被稱為"token"的信息。 另外,作為SCHEMA關(guān)鍵字的一部分所呈現(xiàn)的信息還可表示"token"數(shù)據(jù)是 "string (字符串)"類型的。這樣的信息可允許更準確地處理數(shù)據(jù),因為如本 領(lǐng)域的技術(shù)人員所知道的,數(shù)據(jù)類型直接影響解釋,特別是數(shù)據(jù)的比較。例如, 條目"7"和"007"在它們作為"integer (整數(shù))"數(shù)據(jù)存儲的情況下可以被 認為是等同的,而在它們作為"string"數(shù)據(jù)存儲時則被認為是不同的。
翻譯器70可接收其中包括諸如SCHEMA關(guān)鍵字等定制關(guān)鍵字的SQL語 句890來作為輸入,并且可以生成在功能上等價的程序810,從而充分利用上 述核心命令中的一個或多個來使該SQL語句所請求的功能能夠被高效地并行 執(zhí)行。例如,在圖9所示的示例中,程序810可以由翻譯器70生成以在最初 引用一個稱為"DiscoMan"的管理器(manager)。該管理器可提供接受上述 核心命令和聚合的智能,以諸如程序810等程序指定的方式將它們鏈接在一起, 并且以已知但復(fù)雜的方式來跨多個進程分發(fā)它們。通過在程序810中包含對該 管理器的引用,翻譯器70可以通過利用該管理器所支持的上述核心命令中的一個或多個以從SQL語句890生成程序810來利用該管理器生成可并行執(zhí)行 的低級計算機可執(zhí)行指令。
在引用該管理器之后,由翻譯器70根據(jù)SQL語句890生成的程序810可 指定映射(Map)命令812,如前所示,該命令是分發(fā)和聚合核心命令的聚合。 因此,該管理器可以響應(yīng)于映射命令812生成適當(dāng)?shù)闹噶?,以使服?wù)器計算設(shè) 備10、 20和30首先將來自文件820的輸入數(shù)據(jù)分別分發(fā)到子部分841、 842 和843,并且隨后將這些子部分聚合到部分851、 852和853中。部分851、 852 和853可以包括根據(jù)諸如服務(wù)器計算設(shè)備10、 20和30的相對計算能力等一個 或多個準則被映射的來自文件820的數(shù)據(jù)。
一旦來自文件820的數(shù)據(jù)被映射,則翻譯器70可以生成分類(Sort)命 令813來作為程序810—部分。如前所述,分類命令813可以是應(yīng)用分類函數(shù) 的處理命令。因此,先前作為程序810—部分定義的管理器在編譯時可以生成 適當(dāng)?shù)闹噶?,使服?wù)器計算設(shè)備IO、 20和30分別將分類函數(shù)的實例(Sort) 861、 862和863分別應(yīng)用于數(shù)據(jù)851、 852和853。
在一個實施例中,各種核心命令的默認輸入可由管理器基于這些命令在程 序810中的次序來調(diào)整。例如,如前所示,映射命令812在分類命令813之前。 基于這樣的次序,管理器可確定分類命令813的默認輸入是映射命令812的輸 出,并且可以適當(dāng)?shù)厣傻讓佑嬎阒噶?。通常,任何核心命令的默認輸入可以 是在前命令的輸出,但如上所述,為保持靈活性,核心命令確實允許程序設(shè)計 者指定輸入。因此,翻譯器70不需要為作為程序810的一部分生成的每個命 令提供指定的輸入,并且可以改為利用由管理器在編譯程序810時提供的默認 輸入。
轉(zhuǎn)回到示例性程序810,翻譯器70可以在分類命令813之后提供關(guān)于應(yīng) 用"GroupBy (分組)"函數(shù)的處理(Process)命令814的規(guī)范。因此管理器 可以生成指令使服務(wù)器計算設(shè)備10、 20和30分別將該函數(shù)的實例(GroupBy) 871、 872和873分別應(yīng)用于分類函數(shù)的實例861、 862和863的輸出。在程序 810中使用處理命令814來將"GroupBy"函數(shù)應(yīng)用于分類命令813輸出的分 類數(shù)據(jù)是與SQL語句890相符合的。具體地,SQL語句890請求標(biāo)識輸入數(shù) 據(jù)820中具有多于5個實例的所有token。這一信息可以經(jīng)由命令812和813然而,SQL語句890還請求以特定方式分組所標(biāo)識的token。因此,可以經(jīng)由處理命令814將"GroupBy"函數(shù)應(yīng)用于分類命令813的輸出。以這樣一種方式,翻譯器70可以利用上述核心命令中的一個或多個來生成程序810以實現(xiàn)SQL語句890。
可由翻譯器70生成的程序810的最后一個命令是輸出(Output)命令815,該命令可用于將"GroupBy"函數(shù)的實例871、 872和873的輸出聚合到"tokens.txt"文件880中。因此,在編譯程序810時,SQL語句890所請求的信息可以由程序810存儲到輸出文件880中。另外,為提供在程序810被并行執(zhí)行之前需要在單個計算設(shè)備或進程上測試或者以其它方式執(zhí)行的可能性,該管理器的一個實施例可實現(xiàn)一種檢査要生成的代碼是否將被并行執(zhí)行的方法。這樣一種方法可由翻譯器70在生成程序810時使用。例如,圖9的程序810包括一種稱為"IsRunningOnCluster (是否在群集上運行)"的方法,它可確定代碼是否將被并行地執(zhí)行。如果該代碼將被并行地執(zhí)行,則可用剛剛描述的方法來生成它。然而,如果該代碼被編譯成在單個進程上執(zhí)行,則底層機制可將這一點考慮在內(nèi)并可生成用于與所述分布式進程相反的單個進程的代碼。
盡管圖9示出從獨立的SQL語句890生成針對并行處理來優(yōu)化的計算機可執(zhí)行指令,但如上所述,翻譯器70的操作不限于此。具體地,可以從類似于SQL語句890的SQL語句中生成類似于程序810的程序,即使這樣的SQL語句作為宿主程序設(shè)計上下文的一部分被包括在宿主程序設(shè)計上下文中。轉(zhuǎn)到圖10,程序910和腳本940被示為分別包括SQL語句920和950。 SQL語句920和950可以分別直接被包括在程序910和腳本940的程序設(shè)計上下文中。因而,例如,SQL語句920作為"string"被包括在程序910中,程序910在圖10所示的示例中被示為具有C弁程序設(shè)計上下文。然而,如前所示,對C#的使用僅是示例性的并且不是任何固有限制的產(chǎn)物。事實上,程序910的程序設(shè)計上下文可以是提供文本字符串的規(guī)范的任何較高級計算機程序設(shè)計語言,包括例如諸如Visual Basic⑧或0++等語言。腳本940的程序設(shè)計上下文同樣不旨在限于圖10所示的示例,該示例示出包含在腳本940中的SQL語句950具有一般腳本上下文。在一個實施例中,SQL語句950可以在沒有任何指示符的情況下被包含在腳本940中,因為腳本的解釋器960可以僅解釋它所理解的文
17本。
與圖9的獨立SQL語句890 —樣,分別位于程序910和腳本940中的SQL語句920和950首先可由翻譯器70翻譯成與程序910或腳本940的程序設(shè)計上下文兼容或者與之等價的形式。例如,如圖10所示,SQL語句920可由翻譯器70翻譯成與在圖10所示的示例中被示為C弁較高級程序設(shè)計語言的910的程序設(shè)計上下文等價的形式。因而,所得到的程序930將程序910中已經(jīng)存在的C弁代碼與通過翻譯SQL語句920所得到的0#代碼組合起來。同樣,如圖所示,翻譯器70不限于僅將SQL語句920翻譯成Ct而可改為被設(shè)計成將SQL語句翻譯成任何常用的較高級程序設(shè)計語言。在一個實施例中,翻譯器70將SQL語句90翻譯成如與程序910使用的相同的程序設(shè)計上下文。然而,在一替換實施例中,翻譯器70可僅將SQL語句920翻譯成一種兼容的程序設(shè)計上下文。在這樣一種情形中,所得到的程序930可由多個編譯器(諸如編譯器970)來編譯,以便生成針對并行處理來優(yōu)化的計算機可執(zhí)行指令。
如果翻譯器70將SQL語句920翻譯成與程序910使用的相同的程序設(shè)計上下文,則僅需要單個編譯器970來生成針對并行處理來優(yōu)化的計算機可執(zhí)行指令。在一個實施例中,編譯器970可引用在程序910和930中指定的管理器來生成這樣的指令。因而,通過將SQL語句920翻譯成其并行優(yōu)化編譯器(諸如編譯器970)已經(jīng)存在的形式,翻譯器70可充分利用該已經(jīng)存在的編譯器而不必具有直接從該結(jié)構(gòu)化査詢生成針對并行處理來優(yōu)化的相對應(yīng)的低級計算機可執(zhí)行指令的能力。
翻譯器70可以同樣將腳本940中的SQL語句950翻譯成中間形式,編譯器970可從該中間形式生成針對并行處理來優(yōu)化計算機可執(zhí)行指令。然而,腳本940并非由編譯器970來編譯,而是改為由解釋器960來解釋。在一個實施例中,解釋器960可利用與編譯器970相似的庫,使從解釋器960輸出的針對并行處理來優(yōu)化的低級計算機可執(zhí)行指令能夠與來自編譯器970的那些輸出組合起來。最終,編譯器970或者該編譯器和解釋器960的輸出可以是針對并行處理來優(yōu)化的且以與圖9所示和在前詳細描述的方式相似的方式來處理輸入數(shù)據(jù)的低級計算機可執(zhí)行指令的集合。
如可以從上述描述中看到的,提供了用于允許獨立地或者在另一程序設(shè)計上下文中使用結(jié)構(gòu)化査詢的機制。結(jié)構(gòu)化査詢可以被翻譯以便利用為特定的基本操作所提供的、允許生成針對并行處理來優(yōu)化的可執(zhí)行程序的核心命令和聚合。鑒于在此描述的主題的許多可能的變化方案,本發(fā)明要求保護落入所附權(quán)利要求書范圍內(nèi)的所有這樣的實施例及其等效方案。
19
權(quán)利要求
1.一個或多個包含用于從一個或多個結(jié)構(gòu)化查詢生成具有并行處理能力的命令的計算機可執(zhí)行指令的計算機可讀介質(zhì),所述計算機可執(zhí)行指令用于下列步驟解析所述一個或多個結(jié)構(gòu)化查詢以標(biāo)識輸入數(shù)據(jù)源(40);解析所述一個或多個結(jié)構(gòu)化查詢以標(biāo)識所述輸入數(shù)據(jù)源的模式,所述模式指定來自所述輸入數(shù)據(jù)源的一個或多個數(shù)據(jù)部分的名稱和數(shù)據(jù)類型;以及將所述一個或多個結(jié)構(gòu)化查詢翻譯成包括下列至少之一的中間形式處理命令(210),用于跨一個或多個進程并行地應(yīng)用所述處理命令指定的函數(shù)(220);分發(fā)命令(310),用于跨一個或多個進程并行地將數(shù)據(jù)劃分成兩個或多個子部分;聚合命令(410),用于跨一個或多個進程并行地組合兩個或多個離散的數(shù)據(jù)集合;聯(lián)結(jié)命令(610),用于跨一個或多個進程并行地將第一聯(lián)結(jié)輸入數(shù)據(jù)的每一段與第二聯(lián)結(jié)輸入數(shù)據(jù)的對應(yīng)段組合起來;以及叉積命令(710),用于跨一個或多個進程并行地將第一叉積輸入數(shù)據(jù)的每一段與第二叉積輸入數(shù)據(jù)的每一段組合起來。
2. 如權(quán)利要求1所述的計算機可讀介質(zhì),其特征在于,所述一個或多個結(jié) 構(gòu)化査詢表示用于生成所述具有并行處理能力的命令的程序設(shè)計上下文。
3. 如權(quán)利要求1所述的計算機可讀介質(zhì),其特征在于,所述一個或多個結(jié)構(gòu) 化査詢被包括在用于生成所述具有并行處理能力的命令的較大的程序設(shè)計上 下文中,所述較大的程序設(shè)計上下文包含所述處理命令、所述分發(fā)命令、所述聚 合命令、所述聯(lián)結(jié)命令和所述叉積命令中的至少一個。
4. 如權(quán)利要求3所述的計算機可讀介質(zhì),其特征在于,所述中間形式和所 述較大的程序設(shè)計上下文屬于同一較高級計算機程序設(shè)計語言。
5. 如權(quán)利要求3所述的計算機可讀介質(zhì),其特征在于,所述較大的程序設(shè) 計上下文是腳本。
6. 如權(quán)利要求5所述的計算機可讀介質(zhì),其特征在于,還包括用于根據(jù)相 同的庫編譯所述中間形式和解釋所述腳本的計算機可執(zhí)行指令。
7. 如權(quán)利要求3所述的計算機可讀介質(zhì),其特征在于,所述較大的程序設(shè) 計上下文的第一部分的輸出被指定為所述一個或多個結(jié)構(gòu)化査詢的輸入,且其中所述一個或多個結(jié)構(gòu)化查詢的輸出被指定為所述較大的程序設(shè)計上下文的 第二部分的輸入。
8. —種用于從一個或多個結(jié)構(gòu)化査詢生成具有并行處理能力的命令的方 法,包括下列步驟解析所述一個或多個結(jié)構(gòu)化查詢以標(biāo)識輸入數(shù)據(jù)源(40);解析所述一個或多個結(jié)構(gòu)化査詢以標(biāo)識所述輸入數(shù)據(jù)源的模式,所述模式 指定來自所述輸入數(shù)據(jù)源的一個或多個數(shù)據(jù)部分的名稱和數(shù)據(jù)類型;以及將所述一個或多個結(jié)構(gòu)化查詢翻譯成包括下列至少之一的中間形式處理 命令(210),用于跨一個或多個進程并行地應(yīng)用所述處理命令指定的函數(shù) (220);分發(fā)命令(310),用于跨一個或多個進程并行地將數(shù)據(jù)劃分成兩個 或多個子部分;聚合命令(410),用于跨一個或多個進程并行地組合兩個或 多個離散的數(shù)據(jù)集合;聯(lián)結(jié)命令(610),用于跨一個或多個進程并行地將第 一聯(lián)結(jié)輸入數(shù)據(jù)的每一段與第二聯(lián)結(jié)輸入數(shù)據(jù)的對應(yīng)段組合起來;以及叉積命 令(710),用于跨一個或多個進程并行地將第一叉積輸入數(shù)據(jù)的每一段與第 二叉積輸入數(shù)據(jù)的每一段組合起來。
9. 如權(quán)利要求8所述的方法,其特征在于,所述一個或多個結(jié)構(gòu)化査詢表 示用于生成所述具有并行處理能力的命令的程序設(shè)計上下文。
10. 如權(quán)利要求8所述的方法,其特征在于,所述一個或多個結(jié)構(gòu)化查詢 被包括在用于生成所述具有并行處理能力的命令的較大的程序設(shè)計上下文中, 所述較大的程序設(shè)計上下文包括所述處理命令、所述分發(fā)命令、所述聚合命令、 所述聯(lián)結(jié)命令和所述叉積命令中的至少一個。
11. 如權(quán)利要求10所述的方法,其特征在于,所述中間形式和所述較大的 程序設(shè)計上下文屬于同一較高級計算機程序設(shè)計語言。
12. 如權(quán)利要求10所述的方法,其特征在于,所述較大的程序設(shè)計上下文 是腳本。
13. 如權(quán)利要求12所述的方法,其特征在于,還包括根據(jù)相同的庫來編譯 所述中間形式和解釋所述腳本的步驟。
14. 如權(quán)利要求10所述的方法,其特征在于,所述較大的程序設(shè)計上下文 的第一部分的輸出被指定為所述一個或多個結(jié)構(gòu)化査詢的輸入,并且其中所述一個或多個結(jié)構(gòu)化査詢的輸出被指定為所述較大的程序設(shè)計上下文的第二部 分的輸入。
全文摘要
結(jié)構(gòu)化查詢,諸如使用結(jié)構(gòu)化查詢語言(SQL)編寫的結(jié)構(gòu)化查詢是用于表示設(shè)法從數(shù)據(jù)集合獲得的信息的高效機制。本發(fā)明的機制允許使用結(jié)構(gòu)化查詢來表示可被并行執(zhí)行的數(shù)據(jù)處理以便獲得這些處理伴隨而來的效率。結(jié)構(gòu)化查詢,無論是獨立的還是集成到另一程序設(shè)計上下文中,都可被翻譯成與它們被集成到的程序設(shè)計上下文或某種其它高級程序設(shè)計語言兼容的或者與這些語言等價的中間形式。該中間翻譯形式可使用抽象出可被并行執(zhí)行的機制的核心命令。這些核心命令包括用于并行地應(yīng)用函數(shù)和并行地分發(fā)與聯(lián)結(jié)數(shù)據(jù)的命令,并且還包括對用于普遍執(zhí)行的函數(shù)的核心命令的聚合。
文檔編號G06F17/30GK101689196SQ200880020179
公開日2010年3月31日 申請日期2008年6月3日 優(yōu)先權(quán)日2007年6月12日
發(fā)明者R·I·查科恩, W·D·拉姆塞 申請人:微軟公司