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