本申請要求于2014年9月2日提交的序列號為62/044,645的美國申請和2015年5月20日提交的序列號為62/164,175的美國申請的優(yōu)先權(quán)。
技術(shù)領(lǐng)域
本說明書涉及一種編譯基于圖的程序規(guī)范的方法。
背景技術(shù):
一種用于數(shù)據(jù)流計算的方法利用基于圖的表示,其中對應于圖的節(jié)點(頂點)的計算組件通過與圖的鏈路(有向邊)對應的數(shù)據(jù)流(稱為“數(shù)據(jù)流圖”)耦合。通過數(shù)據(jù)流鏈路連接到上游組件的下游組件接收輸入數(shù)據(jù)元素的有序流,并且以所接收的順序處理輸入數(shù)據(jù)元素,可選地生成一個或多個對應的輸出數(shù)據(jù)元素流。用于執(zhí)行這種基于圖的計算的系統(tǒng)描述于發(fā)明名稱為“EXECUTING COMPUTATIONS EXPRESSED AS GRAPHS(執(zhí)行表達為圖的計算)”的在先美國專利5,966,072中,其通過引用并入本文。在與該在先專利中描述的方法相關(guān)的實現(xiàn)方式中,每個組件被實現(xiàn)為駐留在通常多個計算機服務器之一上的進程。每個計算機服務器可以具有在任何一個時間活動的多個這樣的組件進程,并且操作系統(tǒng)(例如,Unix)調(diào)度器在該服務器上托管的組件之間共享資源(例如,處理器時間和/或處理器內(nèi)核)。在這種實現(xiàn)方式中,組件之間的數(shù)據(jù)流可以使用操作系統(tǒng)的數(shù)據(jù)通信服務和連接服務器的數(shù)據(jù)網(wǎng)絡(例如,命名管道,TCP/IP會話等)來實現(xiàn)。組件的子集通常用作來自整體計算的數(shù)據(jù)的源和/或數(shù)據(jù)宿(或數(shù)據(jù)接收器,sink),例如,去往和/或來自數(shù)據(jù)文件、數(shù)據(jù)庫表和外部數(shù)據(jù)流。然后,在例如通過協(xié)調(diào)進程建立組件進程和數(shù)據(jù)流之后,數(shù)據(jù)流過整個計算系統(tǒng),該計算系統(tǒng)實現(xiàn)表達為通常由每個組件處的輸入數(shù)據(jù)的可用性控制的圖的計算并且為每個組件調(diào)度計算資源。因此,至少通過使不同的組件能夠由不同的進程(托管在相同或不同的服務器計算機或處理器內(nèi)核上)并行地執(zhí)行,可以實現(xiàn)并行性,其中不同組件在通過數(shù)據(jù)流圖的不同路徑上并行地執(zhí)行在本文中被稱為組件并行性,并且不同組件通過數(shù)據(jù)流圖在相同路徑的不同部分上并行執(zhí)行在本文中被稱為流水線并行性。
其他形式的并行性也得到這種方法的支持。例如,輸入數(shù)據(jù)集可以例如根據(jù)數(shù)據(jù)集的記錄中字段的值的分區(qū)來分割,其中每個部分被發(fā)送到處理數(shù)據(jù)集的記錄的組件的單獨副本。組件的這種單獨的副本(或“實例”)可以在單獨的服務器計算機或服務器計算機的單獨的處理器內(nèi)核上執(zhí)行,從而實現(xiàn)本文所稱的數(shù)據(jù)并行性??梢院喜为毥M件的結(jié)果以再次形成單個數(shù)據(jù)流或數(shù)據(jù)集。用于執(zhí)行組件實例的計算機或處理器內(nèi)核的數(shù)量將由開發(fā)人員在開發(fā)數(shù)據(jù)流圖時指定。
可以使用各種方法來提高這種方法的效率。例如,組件的每個實例不一定必須在其自己的操作系統(tǒng)進程中托管,例如使用一個操作系統(tǒng)進程來實現(xiàn)多個組件(例如,形成更大圖的連接子圖的組件)。
上述方法的至少一些實現(xiàn)方式受到與在底層計算機服務器上所得到的進程的執(zhí)行效率有關(guān)的限制。例如,這些限制可能涉及重新配置圖的運行實例以改變數(shù)據(jù)并行度、改變到托管各種組件的服務器和/或平衡不同計算資源上的負載的困難?,F(xiàn)有的基于圖的計算系統(tǒng)也具有的缺陷是啟動時間慢,這通常是因為太多的進程被不必要地啟動,浪費了大的存儲量。通常,進程在啟動圖的執(zhí)行時開始,并在圖的執(zhí)行完成時結(jié)束。
已經(jīng)使用了用于分布計算的其他系統(tǒng),其中將整體計算劃分為更小的部分,并且將這些部分從一個主計算機服務器分發(fā)到各個其他(例如,“從屬”)計算機服務器,從屬計算機服務器各自獨立地執(zhí)行計算并將其結(jié)果返回到主服務器。一些這樣的方法被稱為“網(wǎng)格計算”。然而,除了經(jīng)由調(diào)用那些部分的主計算機服務器之外,這樣的方法通常依賴于每個計算的獨立性,而不提供用于在計算部分之間傳遞數(shù)據(jù)或調(diào)度和/或?qū)@些部分的執(zhí)行進行排序的機制。因此,對于托管涉及多個組件之間的交互的計算,這樣的方法沒有提供直接有效的解決方案。
用于大型數(shù)據(jù)集的分布式計算的另一種方法使用MapReduce框架,例如,如在Apache系統(tǒng)中體現(xiàn)的。通常,Hadoop具有分布式文件系統(tǒng),其中分發(fā)針對每個命名文件的部分。用戶根據(jù)兩個函數(shù)指定計算:以分布式方式在命名輸入的所有部分上執(zhí)行的映射函數(shù),以及在映射函數(shù)執(zhí)行的輸出的部分上執(zhí)行的歸約(reduce)函數(shù)。映射函數(shù)執(zhí)行的輸出被分割并再次存儲在分布式文件系統(tǒng)中的中間部分中。然后以分布式方式執(zhí)行歸約函數(shù)以處理這些中間部分,從而產(chǎn)生整體計算的結(jié)果。盡管可以有效地執(zhí)行可以在MapReduce框架中表示并且其輸入和輸出可修改以用于在MapReduce框架的文件系統(tǒng)中存儲的計算,但是許多計算不匹配該框架和/或不容易適應于使得它們的所有輸入和輸出都在分布式文件系統(tǒng)中。
總體而言,與組件(或組件的并行執(zhí)行副本)托管在不同服務器上的上述方法相比,需要提高計算的底層規(guī)范是圖的計算的計算效率(例如,增加給定計算資源的每單位處理的記錄的數(shù)量)。此外,期望能夠適應變化的計算資源和需求。還需要提供一種計算方法,其允許適應在一個或多個基于圖的計算的執(zhí)行期間可用的計算資源的變化,和/或允許適應例如由于正在處理的數(shù)據(jù)的特性導致的這樣的計算的不同組件的計算負載的變化或者負載的時間變化。還需要提供能夠有效地利用具有不同特性的計算資源的計算方法,例如使用具有每個服務器不同數(shù)量的處理器、每個處理器不同數(shù)量的處理器內(nèi)核等的服務器,以有效地支持同質(zhì)和異質(zhì)環(huán)境。還期望使基于圖的計算快速啟動。提供這種效率和適應性的一個方面是在創(chuàng)建圖時(在設計時)開發(fā)人員做出的選擇、(在編譯時)編譯器所采取的動作和(在運行時)運行時系統(tǒng)所采取的動作之間提供適當?shù)姆蛛x和抽象屏障。
技術(shù)實現(xiàn)要素:
在一個方面中,一般來說,一種用于處理基于圖的程序規(guī)范的方法包括:接收所述基于圖的程序規(guī)范,所述基于圖的程序規(guī)范包括:多個組件,每個組件對應于處理任務并且包括用于發(fā)送或接收一個或多個數(shù)據(jù)元素的一個或多個端口;以及一個或多個鏈路,所述一個或多個鏈路中的每個鏈路將所述多個組件中的上游組件的輸出端口連接到所述多個組件中的下游組件的輸入端口;以及處理所述基于圖的程序規(guī)范以生成表示所述基于圖的程序規(guī)范的所述多個組件的子集(對應于“執(zhí)行集”)的準備好的代碼。如本文所使用的,“準備好的代碼”包括當對基于圖的程序規(guī)范的解析后的元素進行轉(zhuǎn)換時由編譯器或解釋器使用的以任何目標語言編寫的代碼,其可以包括可執(zhí)行代碼或者可以被進一步編譯或解釋成可執(zhí)行代碼的代碼。所述處理包括:至少部分地基于鏈接的組件的特性在不同子集中識別組件之間的多個子集邊界;基于所識別的子集邊界形成子集;以及為每個形成的子集生成準備好的代碼,當用于運行時系統(tǒng)執(zhí)行時,所述準備好的代碼使得根據(jù)為該形成的子集的準備好的代碼中嵌入的信息來執(zhí)行與該形成的子集中的組件對應的處理任務。
各個方面可以包括以下特征中的一個或多個。
形成子集包括:遍歷所述基于圖的程序規(guī)范的組件,同時保持所遍歷的子集邊界的記錄,以及將所述基于圖的程序規(guī)范的每個組件與從所遍歷的子集邊界的記錄中確定的單個子集標識符相關(guān)聯(lián)。
與所述多個組件的所識別的子集相關(guān)聯(lián)的每個子集標識符是唯一的。
所遍歷的子集邊界的記錄被維護為標識符值的路徑。
所述標識符值的路徑包括通過分隔符彼此分隔的標識符值的字符串。
形成子集包括:將所述基于圖的程序規(guī)范的第一組件與一子集標識符相關(guān)聯(lián);將該子集標識符傳播到所述第一組件的下游的組件;以及基于所識別的子集邊界,在該子集標識符的傳播過程中修改該子集標識符。
在該子集標識符的傳播過程中修改該子集標識符包括:在遍歷所述第一子集邊界時將該子集標識符的值從第一子集標識符值改變?yōu)榕c第一子集邊界相關(guān)聯(lián)的第二子集標識符值;以及在遍歷與所述第一子集邊界相關(guān)聯(lián)的第二子集邊界時將該子集標識符的值改變?yōu)樗龅谝蛔蛹瘶俗R符值。
至少部分地基于鏈接的組件的特性識別一個或多個子集邊界包括:基于上游組件上的第一類型的端口與下游組件上的第二類型的端口之間的鏈路來識別子集邊界。
至少部分地基于鏈接的組件的特性識別一個或多個子集邊界包括:基于上游組件和下游組件之間的確定類型的鏈路來識別子集邊界,其中所述確定類型的鏈路是組件之間多種不同類型的鏈路之一。
為每個形成的子集生成準備好的代碼包括:對于至少一個形成的子集,將指示與該形成的子集中的組件對應的處理任務之間的允許的并發(fā)性的信息嵌入到所述準備好的代碼中。
為每個形成的子集生成準備好的代碼包括:對于至少一個形成的子集,將指示相對于其他形成的子集的優(yōu)先級的信息嵌入到所述準備好的代碼中。
為每個形成的子集生成準備好的代碼包括:對于至少一個形成的子集,將指示與該形成的子集中的組件對應的一個或多個處理任務的事務性的信息嵌入到所述準備好的代碼中。
為每個形成的子集生成準備好的代碼包括:對于至少一個形成的子集,將指示在所述準備好的代碼的執(zhí)行過程中要鎖定的至少一個資源的信息嵌入到所述準備好的代碼中。
為每個形成的子集生成準備好的代碼包括:對于至少一個形成的子集,將指示與該形成的子集的組件對應的一個或多個處理任務所處理的數(shù)據(jù)元素之間的排序特性的信息嵌入到所述準備好的代碼中。
為每個形成的子集生成準備好的代碼包括:對于至少一個形成的子集,將指示使用所述準備好的代碼執(zhí)行形成的子集的每個實例所操作的數(shù)據(jù)元素的數(shù)量的信息嵌入到所述準備好的代碼中。
在另一方面中,一般來說,一種以非暫時形式存儲在計算機可讀介質(zhì)上的軟件,用于處理基于圖的程序規(guī)范,所述軟件包括用于使得計算系統(tǒng)執(zhí)行以下操作的指令:接收所述基于圖的程序規(guī)范,所述基于圖的程序規(guī)范包括:多個組件,每個組件對應于處理任務并且包括用于發(fā)送或接收一個或多個數(shù)據(jù)元素的一個或多個端口;以及一個或多個鏈路,所述一個或多個鏈路中的每個鏈路將所述多個組件中的上游組件的輸出端口連接到所述多個組件中的下游組件的輸入端口;以及處理所述基于圖的程序規(guī)范以生成表示所述基于圖的程序規(guī)范的所述多個組件的子集的準備好的代碼,所述處理包括:至少部分地基于鏈接的組件的特性在不同子集中識別組件之間的多個子集邊界;基于所識別的子集邊界形成子集;以及為每個形成的子集生成準備好的代碼,當用于運行時系統(tǒng)執(zhí)行時,所述準備好的代碼使得根據(jù)為該形成的子集的準備好的代碼中嵌入的信息來執(zhí)行與該形成的子集中的組件對應的處理任務。
在另一方面中,一般來說,一種用于處理基于圖的程序規(guī)范的計算系統(tǒng)包括:至少一個輸入設備或端口,被配置為接收所述基于圖的程序規(guī)范,所述基于圖的程序規(guī)范包括:多個組件,每個組件對應于處理任務并且包括用于發(fā)送或接收一個或多個數(shù)據(jù)元素的一個或多個端口;以及一個或多個鏈路,所述一個或多個鏈路中的每個鏈路將所述多個組件中的上游組件的輸出端口連接到所述多個組件中的下游組件的輸入端口;以及至少一個處理器,配置為處理所述基于圖的程序規(guī)范以生成表示所述基于圖的程序規(guī)范的所述多個組件的子集的準備好的代碼,所述處理包括:至少部分地基于鏈接的組件的特性在不同子集中識別組件之間的多個子集邊界;基于所識別的子集邊界形成子集;以及為每個形成的子集生成準備好的代碼,當用于運行時系統(tǒng)執(zhí)行時,所述準備好的代碼使得根據(jù)為該形成的子集的準備好的代碼中嵌入的信息來執(zhí)行與該形成的子集中的組件對應的處理任務。
各個方面可以具有一個或多個以下優(yōu)點。
本文所描述的技術(shù)還便于在其層級結(jié)構(gòu)的各個層級處使用非常規(guī)技術(shù)特征來高效處理計算系統(tǒng)中的大量數(shù)據(jù)。這些技術(shù)特征在計算系統(tǒng)的各種操作階段(包括設計時,編譯時和運行時)一起工作。編程平臺使得基于圖的程序規(guī)范能夠在設計時指定期望的計算。編譯時編譯器準備目標程序規(guī)范,以便在運行時在計算系統(tǒng)的多個服務器之間有效地分配細粒度任務。例如,根據(jù)基于圖的程序規(guī)范中的任何控制流和數(shù)據(jù)流約束來配置多個任務。運行時系統(tǒng)支持以提高計算效率(例如,以給定計算資源的每單位被處理記錄的數(shù)量為單位)的方式對并發(fā)執(zhí)行的這些任務進行動態(tài)分配。各種技術(shù)特征一起工作以實現(xiàn)相對于常規(guī)系統(tǒng)的效率增益。
例如,計算系統(tǒng)能夠使用與數(shù)據(jù)處理圖(或其他基于圖的程序規(guī)范)的組件對應的任務,以便于以這些任務的靈活的運行時執(zhí)行的方式來處理數(shù)據(jù)元素,而不需要對編程器添加不適當?shù)呢摀D形用戶界面允許在執(zhí)行期望的數(shù)據(jù)處理計算的組件上不同類型的端口之間的連接,并且計算系統(tǒng)能夠自動地識別包括一個或多個組件的子集和/或嵌套的組件子集,用于稍后在處理程序規(guī)范時使用。例如,該執(zhí)行集發(fā)現(xiàn)預處理過程可以識別潛在的嵌套的組件執(zhí)行集的層級結(jié)構(gòu),這對于人們來說是非常難以識別的,然后系統(tǒng)可以確定底層系統(tǒng)架構(gòu)中的資源分配,以執(zhí)行那些子集,用于有效的并行數(shù)據(jù)處理。通過自動地識別組件的這些子集(“執(zhí)行集”),計算系統(tǒng)能夠確保數(shù)據(jù)處理圖滿足某些一致性要求,如下面更詳細描述的,并且允許底層計算系統(tǒng)以高度可擴展的并行度來操作執(zhí)行集,因為執(zhí)行集的并行度可以在運行時確定,并且僅受運行時可用的計算資源的限制,因此有助于數(shù)據(jù)處理圖的有效執(zhí)行。此外,通過將某些信息嵌入到識別執(zhí)行集的準備好的代碼中,這些執(zhí)行集最終可以由底層計算系統(tǒng)作為特定任務來處理,并且計算系統(tǒng)可以通過例如并行化任務來確保以提高計算系統(tǒng)的內(nèi)部功能的效率的方式執(zhí)行處理任務。
當執(zhí)行本文所描述的方法時,這些技術(shù)還表現(xiàn)出對計算系統(tǒng)的內(nèi)部功能的進一步的技術(shù)效果,諸如減少對存儲器和其他計算資源的需求,以及減少系統(tǒng)在處理各個數(shù)據(jù)元素時的延遲。特別地,這些優(yōu)點有助于數(shù)據(jù)處理圖的高效執(zhí)行。例如,由于在執(zhí)行圖時由其他進程(例如,Unix進程)啟動多個進程,因而傳統(tǒng)的基于圖的計算系統(tǒng)可能具有相對較高的延遲(例如,幾十毫秒的量級),導致這些進程的累積啟動時間。然而,本文描述的技術(shù)通過允許單個進程內(nèi)的程序代碼直接啟動其他程序代碼而不需要進程啟動開銷,從而有利于實現(xiàn)相對較低的延遲(例如,幾十微秒的數(shù)量級)以及每秒處理的數(shù)據(jù)的更高的吞吐量。有助于數(shù)據(jù)處理圖的高效執(zhí)行的其他方面在以下描述中將顯而易見。
從下面的描述和權(quán)利要求書中,本發(fā)明的其它特征和優(yōu)點將變得顯而易見。
附圖說明
圖1是基于任務的計算系統(tǒng)的框圖。
圖2A是具有控制和數(shù)據(jù)端口的數(shù)據(jù)處理圖的一部分的示例。
圖2B-圖2C是具有控制端口和數(shù)據(jù)端口的數(shù)據(jù)處理圖的示例。
圖3A是包括多個標量輸出端口到標量輸入端口連接的數(shù)據(jù)處理圖。
圖3B是包括多個集合輸出端口到集合輸入端口連接的數(shù)據(jù)處理圖。
圖3C是包括集合輸出端口到標量輸入端口連接和標量輸出端口到集合輸入端口連接的數(shù)據(jù)處理圖。
圖4A是兩個組件之間的標量端口到標量端口連接。
圖4B是兩個組件之間的集合端口到集合端口連接。
圖4C是兩個組件之間的集合端口到標量端口連接,包括執(zhí)行集入口點。
圖4D是兩個組件之間的標量端口到集合端口連接,包括執(zhí)行集出口點。
圖5是應用基于堆棧的分配算法的數(shù)據(jù)處理圖。
圖6是應用基于全局映射的分配算法的數(shù)據(jù)處理圖。
圖7是具有用戶定義的執(zhí)行集的數(shù)據(jù)處理圖。
圖8A和圖8B示出了數(shù)據(jù)處理圖中的“相同集”關(guān)系。
圖9是具有復制數(shù)據(jù)元素的入口點的數(shù)據(jù)處理圖。
圖10A-圖10C示出了用戶界面工作流。
圖11A是具有非法執(zhí)行集的數(shù)據(jù)處理圖。
圖11B是具有非法執(zhí)行集循環(huán)的數(shù)據(jù)處理圖。
圖12A-圖12B是數(shù)據(jù)處理圖和對應的控制圖的示例的圖。
圖13A-圖13B是示例性執(zhí)行狀態(tài)機的狀態(tài)轉(zhuǎn)換圖。
圖14是一組處理引擎的圖。
具體實施方式
參考圖1,基于任務的計算系統(tǒng)100使用高級程序規(guī)范110來控制計算平臺150的計算資源和存儲資源,以執(zhí)行由程序規(guī)范110指定的計算。編譯器/解釋器120接收高級程序規(guī)范110并生成可由基于任務的運行時接口/控制器140執(zhí)行的形式的基于任務的規(guī)范130。編譯器/解釋器120識別一個或多個“組件”的一個或多個“執(zhí)行集”,其可以單獨地或作為單元被實例化為要應用于多個數(shù)據(jù)元素中每一個元素的細粒度任務。如下面更詳細描述的,編譯或解釋進程的一部分涉及識別這些執(zhí)行集并且準備所述執(zhí)行集用于執(zhí)行。應當理解,編譯器/解釋器120可以使用包括諸如解析高級程序規(guī)范110、驗證語法、類型檢查數(shù)據(jù)格式、生成任何錯誤或警告以及準備基于任務的規(guī)范130之類的步驟的各種算法中的任何算法,并且例如編譯器/解釋器120可以利用各種技術(shù)來優(yōu)化在計算平臺150上執(zhí)行的計算的效率。由編譯器/解釋器120生成的目標程序規(guī)范本身可以是將由系統(tǒng)100的另一部分進一步處理(例如,進一步編譯、解釋等)以產(chǎn)生基于任務的規(guī)范130的中間形式。下面的討論概述了這種變換的一個或多個示例,但是當然,例如由編譯器設計的技術(shù)人員將理解的,用于變換的其他方法也是可能的。
通常,計算平臺150由多個計算節(jié)點152(例如,提供分布式計算資源和分布式存儲資源這二者的個體服務器計算機)組成,從而實現(xiàn)高度并行性。如下面進一步詳細討論的,在高級程序規(guī)范110中表示的計算在計算平臺150上被執(zhí)行為相對細粒度的任務,進一步實現(xiàn)指定計算的高效并行執(zhí)行。
1數(shù)據(jù)處理圖
在一些實施例中,高級程序規(guī)范110是稱為“數(shù)據(jù)處理圖”的一種基于圖的程序規(guī)范,其包括一組“組件”,每個組件指定要對數(shù)據(jù)執(zhí)行的總體數(shù)據(jù)處理計算的一部分。組件例如在編程用戶界面和/或計算的數(shù)據(jù)表示中表示為圖中的節(jié)點。與一些基于圖的程序規(guī)范(例如在上述背景技術(shù)中描述的數(shù)據(jù)流圖)不同,數(shù)據(jù)處理圖可以包括代表數(shù)據(jù)傳送或控制傳送中的任何一個或兩者的節(jié)點之間的鏈路。指示鏈路特性的一種方式是在組件上提供不同類型的端口。鏈路是從上游組件的輸出端口耦合到下游組件的輸入端口的有向鏈路。端口具有表示如何從鏈路寫入和讀取數(shù)據(jù)元素和/或如何控制組件以處理數(shù)據(jù)的特性的指示符。
這些端口可以具有多個不同的特性。端口的一個特性是其作為輸入端口或輸出端口的方向性。有向鏈路表示從上游組件的輸出端口傳送到下游組件的輸入端口的數(shù)據(jù)和/或控制。允許開發(fā)人員將不同類型的端口鏈接在一起。數(shù)據(jù)處理圖的一些數(shù)據(jù)處理特性取決于不同類型的端口如何鏈接在一起。例如,如下面更詳細描述的,不同類型的端口之間的鏈路可以導致提供層級形式的并行性的不同“執(zhí)行集”中的組件的嵌套子集。某些數(shù)據(jù)處理特性由端口的類型所暗示。組件可能具有的不同類型的端口包括:
·集合輸入或輸出端口,意味著組件的實例將分別讀取或?qū)懭雽⑼ㄟ^耦合到該端口的鏈路的集合(collection)的所有數(shù)據(jù)元素。對于在它們的集合端口之間具有單個鏈路的一對組件,通常允許下游組件在上游組件正在寫入數(shù)據(jù)元素時讀取這些數(shù)據(jù)元素,從而實現(xiàn)上游組件和下游組件之間的流水線并行性。如下面更詳細描述的,數(shù)據(jù)元素也可以被重新排序,這使得并行化具有效率。在一些圖形表示中,例如在編程圖形界面中,這樣的集合端口通常由組件處的正方形連接符指示。
·標量輸入或輸出端口,意味著組件的一個實例將分別從耦合到端口的鏈路讀取或?qū)懭胫炼嘁粋€數(shù)據(jù)元素。對于在其標量端口之間具有單個鏈路的一對組件,在上游組件已經(jīng)完成執(zhí)行之后通過使用作為控制傳送的單個數(shù)據(jù)元素的傳送來強制下游組件的串行執(zhí)行。在一些圖形表示中,例如在編程圖形界面中,這樣的標量端口通常由該組件處的三角形連接符指示。
·控制輸入或輸出端口,類似于標量輸入或輸出,但是不需要發(fā)送數(shù)據(jù)元素,并且用于在組件之間通信控制的傳送。對于具有在它們的控制端口之間的鏈路的一對組件,在上游組件已經(jīng)完成執(zhí)行之后強制下游組件的串行執(zhí)行(即使那些組件也具有集合端口之間的鏈路)。在一些圖形表示中,例如在編程圖形界面中,這樣的控制端口通常由組件處的圓形連接符指示。
這些不同類型的端口實現(xiàn)了數(shù)據(jù)處理圖的靈活設計,允許數(shù)據(jù)流和控制流與端口類型的重疊屬性的強大組合。特別地,存在兩種類型的端口(稱為“數(shù)據(jù)端口”):集合端口和標量端口,用于傳送一些形式的數(shù)據(jù);還存在兩種類型的端口(稱為“串行端口”):標量端口和控制端口,用于強制串行執(zhí)行。數(shù)據(jù)處理圖通常將具有作為“源組件”而沒有任何連接的輸入數(shù)據(jù)端口的一個或多個組件,以及作為“宿(sink)組件”而沒有任何連接的輸出數(shù)據(jù)端口的一個或多個組件。一些組件將具有連接的輸入和輸出數(shù)據(jù)端口。在一些實施例中,不允許圖具有循環(huán),因此必須是有向無環(huán)圖(DAG)。該特征可以用于利用DAG的某些特性,如下面更詳細描述的。
在數(shù)據(jù)處理圖的組件上使用專用控制端口還使得能夠靈活控制計算的不同部分,這種靈活控制使用某些其他控制流技術(shù)是不可能實現(xiàn)的。例如,能夠在數(shù)據(jù)流圖之間應用依賴性約束的作業(yè)控制解決方案無法提供由定義單個數(shù)據(jù)流圖內(nèi)的組件之間的依賴性約束的控制端口實現(xiàn)的精細粒度控制。此外,將組件分配到順序運行的不同階段的數(shù)據(jù)流圖不允許對單個組件排序方面的靈活性。例如,使用簡單階段不可能的嵌套控制拓撲可以使用本文描述的控制端口和執(zhí)行集來定義。這種更大的靈活性也可以潛在地通過允許更多的組件盡可能地并發(fā)運行來提高性能。
通過以不同的方式連接不同類型的端口,開發(fā)人員能夠在數(shù)據(jù)處理圖的組件的端口之間指定不同類型的鏈路配置。例如,一種類型的鏈路配置可以對應于連接到相同類型的端口的特定類型的端口(例如,標量到標量鏈路),另一種類型的鏈路配置可以對應于連接到不同類型的端口的特定類型的端口(例如,集合到標量鏈路)。這些不同類型的鏈接配置既用作開發(fā)人員在視覺上識別與數(shù)據(jù)處理圖的一部分相關(guān)聯(lián)的預期行為的方式,又用作向編譯器/解釋器120指示啟用該行為所需的對應類型的編譯進程的方式。雖然本文描述的示例使用用于不同類型的端口的獨特形狀以可視地表示不同類型的鏈路配置,但是系統(tǒng)的其他實現(xiàn)方式可以通過提供不同類型的鏈路并且為每種類型的鏈路分配獨特的視覺指示符(例如,厚度,線型,顏色等)來區(qū)分不同類型的鏈路配置的行為。然而,為了用上面列出的三種類型的端口使用鏈路類型而不是端口類型來表示相同種類的鏈路配置,將存在多于三種類型的鏈路(例如,標量到標量、集合到集合、控制到控制、集合到標量、標量到集合、標量到控制等)。其他示例可以包括不同類型的端口,但是沒有在數(shù)據(jù)處理圖內(nèi)可視地明確指示端口類型。
編譯器/解釋器120執(zhí)行準備數(shù)據(jù)處理圖用于執(zhí)行的過程。第一過程是執(zhí)行集發(fā)現(xiàn)預處理過程,用于識別組件的潛在的嵌套執(zhí)行集的層級結(jié)構(gòu)。第二過程是控制圖生成過程,用于為每個執(zhí)行集生成對應的控制圖,編譯器/解釋器120將使用該控制圖來形成控制代碼,該控制代碼將在運行時有效地實現(xiàn)狀態(tài)機,用于控制每個執(zhí)行集內(nèi)的組件的執(zhí)行。下面將更詳細地描述這些過程中的每一個。
具有至少一個輸入數(shù)據(jù)端口的組件指定要對每個輸入數(shù)據(jù)元素或集合(或其多個輸入端口上的一元組的數(shù)據(jù)元素和/或集合)執(zhí)行的處理。這種規(guī)范的一種形式是作為將要對一個或一元組輸入數(shù)據(jù)元素和/或集合執(zhí)行的過程。如果組件具有至少一個輸出數(shù)據(jù)端口,則其可以產(chǎn)生對應的一個或一元組輸出數(shù)據(jù)元素和/或集合??梢砸愿呒壍幕谡Z句的語言(例如,使用Java源語句或例如在美國專利8,069,129“Editing and Compiling Business Rules(編輯和編譯業(yè)務規(guī)則)”中使用的數(shù)據(jù)操作語言(DML))來指定這樣的過程,或者可以以一些完全或部分編譯的形式提供(例如,如Java Bytecode(Java字節(jié)碼))。例如,組件可以具有工作過程,所述工作過程的自變量包括其輸入數(shù)據(jù)元素和/或集合及其輸出數(shù)據(jù)元素和/或集合,或更一般地,包括對這樣的數(shù)據(jù)元素或集合或?qū)^程或數(shù)據(jù)對象的引用(本文稱為“句柄”),所述引用用于獲取輸入并提供輸出數(shù)據(jù)元素或集合。
工作過程可以有各種類型。本文不希望限制可以指定的過程的類型,一種類型的工作過程根據(jù)記錄格式指定對數(shù)據(jù)元素的離散計算。單個數(shù)據(jù)元素可以是來自表格(或其他類型的數(shù)據(jù)集)的記錄,并且記錄的集合可以是表中的所有記錄。例如,具有單個標量輸入端口和單個標量輸出端口的組件的一種類型的工作過程包括接收一個輸入記錄,對該記錄執(zhí)行計算,以及提供一個輸出記錄。另一種類型的工作過程可以指定從多個標量輸入端口接收的一元組輸入記錄如何被處理以形成在多個標量輸出端口上發(fā)出的輸出記錄的一元組。
由數(shù)據(jù)處理圖指定的計算的語義定義固有地是平行的,因為它表示對由圖定義的計算的處理的順序和并發(fā)性的約束和/或無約束。因此,計算的定義不要求結(jié)果等同于計算步驟的某種順序排序。另一方面,計算的定義確實提供了需要對計算的部分進行排序的特定約束以及對計算的部分的并行執(zhí)行的限制。
在數(shù)據(jù)處理圖的討論中,假定將組件的多個實例實現(xiàn)為運行時系統(tǒng)中的分開的“任務”,作為表示排序和并行約束的方式。在討論基于圖的規(guī)范本身的特性之后,將更全面地進行將數(shù)據(jù)處理圖實現(xiàn)為基于任務的規(guī)范的更具體討論,其實現(xiàn)與語義定義一致的計算。
通常,數(shù)據(jù)處理圖中的每個組件將在圖的執(zhí)行期間在計算平臺中被多次實例化。每個組件的實例的數(shù)量可以取決于該組件被分配給多個執(zhí)行集中的哪一個。當實例化組件的多個實例時,多于一個實例可以并行執(zhí)行,并且不同的實例可以在系統(tǒng)中的不同計算節(jié)點中執(zhí)行。組件的互連(包括端口的類型)決定由指定的數(shù)據(jù)處理圖允許的并行處理的性質(zhì)。
盡管如下文所述,在組件的不同實例的執(zhí)行之間通常不保持狀態(tài),但在系統(tǒng)中提供某些規(guī)定用于明確地引用可以跨越組件的多個實例的執(zhí)行的持久存儲。
在工作過程指定如何處理單個記錄以產(chǎn)生單個輸出記錄并且端口被指示為集合端口的示例中,可以執(zhí)行組件的單個實例,并且迭代工作過程以處理連續(xù)的記錄以生成連續(xù)的輸出記錄。在這種情況下,可能從迭代到迭代在組件內(nèi)維持狀態(tài)。
在工作過程指定如何處理單個記錄以產(chǎn)生單個輸出記錄并且端口被指示為標量端口的示例中,可以執(zhí)行組件的多個實例,并且在工作過程的多次執(zhí)行之間沒有為不同的輸入記錄保持狀態(tài)。
此外,在一些實施例中,系統(tǒng)支持不遵循上面介紹的最細粒度規(guī)范的工作過程。例如,工作過程可以在內(nèi)部實現(xiàn)迭代,例如,其通過標量端口接受單個記錄并通過集合端口提供多個輸出記錄。
如上所述,存在兩種類型的數(shù)據(jù)端口:集合端口和標量端口,用于傳送一些形式的數(shù)據(jù);還存在兩種類型的串行端口:標量端口和控制端口,用于強制串行執(zhí)行。在一些情況下,一種類型的端口可以通過鏈路連接到另一類型的端口。這些情況中的一些將在下面描述。在某些情況下,一種類型的端口將鏈接到同一類型的端口。兩個控制端口之間的鏈路(稱為“控制鏈路”)在鏈接的組件之間施加串行執(zhí)行排序,而不需要通過鏈路發(fā)送數(shù)據(jù)。兩個數(shù)據(jù)端口之間的鏈路(稱為“數(shù)據(jù)鏈路”)提供數(shù)據(jù)流,并且還在標量端口的情況下強制串行執(zhí)行排序約束,并且在集合端口的情況下不需要串行執(zhí)行排序。典型的組件通常具有至少兩種端口,包括輸入和輸出數(shù)據(jù)端口(集合端口或標量端口)以及輸入和輸出控制端口。控制鏈路將上游組件的控制端口連接到下游組件的控制端口。類似地,數(shù)據(jù)鏈路將上游組件的數(shù)據(jù)端口連接到下游組件的數(shù)據(jù)端口。
開發(fā)人員可以使用圖形用戶界面從一組組件中指定特定的數(shù)據(jù)處理計算,每個組件執(zhí)行特定的任務(例如,數(shù)據(jù)處理任務)。開發(fā)人員通過在顯示屏幕上顯示的畫布區(qū)域上組裝數(shù)據(jù)處理圖來進行這樣的指定。這涉及將組件放置在畫布上,用適當?shù)逆溌愤B接它們的各個端口,以及適當?shù)嘏渲媒M件。以下簡單示例說明了在具有單對集合端口和單對控制端口的組件的情況下的某些行為。
圖2a示出了被組裝的數(shù)據(jù)處理圖的一部分包括第一組件210A的示例,第一組件210A具有輸入控制端口212A和輸出控制端口214A以及輸入集合端口216A和輸出集合端口218A。控制鏈路220A,222A將輸入控制端口212A和輸出控制端口214A連接到數(shù)據(jù)處理圖中其他組件的控制端口。類似地,數(shù)據(jù)鏈路224A,226A將輸入集合端口216A和輸出集合端口218A連接到數(shù)據(jù)處理圖中其他組件的端口。集合端口216A,218A在圖中表示為矩形,而控制端口212A,214A用圓形表示。
通常,輸入集合端口216A接收要由組件210A處理的數(shù)據(jù),并且輸出集合端口214提供已經(jīng)由組件210A處理的數(shù)據(jù)。在集合端口的情況下,所述數(shù)據(jù)通常是未指定數(shù)量的數(shù)據(jù)元素的無序集合。在整體計算的特定實例中,集合可以包括多個數(shù)據(jù)元素,或單個數(shù)據(jù)元素,或沒有數(shù)據(jù)元素。在一些實現(xiàn)方式中,集合與確定集合中的元素是無序的還是有序的(并且如果有序的話,什么決定順序)的參數(shù)相關(guān)聯(lián)。如下面將更詳細地描述的,對于無序集合,數(shù)據(jù)元素由數(shù)據(jù)鏈路的接收側(cè)的組件處理的順序可以不同于數(shù)據(jù)鏈路的發(fā)送側(cè)的組件提供這些數(shù)據(jù)元素的順序。因此,在集合端口的情況下,它們之間的數(shù)據(jù)鏈路用作數(shù)據(jù)元素的“包”,從其中可以以任意順序拉取數(shù)據(jù)元素,而不同于以特定順序?qū)?shù)據(jù)元素從一個組件移動到另一個組件的“傳送帶”。
控制鏈路用于在控制端口之間傳送控制信息,其確定組件是否開始執(zhí)行以及何時開始執(zhí)行。例如,控制鏈接222A指示組件210B將在組件210A已經(jīng)完成之后開始執(zhí)行(即,以串行順序),或者指示組件210B將不開始執(zhí)行(即,被“禁止”)。因此,雖然沒有數(shù)據(jù)通過控制鏈路發(fā)送,但是它可以被視為向接收側(cè)的組件發(fā)送信號。發(fā)送該信號的方式可以根據(jù)實現(xiàn)方式而變化,并且在一些實現(xiàn)方式中可以涉及在組件之間發(fā)送控制消息。其他實現(xiàn)方式可以不涉及發(fā)送實際的控制消息,而是可以改為涉及直接調(diào)用進程或調(diào)取與由接收側(cè)的組件表示的任務相關(guān)聯(lián)的函數(shù)的進程(或者在禁止的情況下省略這種調(diào)用或函數(shù)調(diào)取)。
鏈接控制端口的能力因此使得開發(fā)人員能夠控制由數(shù)據(jù)處理圖的不同組件表示的數(shù)據(jù)處理計算的不同部分之間的相對排序。另外,使用組件上的控制端口提供這種排序機制使得能夠混合與數(shù)據(jù)流和控制流相關(guān)聯(lián)的邏輯。實際上,這使得數(shù)據(jù)能夠用于做出關(guān)于控制的決定。
在圖2A所示的示例中,控制端口連接到其他控制端口,并且數(shù)據(jù)端口連接到其他數(shù)據(jù)端口。然而,數(shù)據(jù)端口上的數(shù)據(jù)固有地攜帶兩種不同種類的信息。第一種是數(shù)據(jù)本身,第二種是數(shù)據(jù)的存在。該第二種信息可以用作控制信號。結(jié)果,通過使標量數(shù)據(jù)端口能夠連接到控制端口,可以提供額外的靈活性。
圖2B示出了示例性數(shù)據(jù)處理圖230,其利用了由將標量端口連接到控制端口的能力所賦予的靈活性。
數(shù)據(jù)處理圖230的特征如下:標記為“計算日期信息”的第一組件231,標記為“制作每月報告?”的第二組件232,標記為“制作每周報告”的第三組件233,標記為“每月報告”的第四組件234,標記為“制作每周報告?”的第五組件235和標記為“每周報告”的第六組件236。數(shù)據(jù)處理圖230執(zhí)行過程,該過程總是產(chǎn)生每日報告、每日報告和每周報告、或所有三種報告。關(guān)于這些結(jié)果中的哪些將發(fā)生的決定取決于對由第一組件231提供的某些日期信息的評估。因此,圖2B示出了有效地控制執(zhí)行的數(shù)據(jù)的示例。
當?shù)谝唤M件231將日期信息從輸出標量端口提供到第二組件232的輸入標量端口和第三組件233的輸入標量端口時,執(zhí)行開始。沒有連接的輸入控制端口的第二組件232立即工作。包括第三組件233的所有其他組件具有連接的輸入控制端口,并且必須等待由適當?shù)恼刂菩盘柤せ睢?/p>
第二組件232檢查該日期信息并確定是否適合制作每月報告。有兩種可能的結(jié)果:需要每月報告,或者不需要。第二組件232和第三組件233都具有兩個輸出標量端口,并且都被配置為執(zhí)行選擇函數(shù),該選擇函數(shù)提供數(shù)據(jù)元素,該數(shù)據(jù)元素在一個輸出標量端口(即,所選端口)上用作正控制信號并且在另一個輸出標量端口上用作負控制信號。
如果基于日期信息,第二組件232確定不需要每月報告,則第二組件232將數(shù)據(jù)元素從其底部輸出標量端口發(fā)送到第三組件233的輸入控制端口。該數(shù)據(jù)元素被解釋為正控制信號,其向第三組件233指示第二組件232已經(jīng)完成了對由第一組件231提供的數(shù)據(jù)的處理,并且第三組件233現(xiàn)在可以開始處理其接收的日期信息數(shù)據(jù)。
另一方面,如果第二組件232基于由第一組件231提供的日期信息確定需要每月報告,則第二組件232改為將被解釋為正控制信號的數(shù)據(jù)元素從其輸出標量端口發(fā)送到第四組件234的輸入控制端口。雖然數(shù)據(jù)元素不僅僅是控制信號,但是第四組件234將其視為正控制信號,因為它正被提供給其輸入控制端口。第四組件234忽略數(shù)據(jù)元素中的實際數(shù)據(jù),并且僅使用數(shù)據(jù)元素的存在作為正控制信號。
第四組件234繼續(xù)創(chuàng)建每月報告。在完成時,第四組件234從其輸出控制端口輸出控制信號到第三組件233的輸入控制端口。這告訴第三組件233它(即第三組件233)現(xiàn)在可以開始處理第一組件231提供給它的日期信息。
因此,第三組件233將總是最終經(jīng)由其輸入標量端口處理由第一組件231提供的數(shù)據(jù)。唯一的區(qū)別在于哪個組件觸發(fā)它開始處理:是第二組件232還是第四組件234。這是因為第三組件233上的兩個輸入控制端口將使用OR邏輯進行組合,使得在任一端口(或兩者)接收的正控制信號將觸發(fā)處理。
圖230的其余部分以基本上相同的方式操作,只是第三組件233接管第二組件232的角色,第六組件236接管第四組件234的角色。
在被其輸入控制端口處來自第二組件232或第四組件234的控制信號激活時,第三組件233通過將第一組件231連接到第三組件233的數(shù)據(jù)鏈路檢查由第一組件231提供的日期信息。如果第三組件233基于日期信息確定不需要每周報告,則第三組件233將被解釋為正控制信號的數(shù)據(jù)元素從其輸出標量端口之一發(fā)送到第五組件235的輸入控制端口。
另一方面,如果第三組件233確定需要每周報告,則第三組件233將被解釋為正控制信號的數(shù)據(jù)元素從其另一輸出標量端口發(fā)送到第六組件236的輸入控制端口。第六組件236繼續(xù)創(chuàng)建每周報告。在完成時,第六組件236將被解釋為正控制信號的數(shù)據(jù)元素從其輸出標量端口發(fā)送到第五組件235的輸入控制端口。
因此,第五組件235將總是最終執(zhí)行,唯一的區(qū)別是第三組件233還是第六組件236最終觸發(fā)第五組件235開始執(zhí)行。在從第三組件233或第六組件236接收到控制信號時,第五組件235創(chuàng)建每日報告。
圖2C還示出了標量和集合數(shù)據(jù)端口的使用。
圖2C示出了數(shù)據(jù)處理圖240,其具有標記為“輸入文件”的第一組件241,標記為“從請求獲取文件名”的第二組件242,標記為“讀取文件”的第三組件243,標記為“是壞記錄?”的第四組件244,標記為“無效記錄”的第五組件245,標記為“生成壞記錄文件名”的第六組件246,標記為“任何驗證錯誤?”的第七組件247和標記為“發(fā)送警報”的第八組件248。此圖旨在將壞記錄寫入文件,并在檢測到這種壞記錄時發(fā)送警報。
組件241和243是用作數(shù)據(jù)的源的組件的示例,并且組件245是用作數(shù)據(jù)的宿(接收器)的組件的示例。組件241和243使用可以以文件系統(tǒng)(諸如本地文件系統(tǒng)或分布式文件系統(tǒng))中的各種格式中的任一種存儲的輸入文件作為其源。輸入文件組件讀取文件的內(nèi)容,并從該文件產(chǎn)生記錄的集合。標量輸入端口(如組件243所示)提供指定要讀取的文件的位置(例如,路徑或統(tǒng)一資源定位符)和要使用的記錄格式的數(shù)據(jù)元素。在一些情況下,位置和記錄格式可以作為參數(shù)提供給輸入文件組件,在這種情況下,輸入標量端口不需要連接到任何上游組件,并且不需要顯示(對于組件241也是如此)。集合輸出端口(如組件241和243兩者上的所示)提供記錄的集合。類似地,輸出文件組件(諸如組件245)將通過輸入集合端口接收的記錄的集合寫到輸出文件(其位置和記錄格式可以可選地由輸入標量端口指定)。輸入文件組件或輸出文件組件還可以包括鏈接到另一組件(諸如組件245)的控制端口的控制輸入或輸出端口。
在所示的數(shù)據(jù)處理圖240中,較大的虛線矩形內(nèi)的組件是執(zhí)行集(execution set)的一部分。此執(zhí)行集包含嵌套在其中的另一個執(zhí)行集。該嵌套執(zhí)行集也在虛線矩形內(nèi)示出,其僅包含第四組件244。下面更詳細地討論執(zhí)行集。
在操作中,第一組件241讀取輸入文件。當?shù)谝唤M件241正在執(zhí)行時,第一組件241經(jīng)由從輸出集合數(shù)據(jù)端口到第二組件242的輸入集合數(shù)據(jù)端口的數(shù)據(jù)鏈路將輸入文件內(nèi)的記錄的集合提供給第二組件。第二組件242的不同實例和其他下游組件(它們在同一執(zhí)行集中)可以針對集合中的每個記錄執(zhí)行,如下面將更詳細描述的。由于第二組件242沒有連接到其控制輸入的任何東西,所以第二組件242立即開始處理。在完成時,第二組件242在其輸出標量端口上提供文件名。該文件名在相應輸入標量端口處由第三組件243和第六組件246兩者接收。
第三組件243立即讀取由文件名標識的文件,并且在輸出集合端口上提供文件的內(nèi)容以用于遞送到第四組件244的實例的輸入標量端口。同時,第六組件246接收相同的文件名并輸出另一文件名,其提供到連接于第五組件245和第七組件247的對應輸入標量端口的輸出標量端口上。
在從第六組件246接收到文件名和從第四組件244接收到壞記錄時,第五組件245將壞記錄寫入文件名由第六組件246標識的輸出文件。
第七組件247是唯一一個在其數(shù)據(jù)輸入端口接收數(shù)據(jù)時沒有準備好被啟動執(zhí)行的組件。當?shù)谖褰M件245完成對輸出文件的寫入時,第五組件245將控制信號從其控制輸出端口發(fā)送到第七組件247的輸入控制端口。如果第七組件247確定存在錯誤,則第七組件247提供數(shù)據(jù)到第八組件248的輸入標量端口。這使得第八組件248生成警報。這提供了控制端口用于限制數(shù)據(jù)處理圖中的某些組件的執(zhí)行的示例。
應當清楚的是,當一組多個上游組件都已達到特定狀態(tài)時,基于一個組件的狀態(tài)控制另一個組件中的處理的能力使得該組件可以控制處理。例如,數(shù)據(jù)處理圖可以支持去往或來自同一控制端口的多個控制鏈路??商娲兀谝恍崿F(xiàn)方式中,組件可以包括多個輸入和輸出控制端口。默認邏輯可以被編譯器/解釋器120應用。開發(fā)人員還可以提供用于確定如何組合控制信號的定制邏輯。這可以通過適當?shù)夭贾媒M合邏輯以應用于上游組件的各種控制鏈路,并且僅當達到某個邏輯狀態(tài)時(例如,在默認OR邏輯的情況下,當所有上游組件已經(jīng)完成時,并且當至少一個上游組件已經(jīng)發(fā)送激活控制信號時)觸發(fā)組件的啟動來實現(xiàn)。
通常,控制信號可以是觸發(fā)處理開始或觸發(fā)處理禁止的信號。前者是“正控制信號”,后者是“負控制信號”。然而,如果使用組合邏輯來確定是否應該調(diào)用任務(觸發(fā)處理的開始),則邏輯可以“反轉(zhuǎn)”通常的解釋,使得僅當所有輸入提供負控制信號時調(diào)用任務。通常,組合邏輯可以提供用于確定與控制圖對應的狀態(tài)機中的下一狀態(tài)的任意“真值表”,下面將更詳細描述。
未連接的控制端口可以被分配默認狀態(tài)。在一個實施例中,默認狀態(tài)對應于正控制信號。如下面更詳細地描述的,這可以通過在表示數(shù)據(jù)處理圖的控制圖中使用隱式開始組件和結(jié)束組件來實現(xiàn)。
各種組件上的不同類型的數(shù)據(jù)端口允許數(shù)據(jù)以不同的方式在組件之間通過鏈路傳遞,這取決于鏈接這些組件的輸入和輸出端口的類型。如上所述,標量端口表示至多單個數(shù)據(jù)元素(即,0或1個數(shù)據(jù)元素)的生產(chǎn)(對于標量輸出端口)或消耗(對于標量輸入端口)。而集合端口表示一組潛在的多個數(shù)據(jù)元素的生產(chǎn)(對于集合輸出端口)或消耗(對于集合輸入端口)。通過在單個數(shù)據(jù)處理圖中支持兩種類型的數(shù)據(jù)端口,可以更有效地分配計算資源,并且可以在任務之間生成更復雜的控制流和數(shù)據(jù)流,從而允許開發(fā)人員容易地指示期望的行為。
參考圖3A,數(shù)據(jù)處理圖300包括一連串三個連接的組件:第一組件(A1)302,第二組件(B1)304和第三組件(C1)306。第一組件包括集合型輸入端口308以及標量型輸出端口310。第二組件304包括標量型輸入端口312和標量型輸出端口314。第三組件包括標量型輸入端口316和集合型輸出端口318。
第一鏈路320將第一組件302的標量輸出端口310連接到第二組件304的標量輸入端口312,這允許數(shù)據(jù)在第一組件302和第二組件304之間傳遞,并且同時強制第一組件302和第二組件304的串行執(zhí)行。類似地,第二鏈路322將第二組件304的標量輸出端口314連接到第三組件306的標量輸入端口316,這允許數(shù)據(jù)在第二組件304和第三組件306之間傳遞,并且強制第二組件304和第三組件306的串行執(zhí)行。
由于圖3A中標量端口的互連,第二組件304僅在第一組件302完成之后開始執(zhí)行(并且在第一鏈路320上傳遞單個數(shù)據(jù)元素),并且第三組件306僅在第二組件304完成之后開始執(zhí)行(并且在第二鏈路322上傳遞單個數(shù)據(jù)元素)。也就是說,數(shù)據(jù)處理圖中三個組件中的每一個以嚴格的順序A1/B1/C1運行一次。
在一些示例中,一個或多個組件可以被置于禁止狀態(tài),這意味著一個或多個組件不執(zhí)行,并因此不將任何數(shù)據(jù)元素從其輸出端口傳遞出去。例如,通過確保將不執(zhí)行任何有用處理的組件不需要專用于它們的計算資源(例如,進程或存儲器),使得能夠禁止組件,避免浪費資源。具有僅連接到被禁止組件的輸出端口的標量輸入端口的任何組件不會執(zhí)行,因為它們不接收數(shù)據(jù)。例如,如果第一組件302被置于禁止狀態(tài),則第二組件304的標量輸入端口312不從第一組件302的標量輸出端口310接收數(shù)據(jù),因此不執(zhí)行。由于第二組件304不執(zhí)行,因此第三組件306的標量輸入端口316不接收來自第二組件304的標量輸出端口314的數(shù)據(jù),并且也不執(zhí)行。因此,在兩個標量端口之間傳遞的數(shù)據(jù)也用作正控制信號,類似于在兩個鏈接的控制端口之間發(fā)送的信號。
在圖3A的示例性數(shù)據(jù)處理圖中,第一組件302的輸入端口308和第三組件318的輸出端口恰好是集合端口,其對連接它們的標量端口強加的第一組件302、第二組件304和第三組件306的串行執(zhí)行行為沒有影響。
通常,集合端口用于在組件之間傳遞數(shù)據(jù)元素的集合(collection),并且同時可以向運行時系統(tǒng)授予重新排序該集(set)中的數(shù)據(jù)元素的許可。允許對無序集合的數(shù)據(jù)元素重新排序,因為對從一個數(shù)據(jù)元素到另一個數(shù)據(jù)元素的計算的狀態(tài)沒有依賴性,或者如果存在處理每個數(shù)據(jù)元素時被訪問的全局狀態(tài),則最終狀態(tài)獨立于處理這些數(shù)據(jù)元素的順序。此重新排序的許可提供了將關(guān)于并行化的決策推遲到運行時的靈活性。
參考圖3B,數(shù)據(jù)處理圖324包括一連串三個連接的組件:第一組件(A2)326、第二組件(B2)328和第三組件(C2)330。第一組件326包括集合型輸入端口332和集合型輸出端口334。第二組件328包括集合型輸入端口336和集合型輸出端口338。第三組件330包括集合型輸入端口340和集合型輸出端口342。
三個組件326、328、330中的每一個指定如何處理一個或多個輸入元素的集合以生成一個或多個輸出元素的集合。在特定輸入元素和特定輸出元素之間并不必然存在一一對應關(guān)系。例如,第一組件326和第二組件328之間的數(shù)據(jù)元素344的第一集合中的多個數(shù)據(jù)元素可以不同于第二組件328和第三組件330之間的數(shù)據(jù)元素346的第二集合中的多個數(shù)據(jù)元素。對集合端口之間的連接施加的唯一約束是集合中的每個數(shù)據(jù)元素從一個集合端口傳遞到另一個集合端口,同時允許第一組件326和第二組件328之間以及第二組件328和第三組件330之間相對于它們被處理的順序任意重新排序。可替代地,在其他示例中,集合端口可以可選地被配置為保持順序。在該示例中,三個組件326、328、330一同啟動并且并發(fā)運行,從而允許流水線并行性。
參照圖1描述的編譯器/解釋器120被配置為識別集合端口到集合端口連接,并且以適合于正在執(zhí)行的計算的方式將計算轉(zhuǎn)換為可執(zhí)行代碼。集合數(shù)據(jù)鏈路的無序性質(zhì)使得編譯器/解釋器120在如何實現(xiàn)這一點方面具有靈活性。例如,如果對于第二組件328,恰好基于單個輸入元素計算每個輸出元素(即,沒有跨數(shù)據(jù)元素維持的狀態(tài)),則編譯器/解釋器120可以允許運行時系統(tǒng)通過對每個數(shù)據(jù)元素實例化多達一個組件的實例來動態(tài)地并行化數(shù)據(jù)元素的處理(例如,取決于運行時可用的計算資源)??蛇x地,在特殊情況下,可以在具有多個輸入集合端口的組件中跨數(shù)據(jù)元素維護狀態(tài)。但在一般情況下,可以允許運行時系統(tǒng)對組件的任務并行化。例如,如果運行時系統(tǒng)檢測到?jīng)]有被維持的全局狀態(tài),則可以允許對任務并行化。一些組件還可以被配置為支持維持狀態(tài),在這種情況下可以不允許并行化。如果集合是無序的,則不需要在數(shù)據(jù)元素之間保持順序意味著第二組件328的每個實例一旦可用就可以向第三組件330提供其輸出數(shù)據(jù)元素,并且第三組件330可以在第二組件328的所有實例已經(jīng)完成之前開始處理這些數(shù)據(jù)元素。
在一些示例中,圖開發(fā)者可以明確地指示可以通過將一個組件的集合型輸出端口連接到另一個組件的標量型輸入端口來動態(tài)地并行化數(shù)據(jù)集合中數(shù)據(jù)元素的處理。這種指示還要求在集合的不同元素的處理之間無需維持狀態(tài)。參考圖3C,數(shù)據(jù)處理圖348包括一連串三個連接的組件:第一組件(A3)350、第二組件(B3)352和第三組件(C3)354。第一組件350包括集合型輸入端口356和集合型輸出端口358。第二組件352包括標量型輸入端口360和標量型輸出端口362。第三組件354包括集合型輸入端口364和集合型輸出端口366。
第一組件的集合型輸出端口358通過第一鏈路368連接到第二組件352的標量型輸入端口360,并且第二組件352的標量型輸出端口362通過第二連接370連接到集合型輸入端口364。如下面更詳細描述的,從集合型輸出端口到標量型輸入端口的鏈路意味著進入執(zhí)行集的入口點,并且從標量型輸出端口到集合型輸入端口的鏈路意味著執(zhí)行集的出口點。非常普遍的情況是,如下面更詳細地描述的,包括在執(zhí)行集中的多個組件可以由運行時控制器動態(tài)地并行化以處理來自數(shù)據(jù)元素集合的數(shù)據(jù)元素。
在圖3C中,第一組件350的集合型輸出端口358和第二組件352的標量型輸入端口360之間的鏈路368意味著進入執(zhí)行集的入口點。第二組件352的標量型輸出端口362和第三組件354的集合型輸入端口364之間的鏈路370意味著執(zhí)行集的出口點。也就是說,第二組件352是執(zhí)行集中的唯一組件。
由于第二組件352包括在執(zhí)行集中,因此針對從第一組件350的集合型輸出端口358接收的每個數(shù)據(jù)元素啟動第二組件352的單獨實例。至少一些單獨的實例可以并行地運行,這取決于直到運行時才能做出的決策。在該示例中,第一組件(350)和第三組件(354)一同啟動并且并發(fā)運行,而第二組件(352)針對通過鏈路368接收的集合內(nèi)的每個數(shù)據(jù)元素運行一次??商娲?,針對集合中每多個數(shù)據(jù)元素的元組,第二組件352運行一次。
2執(zhí)行集
如上面參照圖1所描述的,編譯器/解釋器120對數(shù)據(jù)處理圖實施執(zhí)行集發(fā)現(xiàn)預處理過程,以準備用于執(zhí)行的數(shù)據(jù)處理圖。在一般意義上,如本文所使用的,術(shù)語“執(zhí)行集”是指可以作為單元被調(diào)用并應用于數(shù)據(jù)的一部分(諸如輸出集合端口的數(shù)據(jù)元素的一部分)的一個或多個組件的集合。因此,對于每個輸入數(shù)據(jù)元素(或呈現(xiàn)給執(zhí)行集的一個或多個輸入端口的多個輸入數(shù)據(jù)元素的元組)實施執(zhí)行集中的每個組件的至多一個實例。在執(zhí)行集內(nèi),通過到標量和控制端口的鏈路強加排序約束,只要不違反排序約束,就允許執(zhí)行集中組件的并行執(zhí)行。由編譯器/解釋器120為執(zhí)行集準備的代碼可以包括指示在執(zhí)行代碼時如何實施與組件相對應的任務(例如,并行度)的嵌入信息(例如,注釋或修改符)。在對接收到的集合中多個數(shù)據(jù)元素的元組執(zhí)行執(zhí)行集的一個實例的示例中,所述元組可包括例如固定數(shù)量的數(shù)據(jù)元素或共享一些特性(例如,公共鍵值)的多個數(shù)據(jù)元素。在存在被允許并行執(zhí)行的至少一些組件的示例中,可以使用多個任務來實現(xiàn)執(zhí)行集,例如,用于作為整體的執(zhí)行集的任務,以及用于一個或多個組件的實例的并發(fā)執(zhí)行的一個或多個子任務。因此,表示執(zhí)行集的不同實例的任務本身可以被分解成甚至更細粒度的任務,例如具有可以并發(fā)執(zhí)行的子任務。用于不同執(zhí)行集的任務通常可以獨立并行地執(zhí)行。因此,如果大型數(shù)據(jù)集有例如一百萬條記錄,則可能有一百萬個獨立的任務。一些任務可以在計算平臺150的不同節(jié)點152上執(zhí)行。任務可以使用可以被有效地并發(fā)執(zhí)行的輕量線程來執(zhí)行,甚至在單個節(jié)點152上也是如此。
通常,由分配算法標識的執(zhí)行集(即,除根執(zhí)行集之外的執(zhí)行集)通過在執(zhí)行集的邊界處的“驅(qū)動”標量數(shù)據(jù)端口來接收數(shù)據(jù)元素。對于在執(zhí)行集的驅(qū)動輸入標量數(shù)據(jù)端口處接收的每個數(shù)據(jù)元素,執(zhí)行集內(nèi)的每個組件執(zhí)行一次(如果激活)或根本不執(zhí)行(如果禁止)。執(zhí)行集的多個實例可以被實例化并且并行地執(zhí)行以處理從上游集合端口對執(zhí)行集可用的多個數(shù)據(jù)元素??梢栽谶\行時確定執(zhí)行集的并行度(并且包括不使執(zhí)行集并行化的可能決策),并且并行度僅受到運行時可用的計算資源的限制。執(zhí)行集的獨立實例的各個輸出在執(zhí)行集的(多個)輸出端口處被聚集,而不管順序如何,并且被提供給下游組件??商娲兀谄渌麑嵤├?,可以識別不同于根執(zhí)行集的不需要驅(qū)動輸入標量數(shù)據(jù)端口的執(zhí)行集(在一些情況下,基于用戶輸入)。這樣的沒有驅(qū)動輸入標量數(shù)據(jù)端口的執(zhí)行集如果合適的話可以使用本文所述的過程在單個實例中執(zhí)行(例如,下面描述的鎖定的執(zhí)行集)或在多個實例中并行地執(zhí)行。例如,可以設置確定執(zhí)行集將被執(zhí)行的次數(shù)和/或?qū)⒈粓?zhí)行的執(zhí)行集的并行實例的數(shù)量的參數(shù)。
非常常見的情況是,執(zhí)行集發(fā)現(xiàn)過程使用確定數(shù)據(jù)處理圖內(nèi)的組件的子集的分配算法,所述子集將被應用為對數(shù)據(jù)元素的無序集合的輸入元素的集。分配算法遍歷數(shù)據(jù)處理圖并基于分配規(guī)則將每個組件分配給子集。如在以下示例中清楚可見的,給定數(shù)據(jù)處理圖可以包括嵌套在執(zhí)行集層級結(jié)構(gòu)的不同級別中的多個執(zhí)行集。
在本文所述的數(shù)據(jù)處理圖中,存在兩種類型的數(shù)據(jù)端口:標量數(shù)據(jù)端口和集合數(shù)據(jù)端口。通常,如果一對鏈接的組件(即,圖4A到圖4D的上游組件A402和下游組件B 404)通過相同類型的端口之間的鏈路連接,則在默認情況下它們將在相同的執(zhí)行集中(除非它們由于另一個原因在不同的執(zhí)行集中)。在圖4A中,組件A402具有輸出端口406,該端口具有標量類型,并且組件B 404具有輸入端口408,該端口具有標量類型。由于組件A 402和組件B 404之間的鏈路410連接兩個標量型端口,因此在該示例中組件A 402和組件B 404處于相同的執(zhí)行集中。在圖4A中,由于組件A 402和組件B 404之間的鏈路是標量到標量鏈路,所以0個數(shù)據(jù)元素或1個數(shù)據(jù)元素通過鏈路410在上游組件A 402和下游組件B 404之間傳遞。在上游組件A 402的處理完成時,通過鏈路410傳遞數(shù)據(jù)元素,除非上游組件A 402被禁止(如上所述),在這種情況下沒有數(shù)據(jù)元素通過鏈路410傳遞。
參考圖4B,組件A 402具有輸出端口412,該端口具有集合類型,并且組件B 404具有輸入端口414,該端口具有集合類型。由于組件A 402和組件B 404之間的鏈路410連接兩個集合型端口,因此在該示例中組件A 402和組件B 404也處于相同的執(zhí)行集中。在圖4B中,由于組件A 402和組件B 404之間的鏈路410是集合到集合鏈路,所以通過鏈路410在上游組件和下游組件之間傳遞一組數(shù)據(jù)元素。
當鏈路兩端的端口類型之間存在不匹配時,執(zhí)行集層級結(jié)構(gòu)的級別中存在隱性更改。具體地,不匹配的端口表示在執(zhí)行集層級結(jié)構(gòu)的特定級別處的執(zhí)行集的入口點或出口點。在一些示例中,執(zhí)行集入口點被定義為集合型輸出端口和標量型輸入端口之間的鏈路。在圖4C中,在組件A 402和組件B 404之間的鏈路410處示出了執(zhí)行組入口點424的一個示例,這是因為組件A 402的輸出端口416是集合型端口,而組件B 404的輸入端口418是標量型端口。
在一些示例中,執(zhí)行集出口點被定義為標量型輸出端口和集合型輸入端口之間的鏈路。參考圖4D,在組件A 402與組件B 404之間的鏈路410處示出了執(zhí)行組出口點426的一個示例,這是因為組件A 402的輸出端口420是標量型端口,而組件B 404的輸入端口422是集合型端口。
在編譯器/解釋器120進行編譯和/或解釋之前實現(xiàn)的分配算法使用執(zhí)行集入口點和執(zhí)行集出口點來發(fā)現(xiàn)數(shù)據(jù)處理圖中存在的執(zhí)行集。
2.1基于堆棧的分配算法
為了說明的目的,在第一示例中,數(shù)據(jù)處理圖具有簡單的一維圖結(jié)構(gòu),并且使用基于堆棧的算法示出更簡單的分配算法。在基于堆棧的分配算法中,數(shù)據(jù)處理圖中的每個組件用一個或多個“ID字符串”標記,該“ID字符串”由以分隔字符‘/’分隔的整數(shù)組成。分隔字符‘/’出現(xiàn)在給定組件的ID字符串中的次數(shù)確定執(zhí)行集層級結(jié)構(gòu)中的組件的級別。在一些示例中,組件可以具有多個輸入鏈路,并且因此可以具有多個ID字符串。在這種情況下,算法具有下面更詳細描述的規(guī)則,用于確定使用哪個ID字符串。
在基于堆棧的分配算法的一個示例中,編譯器/解釋器120根據(jù)以下過程在上游到下游方向上遍歷數(shù)據(jù)處理圖。最初,最上游的組件用ID字符串‘0’標記,指示它是執(zhí)行集層級結(jié)構(gòu)中根級別上的組件。
然后遍歷從最上游組件到最下游組件的路徑上的鏈路和組件。如果遇到上游組件的集合型輸出端口和下游組件的集合型輸入端口之間的鏈路,則上游組件的ID字符串被傳播到下游組件。類似地,如果遇到上游組件的標量型輸出端口和下游組件的標量型輸入端口之間的鏈路,則上游組件的ID字符串被傳播到下游組件。
如果遇到上游組件的集合型輸出端口和下游組件的標量型輸入端口之間的鏈路,則向下游組件分配包括上游組件的標記其末尾附加‘/n’的標記,其中n是<所有現(xiàn)有ID字符串整數(shù)中最大的整數(shù)>+l。如果遇到上游組件的標量型輸出端口和下游組件的集合型輸入端口之間的鏈路,則向下游組件分配包括上游組件的標記去除其最右邊的ID字符串整數(shù)(以及其分隔字符‘/’)的標記。
在一些示例中,各種條件可以被認為是非法的,并且將導致算法中的錯誤(例如,如果組件在執(zhí)行集層級結(jié)構(gòu)中相同級別上具有兩個不同的ID字符串,或者在執(zhí)行集中存在循環(huán))。
參考圖5,將上述基于堆棧的分配算法應用于示例性數(shù)據(jù)處理圖550,導致發(fā)現(xiàn)兩個執(zhí)行集(除了根以外,“0級”執(zhí)行集551):第一“1級”執(zhí)行集570和嵌套在第一“1級”執(zhí)行集670內(nèi)的第二“2級”執(zhí)行集572。為了實現(xiàn)兩個執(zhí)行集570、572的發(fā)現(xiàn),基于堆棧的分配算法首先標記最上游組件,具有ID字符串‘0’的第一數(shù)據(jù)集656。然后基于堆棧的分配算法遍歷通過數(shù)據(jù)處理圖550的一維路徑的組件。在遍歷該路徑時,基于堆棧的分配算法首先遍歷從第一數(shù)據(jù)集556到第一組件558的鏈路。由于第一數(shù)據(jù)集556的輸出端口是集合型輸出端口,并且第一組件558的輸入端口是標量型輸入端口,所以第一組件558被分配ID字符串‘0/1’,其是第一數(shù)據(jù)集556的ID字符串在其末尾附加‘/1’的標記,其中1是所有現(xiàn)有ID字符串整數(shù)的最大值+1。通常,將‘/1’附加到第一組件558的ID字符串是從根“0級”執(zhí)行集551到“1級”執(zhí)行集570的轉(zhuǎn)換的指示。在一些示例中,該轉(zhuǎn)換使用第一執(zhí)行集入口點指示符557表示。
然后,分配算法遍歷從第一組件558到第二組件560的鏈路。由于第一組件558的輸出端口是集合型輸出端口并且第二組件560的輸入端口是標量型輸入端口,所以第二組件560被分配ID字符串‘0/1/2’,其是第一組件558的ID字符串其末尾附加‘/2’,其中2是所有現(xiàn)有ID字符串整數(shù)的最大值+1。通常,將‘/2’附加到第二組件560的ID字符串是從“1級”執(zhí)行集570到“2級”執(zhí)行集572的轉(zhuǎn)換的指示。在一些示例中,該轉(zhuǎn)換使用第二執(zhí)行集入口點指示符559表示。
然后,分配算法遍歷從第二組件560到第三組件562的鏈路。由于第二組件560的輸出端口是標量型輸出端口,并且第三組件562的輸入端口是標量型輸入端口,所以第二組件560的ID字符串(即,‘0/1/2’)被傳播到第三組件562。
然后,分配算法遍歷從第三組件562到第四組件564的鏈路。由于第三組件562的輸出端口是標量型輸出端口,并且第四組件564的輸入端口是集合型輸入端口,所以第四組件被分配ID字符串‘0/1’,其是第三組件562的ID字符串去除其最右邊ID字符串‘2’(及其分隔字符‘/’)的ID字符串。通常,從第三組件562的ID字符串中去除‘/2’是從“2級”執(zhí)行集572到“1級”執(zhí)行集570的轉(zhuǎn)換的指示。在一些示例中,該轉(zhuǎn)換使用第一執(zhí)行集出口點指示符563表示。
然后,分配算法遍歷從第四組件564到第五組件566的鏈路。由于第四組件564的輸出端口是標量型輸出端口,并且第五組件566的輸入端口是集合型輸入端口,所以第五組件566被分配ID字符串‘0’,其是第四組件564的ID字符串去除其最右邊的ID字符串整數(shù)(及其分隔字符‘/’)。通常,從第四組件564的ID字符串中去除‘/1’是從“1級”執(zhí)行集570到根“0級”執(zhí)行集551的轉(zhuǎn)換的指示。在一些示例中,該轉(zhuǎn)換使用第二執(zhí)行集出口點指示符565來表示。
最后,分配算法遍歷從第五組件566到第二數(shù)據(jù)集568的鏈路。由于第五組件566的輸出端口是集合型輸出端口,并且第二數(shù)據(jù)集568的輸入端口是集合型輸入端口,所以第五組件566的ID字符串(即,‘0’)被傳播到第二數(shù)據(jù)集568。
在一些示例中,除了入口點指示符和出口點指示符之外,可以使用用戶界面內(nèi)的附加視覺提示在視覺上表示數(shù)據(jù)元素的集合的流和個體標量數(shù)據(jù)元素之間的變化。例如,表示鏈路的線在集合端口和指示符之間可以更粗,而在指示符和標量端口之間更細。
基于堆棧的分配算法的結(jié)果包括數(shù)據(jù)處理圖550的版本,其中每個組件用ID字符串標記。在圖5的示例中,第一數(shù)據(jù)集556、第二數(shù)據(jù)集568和第五組件566都用ID字符串‘0’標記。第一組件558和第四組件564用ID字符串‘0’標記。第二組件560和第三組件562各自用ID字符串‘0/1/2’標記。
每個唯一ID字符串表示執(zhí)行集層級結(jié)構(gòu)中的唯一執(zhí)行集。具有ID字符串‘0’的那些組件被分組到執(zhí)行層級中的根“0級”執(zhí)行集551中。具有ID字符串‘0/1’的那些組件被分組到嵌套在根執(zhí)行集651中的“1級”執(zhí)行集670中(其中‘0/1’可以被讀取為嵌套在執(zhí)行集0中的執(zhí)行集1)。具有ID字符串‘0/1/2’的那些組件被分組到“2級”執(zhí)行集572,其嵌套在根“0級”執(zhí)行集551和“1級”執(zhí)行集570內(nèi)。
2.2基于全局映射的分配算法
在一些示例中,對于更一般的數(shù)據(jù)處理圖,基于堆棧的分配算法可能不足以正確地確定執(zhí)行集的層級結(jié)構(gòu)。例如,在一般的數(shù)據(jù)處理圖中,任何給定的組件可以具有多個輸入端口和/或多個輸出端口,使一般的數(shù)據(jù)處理圖與基于堆棧的方法不兼容。在這樣的示例中,使用基于全局映射的分配算法來確定執(zhí)行集層級結(jié)構(gòu)。
基于全局映射的分配算法利用數(shù)據(jù)處理圖被限制為有向無環(huán)圖的事實??梢允褂猛負渑判蚝蟮捻樞騺硖幚碛邢驘o環(huán)圖,以確保圖的每個組件僅在緊鄰該組件的上游的所有組件被處理之后得到處理。由于已知已經(jīng)處理了組件的緊接上游的所有組件,所以可以通過選擇該組件直接上游的(在執(zhí)行集層級結(jié)構(gòu)中)最深嵌套組件的ID字符串來確定該組件的ID字符串。
在一些示例中,基于全局映射的分配算法使用諸如Kahn算法的標準拓撲排序算法來獲得給定數(shù)據(jù)處理圖的拓撲排序后的順序。Kahn算法通過以下偽代碼概述:
L←將要包含被排序元素的空列表
S←沒有進入邊的所有節(jié)點的集合
只要S是非空的,進行以下動作:
從S去除節(jié)點n
將n添加到L的尾部
對于具有n到m的邊e的每個節(jié)點m,進行以下動作:
從圖中去除邊e
如果m沒有其它進入邊,則
將m插入S
如果圖具有多個邊,則
返回錯誤(圖具有至少一個循環(huán))
否則
返回L(拓撲排序后的順序)
在確定拓撲排序后的順序之后,基于全局映射的分配算法以拓撲排序后的順序遍歷數(shù)據(jù)處理圖的組件,以確定每個組件的適當ID字符串(或簡稱ID號)。特別地,當遍歷組件時,數(shù)據(jù)處理圖的每個組件將其ID字符串復制到其輸出端口。直接位于上游組件下游且沒有由于執(zhí)行集入口點或執(zhí)行集出口點而與上游組件分離的組件從上游組件的輸出端口讀取ID字符串,并使用該ID字符串作為其ID字符串。
對于由于執(zhí)行集入口點而與下游組件分離的上游組件,在執(zhí)行集入口點處分配新的ID字符串,并將其提供給下游組件以用作其ID字符串。上游組件的ID字符串到下游組件的ID字符串的映射(即,父/子映射)被存儲在全局映射數(shù)據(jù)存儲中以供以后使用。
對于由于執(zhí)行集出口點而與下游組件分離的上游組件,上游組件的輸出端口處的ID字符串由執(zhí)行集出口點讀取。然后查詢?nèi)钟成鋽?shù)據(jù)存儲以確定輸出端口處的ID字符串的父ID字符串。將父ID字符串提供給下游組件以用作其ID字符串。
參考圖6,使用上述基于全局映射的分配算法來分析示例性一般二維數(shù)據(jù)處理圖628的一個示例。數(shù)據(jù)處理圖628包括第一數(shù)據(jù)集(D1)632,第一組件(C1)638,第二組件(C2)640,第三組件(C3)645,第四組件(C4)646,第五組件(C5)642,第六組件(C6)644和第二數(shù)據(jù)集(D2)634。在將ID字符串分配給數(shù)據(jù)處理圖表628的各個組件之前,將拓撲排序算法(例如,Kahn算法)應用于數(shù)據(jù)處理圖,得到以下拓撲排序后的順序:D1,C1,C2,C3,C4,C5,C6,D2。
利用確定的拓撲排序后的順序,基于全局映射的分配算法以拓撲排序后的順序遍歷數(shù)據(jù)處理圖的組件,以確定每個組件的適當ID字符串,從而導致發(fā)現(xiàn)“1級”執(zhí)行集630和“2級”執(zhí)行集631(除了根“0級”執(zhí)行集以外)。為了實現(xiàn)兩個執(zhí)行集630、631的發(fā)現(xiàn),基于全局映射的分配算法首先標記最上游組件,具有ID字符串‘0’的第一數(shù)據(jù)集(D1)632。然后基于堆棧的分配算法以拓撲排序后的順序遍歷數(shù)據(jù)處理圖628的組件和鏈路。
基于全局映射的分配算法首先遍歷從第一數(shù)據(jù)集(D1)632到第一組件(C1)638的鏈路。由于第一數(shù)據(jù)集(D1)632的輸出端口是集合型輸出端口,并且第一組件(C1)638的輸入端口是集合型輸入端口,所以沒有標識執(zhí)行集入口點或出口點,并且從第一數(shù)據(jù)集(D1)632的輸出端口讀取第一數(shù)據(jù)集(D1)632的ID字符串(即‘0’)并且將該ID字符串分配給第一組件(C1)638。
然后,分配算法遍歷第一組件(C1)638和第二組件(C2)640之間的鏈路。由于第一組件(C1)638的輸出端口是集合型輸出端口,并且第二組件(C2)640的輸入端口是標量型輸入端口,所以在兩個組件638、640之間標識第一執(zhí)行集入口點639。在第一執(zhí)行集入口點639處,分配新的ID字符串(即,‘1’),并且該ID字符串被分配作為第二組件(C2)640的ID字符串。第一執(zhí)行集入口點639的父ID字符串(即‘0’)到第一執(zhí)行集入口點639的子ID字符串(即‘1’)的映射653被存儲在全局映射數(shù)據(jù)存儲649中以供以后使用。
然后,分配算法遍歷從第二組件(C2)640到第三組件(C3)645的鏈路。由于第二組件(C2)640的輸出端口是集合型輸出端口,并且第三組件645的輸入端口是標量型輸入端口,所以在兩個組件640、645之間標識第二執(zhí)行集入口點641。在第二執(zhí)行集入口點641處,分配新的ID字符串(即,‘2’)并將其分配作為第三組件(C3)645的ID字符串。第二執(zhí)行集入口點641的父ID字符串(即,‘1’)到第二執(zhí)行集入口點641的子ID字符串(即‘2’)的映射651被存儲在全局映射數(shù)據(jù)存儲649中以供以后使用。
然后,分配算法遍歷從第三組件(C3)645到第四組件(C4)646的鏈路。由于第三組件(C3)645的輸出端口是集合型輸出端口,并且第四組件(C4)646的輸入端口是集合型輸入端口,所以未識別執(zhí)行集入口點或出口點,并且從第三組件(C3)645的輸出端口讀取第三組件(C3)645的ID字符串(即,‘2’)645并且將其分配給第四組件(C4)646。
然后,分配算法遍歷從第四組件(C4)646到第五組件(C5)642的鏈路。由于第四組件(C4)646的輸出端口是標量型輸出端口,并且第五組件(C5)642的輸入端口是集合型輸入端口,所以在兩個組件646、642之間識別第一執(zhí)行集出口點647。在第一執(zhí)行集出口點647處,從第四組件(C4)646的輸出端口讀取第四組件(C4)646的ID字符串并且該ID字符串用于查詢?nèi)钟成鋽?shù)據(jù)存儲649。全局映射數(shù)據(jù)存儲649返回與第二執(zhí)行集入口點641相關(guān)聯(lián)地存儲的父子關(guān)系651(即,‘1/2’)。父/子關(guān)系651中的父ID字符串(即,‘1’)被分配作為第五組件(C5)642的ID字符串。
然后,分配算法遍歷從第五組件(C5)642到第六組件(C6)644的鏈路。由于第五組件(C5)642的輸出端口是標量型輸出端口,并且第六組件(C6)644的輸入端口是集合型輸入端口,所以在兩個組件642、644之間識別第二執(zhí)行集出口點643。在第二執(zhí)行集出口點643處,從第五組件(C5)642的輸出端口讀取第五組件(C5)642的ID字符串并且該ID字符串用于查詢?nèi)钟成鋽?shù)據(jù)存儲649。全局映射數(shù)據(jù)存儲649返回與第一執(zhí)行集進入點639相關(guān)聯(lián)存儲的父/子關(guān)系653(即,‘0/1’)。父/子關(guān)系653中的父ID字符串(即,‘0’)被分配作為第六組件(C6)644的ID字符串。
最后,分配算法遍歷從第六組件(C6)644到第二數(shù)據(jù)集(D2)634的鏈路。由于第六組件(C6)644的輸出端口是集合型輸出端口,并且第二數(shù)據(jù)集(D2)634的輸入端口是集合型輸入端口,所以沒有識別執(zhí)行集入口點或出口點,并且從第六組件(C6)644的輸出端口讀取第六組件(C6)644的ID字符串(即‘0’)并且將其分配給第二數(shù)據(jù)集(D2)634。
基于全局映射的分配算法的結(jié)果包括數(shù)據(jù)處理圖628的版本,其中每個組件用ID字符串標記。在圖6的示例中,第一數(shù)據(jù)集(D1)632,第一組件(C1)638,第六組件(C6)644和第二數(shù)據(jù)集(D2)634都用ID字符串‘0’標記。第二組件(C2)640和第五組件(C5)642都用ID字符串‘1’標記。第三組件(C3)645和第四組件(C4)646都用ID字符串‘2’標記。
每個唯一的ID字符串表示執(zhí)行集層級結(jié)構(gòu)中的唯一執(zhí)行集。具有ID字符串‘0’的那些組件被分組到執(zhí)行層級結(jié)構(gòu)中的根“0級”執(zhí)行集629中。具有ID字符串‘1’的那些組件被分組到嵌套在根執(zhí)行集629內(nèi)的“1級”執(zhí)行集630中。具有ID字符串‘2’的那些組件被分組到“2級”執(zhí)行集631,“2級”執(zhí)行集631嵌套在根“0級”執(zhí)行集629內(nèi),并且進一步嵌套在“1級”執(zhí)行集630內(nèi)。
2.3用戶定義的執(zhí)行集
在上述示例中,(多個)分配算法用于自動發(fā)現(xiàn)存在于數(shù)據(jù)處理圖中的執(zhí)行集,而無需任何用戶干預。然而,在一些示例中,用戶可能需要除了由分配算法提供的功能之外的功能。在這種情況下,用戶可以明確地添加執(zhí)行集入口點和出口點,以明確定義執(zhí)行集開始和/或結(jié)束的位置。參考圖7,數(shù)據(jù)處理圖776包括第一數(shù)據(jù)集774,第一組件778,第二組件780和第二數(shù)據(jù)集790。將上述分配算法應用于數(shù)據(jù)處理圖776將導致發(fā)現(xiàn)包括第一組件778和第二組件780的單個執(zhí)行集。然而,在這種情況下,用戶已明確定義了用于數(shù)據(jù)處理圖776的兩個執(zhí)行集(即,第一執(zhí)行集782和第二執(zhí)行集786)。具體地,用戶已經(jīng)將執(zhí)行集出口點組件784插入到從第一組件778的輸出端口出來的鏈路中,并且已經(jīng)將執(zhí)行集入口點788插入到進入第二組件780的輸入端口的鏈路中。通過將執(zhí)行集出口點784和執(zhí)行集入口點788添加到第一組件778和第二組件780之間的鏈路,用戶實質(zhì)上已經(jīng)將原本單個執(zhí)行集分解為兩個單獨的執(zhí)行集782、786。
在一些示例中,用戶為數(shù)據(jù)處理圖定義所有執(zhí)行集入口點和出口點。在其他示例中,用戶定義一些執(zhí)行集入口點和出口點,然后將其留給分配算法以發(fā)現(xiàn)數(shù)據(jù)處理圖的其余執(zhí)行集入口點和出口點。
2.4相同集關(guān)系
在一些示例中,用戶可能希望明確地指定給定組件屬于哪個執(zhí)行集。例如,如圖8A所示,數(shù)據(jù)處理圖892包括從創(chuàng)建數(shù)據(jù)組件896和讀表組件898接收數(shù)據(jù)元素的第一執(zhí)行集894。這些組件類似于輸入文件組件,不同之處在于它們具有用于它們提供的數(shù)據(jù)元素的集合的不同的源。對于創(chuàng)建數(shù)據(jù)組件896,沒有用來指定文件位置的標量輸入端口,而是存在用來指定多個記錄數(shù)據(jù)元素將如何產(chǎn)生的(可選的)標量輸入端口,并且還存在用來指定每個數(shù)據(jù)元素將如何生成的參數(shù)。對于讀表組件898,沒有用來指定文件位置的標量輸入端口,而是存在用來指定數(shù)據(jù)庫中的表的(可選的)標量輸入端口。第一執(zhí)行集894包括第一組件891和第二組件893,它們一起處理來自創(chuàng)建數(shù)據(jù)組件896和讀表組件898的數(shù)據(jù)元素,以生成提供給第一數(shù)據(jù)集899的輸出。
在圖8A中,讀表組件898在第一執(zhí)行集894外部,意味著它運行一次,并從其集合型輸出端口輸出數(shù)據(jù)元素的集合。數(shù)據(jù)元素的集合遍歷第一執(zhí)行集894的邊界,并被提供給第一組件891上的集合型輸入端口。對于執(zhí)行集894中的組件的每個并行實例,在第一組件891上的集合型輸入端口處創(chuàng)建數(shù)據(jù)元素集合的副本。通常,無論鏈路來自集合端口、標量端口還是控制端口,被分配給不同執(zhí)行集的組件之間的鏈路將數(shù)據(jù)元素或控制元素復制到流入執(zhí)行集的鏈路的所有實例,并且從流出執(zhí)行集的鏈路的所有實例聚集數(shù)據(jù)元素或控制元素。數(shù)據(jù)元素被聚集成集合,并且控制元素被聚集成向量,該向量可以根據(jù)下游組件的控制邏輯被適當?shù)靥幚?包括可能將其標示為錯誤)。
參考圖8B,在一些示例中,用戶可以要求對執(zhí)行集894中的組件的每個并行實例執(zhí)行讀表組件898。為了實現(xiàn)該功能,用戶可以在讀表組件898和第一組件891之間指定“相同集”關(guān)系。作為用戶指定“相同集”關(guān)系的結(jié)果,讀表組件898被移動到與第一組件891相同的執(zhí)行集(即,第一執(zhí)行集894)。由于讀表組件898被包括在第一執(zhí)行集894中,所以第一執(zhí)行集894中的組件的每個并行實例執(zhí)行讀表組件898的實例。
在一些示例中,用戶可以通過從與源執(zhí)行集相關(guān)聯(lián)的菜單選擇目標執(zhí)行集,或者通過將組件從源執(zhí)行集拖動到目標執(zhí)行集(例如,經(jīng)由下面更詳細描述的用戶界面)來指定“相同集”關(guān)系。在一些示例中,實施錯誤檢查以驗證被拖拽的組件可以合法地位于目標執(zhí)行集中。例如,可以在要彼此具有“相同集”關(guān)系的任何兩個組件上強加的一個可能的要求是,必須具有通過數(shù)據(jù)處理圖的包括這些組件的至少一個路徑。
2.5集合數(shù)據(jù)復制
在一些示例中,執(zhí)行集中的多個組件可以各自具有經(jīng)由執(zhí)行集入口點連接到上游組件的單個集合輸出端口的標量輸入端口。類似地,執(zhí)行集中的多個組件可以各自具有連接到執(zhí)行集下游的組件的單個集合輸入端口的標量輸出端口。
在一些示例中,為了從多個組件的集合型輸出端口向標量輸入端口提供相同的數(shù)據(jù),執(zhí)行集入口點從集合為每個標量輸入端口創(chuàng)建每個數(shù)據(jù)元素的復制本,并且將復制本提供到它們相應的標量輸入端口。類似地,為了合并由多個組件的標量輸出端口(來自執(zhí)行集的不同的相應迭代)輸出的數(shù)據(jù),執(zhí)行集出口點可以從多個標量輸出端口接收輸出數(shù)據(jù)元素,合并輸出數(shù)據(jù)元素,然后將合并的輸出數(shù)據(jù)元素提供到下游組件的集合輸入端口。通常,下游組件的集合輸入端口被配置為處理合并的數(shù)據(jù)元素。
如圖9所示,數(shù)據(jù)處理圖923包括第一數(shù)據(jù)集924,第二數(shù)據(jù)集926和執(zhí)行集928。執(zhí)行集928包括兩個組件:第一組件930和第二組件932。第一數(shù)據(jù)集924具有集合輸出端口934,其連接到執(zhí)行集928的執(zhí)行集入口點936并向其提供數(shù)據(jù)元素的集合。第二數(shù)據(jù)集926具有集合輸入端口938,集合輸入端口938連接到執(zhí)行集合928的執(zhí)行集出口點940并從其接收數(shù)據(jù)元素的集合。
在執(zhí)行集928內(nèi),第一組件930具有第一標量輸入端口942,并且第二組件932具有第二標量輸入端口944。第一標量輸入端口942和第二標量輸入端口944均連接到執(zhí)行集入口點936并從該執(zhí)行集入口點936接收各個數(shù)據(jù)元素。如上文所述,執(zhí)行集入口點936復制從集合輸出端口934接收的數(shù)據(jù)元素,以向連接到執(zhí)行集入口點936的每個標量輸入端口提供數(shù)據(jù)元素集合的每個數(shù)據(jù)元素的復制本。在圖9中,執(zhí)行集入口點936創(chuàng)建每個數(shù)據(jù)元素的兩個復制本,并將其中一個復制本提供給第一標量輸入端口942,將另一個復制本提供給第二標量輸入端口944。從圖中可以看出,在一些示例中,圖形用戶界面中的執(zhí)行集入口點936的可視表示提供了由執(zhí)行集入口點936創(chuàng)建了數(shù)據(jù)元素的多少復制本的表示。此外,在其他示例中,表示復制本的不同副本的不同入口點指示符可以被分離,并且圍繞執(zhí)行集的邊界分布為與執(zhí)行集內(nèi)需要從饋送給該執(zhí)行集的集合輸出端口提供的每個復制的數(shù)據(jù)元素的副本的組件一樣多的組件。
第一組件930和第二組件932處理它們各自的數(shù)據(jù)元素,并且經(jīng)由標量輸出端口946、948將它們各自處理后的數(shù)據(jù)元素提供給執(zhí)行集出口點940。在一些示例中,執(zhí)行集出口點940將處理后的數(shù)據(jù)元素分組成對,將處理后的數(shù)據(jù)元素對輸出到第二數(shù)據(jù)集926的集合輸入端口938。從圖中可以看出,在一些示例中,圖形用戶界面中的執(zhí)行集出口點940的可視表示提供了關(guān)于由執(zhí)行集入口點936分組了多少數(shù)據(jù)元素的復制本的表示。
2.6資源鎖定
在一些示例中,給定執(zhí)行集中的組件可以在并行實例中運行多次。在一些示例中,并行運行實例的組件可能需要訪問共享資源。為了防止競爭情況以及與訪問共享資源的多個進程相關(guān)的其他問題,可以使用鎖定機制(latching mechanism)。通常,鎖定機制允許執(zhí)行集中的組件的一個實例在共享資源上獲得時長為該實例完成運行時間的運行時鎖定。在實例使共享資源鎖定期間,只有實例中的組件才能訪問該共享資源,并且其他實例的組件必須等待鎖定被解除。實例完成后,它會解除運行時鎖定,從而允許其他實例訪問共享資源。鎖定機制必須在單個執(zhí)行集內(nèi)鎖定和解鎖共享資源(例如,使用上游端處的顯式鎖定組件和下游端處的顯式解鎖組件)。在一些實施例中,這樣的“鎖定的執(zhí)行集”不能被嵌套,也不能彼此重疊。
2.7其他
注意,雖然基于全局映射的分配算法是關(guān)于二維數(shù)據(jù)處理圖描述的,但是也可以使用該算法來發(fā)現(xiàn)一維數(shù)據(jù)處理圖的執(zhí)行集。
通常,執(zhí)行集可以任意嵌套。
通常,執(zhí)行集具有為執(zhí)行集的每個實例從鏈接的輸出集合端口接收到的至多一個驅(qū)動數(shù)據(jù)元素。然而,如果跨越執(zhí)行集的邊界顯式地或隱式地復制相同的數(shù)據(jù)元素,則多個標量輸入端口可以接收該相同的數(shù)據(jù)元素。
通常,具有跨越執(zhí)行集的邊界的鏈路的所有輸出標量端口具有來自執(zhí)行集的多個實例中的每一個的所有數(shù)據(jù)元素,這些數(shù)據(jù)元素被聚集到提供給鏈接的輸入采集端口的同一集合中。但是,如果執(zhí)行集僅具有單個實例,則具有跨越執(zhí)行集的邊界的鏈路的輸出標量端口可以鏈接到輸入標量端口。
通常,相同類型的兩個端口之間的鏈路可以遍歷執(zhí)行集邊界,假設執(zhí)行集的遍歷不會導致數(shù)據(jù)處理圖中的任何循環(huán)。
在一些示例中,默認地為每個執(zhí)行集分配唯一標識符(例如,‘1’)。在其他示例中,每個執(zhí)行集可以被分配執(zhí)行集ID路徑(例如,‘1/3/6’)。在一些示例中,用戶明確地提供執(zhí)行集ID字符串。執(zhí)行集ID字符串不一定是唯一的。在執(zhí)行集ID字符串不是唯一的情況下,執(zhí)行集ID字符串可以與其父、祖父節(jié)點等的執(zhí)行集ID字符串組合,從而形成唯一的ID字符串。
在一些示例中,基于全局映射的分配算法導致組件被分配對應于最深嵌套執(zhí)行集的ID字符串。在一些示例中,當為執(zhí)行集被分配了執(zhí)行集ID路徑時,執(zhí)行集ID路徑不一定是唯一的。為了補償執(zhí)行集ID路徑不唯一的情況,對執(zhí)行集ID路徑施加約束,要求給定執(zhí)行集上游的執(zhí)行集ID路徑必須是“兼容的”,其中兩個執(zhí)行集ID路徑是兼容當且僅當它們是相同的,或者一個是另一個的適當前綴。例如:
·/1/2/3和/1/2/3兼容
·/1/2/3和/1/2兼容
·/1/2和/1/2/3兼容
·1/2/3和/1兼容
·1/2/3和1/4不兼容
·/1/2/3和/1/4/5不兼容
上述實施例基本上沒有對標量塊的實例的執(zhí)行強加排序/并發(fā)約束。但是,在一些實施例中,提供其他輸入以控制從饋送給執(zhí)行集的集合接收的數(shù)據(jù)元素的子集的允許并發(fā)性和所需串行化。在一些實施例中,可以對數(shù)據(jù)元素的一些子集強加根據(jù)部分排序的順序處理。
在默認情況下,執(zhí)行集的實例可以完全并行地運行。然而,在一些情況下,用戶可能期望不同的行為。例如,如果正在處理的數(shù)據(jù)是帳戶級數(shù)據(jù),則用戶可能希望對每個帳戶內(nèi)的數(shù)據(jù)強制某些限制。例如,用戶可能想強制串行執(zhí)行。在這種情況下,可以允許跨帳戶的任何并行度,但是不能同時(即,并發(fā)地)處理同一帳戶的兩個數(shù)據(jù)元素。可選地,附加限制可以是有序處理,使得相同帳戶的兩個數(shù)據(jù)元素不得根據(jù)由鍵限定的順序或者通過例如接收的順序來進行無序處理。
為了實現(xiàn)這一點,可以為執(zhí)行集提供串行化鍵。具有相同串行化鍵值的所有數(shù)據(jù)元素必須串行處理,并且在某些情況下必須按照明確定義的順序處理。運行時系統(tǒng)對具有相同串行化鍵的數(shù)據(jù)元素強制串行執(zhí)行的一種方式是通過串行化鍵來對執(zhí)行集實例進行分區(qū):將其驅(qū)動數(shù)據(jù)元素具有特定串行化鍵(或串行化鍵的哈希值)的實例分配為在特定計算節(jié)點152上執(zhí)行。在運行時,系統(tǒng)可以通過掃描數(shù)據(jù)元素的集合來確保工作均勻分布在多個計算節(jié)點152上,以確??蛇\行任務的隊列保持充滿。在不需要明確定義的順序(例如在集合中)的情況下,順序可以是與它們從輸出端口(甚至集合輸出端口)產(chǎn)生的順序相同的順序,或者與控制串行化鍵組內(nèi)的處理順序的不同的校對鍵相關(guān)聯(lián)的順序相同的順序。在一些情況下,可以通過提供預定義的值作為串行化鍵來強制執(zhí)行集完全串行運行。
在一些實施例中,可以表面保持順序被保留,即使沒有嚴格根據(jù)該順序?qū)嵤┨幚硪彩侨绱恕H绻麍?zhí)行集的輸入和輸出兩者處的數(shù)據(jù)與特定順序(例如,向量內(nèi)的元素的順序)相關(guān)聯(lián),則用戶可能希望保留該順序。即使在數(shù)據(jù)元素的處理中沒有串行化,也可以例如使用處理數(shù)據(jù)元素時與數(shù)據(jù)元素一起攜帶的排序鍵來對輸出數(shù)據(jù)元素進行排序,以恢復與對應的一組輸入數(shù)據(jù)元素相關(guān)聯(lián)的排序??商娲?,并行產(chǎn)生的輸出數(shù)據(jù)元素可以以與它們進入執(zhí)行集的順序相同的順序合并,而不一定需要實施顯式排序操作。
與為執(zhí)行集準備的執(zhí)行代碼相關(guān)聯(lián)的各種計算特性可以由編譯器/解釋器120來配置,可以有或沒有來自用戶的輸入。例如,上述用于指示如何實施與特定執(zhí)行集內(nèi)的組件相對應的任務的嵌入信息可以包括以下任何內(nèi)容。所述信息可以包括指示任務將完全串行執(zhí)行(即,沒有并行性)的編譯器注釋。所述信息可以包括指示以與排序約束所允許的并行性一樣多的并行性來實施任務的編譯器注釋。所述信息可以包括指示與相同鍵值相關(guān)的任務被串行執(zhí)行并且與不同鍵值相關(guān)的任務被并行執(zhí)行的編譯器注釋(即,如上所述按鍵串行化)。
編譯器注釋或修改符可以用于指示各種計算特性中的任何一種:
·并發(fā)性(例如,如上所述的并行、串行、按鍵串行)
·不同執(zhí)行集之間的優(yōu)先性(precedence)(例如,一個執(zhí)行集的所有任務發(fā)生在另一執(zhí)行集的所有任務之后)
·事務性(例如,執(zhí)行集的任務作為數(shù)據(jù)庫事務(database transaction)處理)
·資源鎖定(例如,執(zhí)行集的任務通過特定資源(例如共享變量)實施,鎖住,允許任務將資源作為原子單元訪問)
·排序(例如,保留數(shù)據(jù)元素之間的排序)
·元組大小(例如,將由執(zhí)行集的每個實例操作的數(shù)據(jù)元素的數(shù)量)
編譯器/解釋器120可以基于自動分析作為整體的執(zhí)行集或數(shù)據(jù)處理圖的屬性,和/或基于接收來自用戶的輸入(例如,圖中的用戶注釋)確定這些特性。例如,如果在執(zhí)行集中引用鍵值,則編譯器注釋可以指示按鍵串行化。如果在執(zhí)行集內(nèi)使用資源,則編譯器修改符可以在該執(zhí)行集之前/之后允許鎖定/解鎖該資源。如果在執(zhí)行集內(nèi)存在數(shù)據(jù)庫操作,則執(zhí)行集的每個實例可以被配置為作為數(shù)據(jù)庫事務執(zhí)行。如果可以在編譯時確定可用的核的數(shù)量,則編譯器注釋可以指示每個核將對由數(shù)量為等于集合的總大小除以核的數(shù)量的數(shù)據(jù)項組成的數(shù)據(jù)項元組執(zhí)行執(zhí)行集的實例。
編譯器注釋和修改符可以被添加到以目標語言準備的代碼,諸如合適的高級語言(例如,DML)或低級可執(zhí)行代碼,或數(shù)據(jù)處理圖的目標中間形式。例如,編譯器/解釋器120可以將組件插入到明確指示到執(zhí)行集的入口點或出口點的數(shù)據(jù)處理圖中,或者用來開始/結(jié)束事務的組件可以放置在用于處理事務的組件集的入口/出口點,或者組件可以用于鎖定/解鎖資源。可替代地,編譯器/解釋器120可以將修改符添加為修改類型的數(shù)據(jù)流鏈路。
3數(shù)據(jù)處理圖的用戶界面
在一些示例中,用戶界面允許用戶通過將組件拖動到畫布上并使用鏈路將組件的端口連接在一起來開發(fā)數(shù)據(jù)處理圖。在一些示例中,用戶界面在用戶開發(fā)數(shù)據(jù)處理圖時重復地將上述分配算法應用于數(shù)據(jù)處理圖。例如,當用戶向正在開發(fā)的數(shù)據(jù)處理圖中添加組件時,分配算法可以應用于具有被添加組件的圖。然后可以將由分配算法發(fā)現(xiàn)的結(jié)果執(zhí)行集顯示為例如圍繞用戶界面中的組件繪制的框,或者顯示為包圍組件的任意形狀的區(qū)域,其可以通過用于在同一執(zhí)行集中呈現(xiàn)包含多個組件的區(qū)域的唯一的顏色、陰影、紋理或標記來區(qū)分。在一些示例中,用戶然后可以通過向執(zhí)行集添加組件或從執(zhí)行集中去除組件來修改由分配算法發(fā)現(xiàn)的執(zhí)行集。在一些示例中,分配算法驗證修改后的執(zhí)行集是合法的。例如,各種端口之間可以存在組件和鏈路的一些配置,其可以潛在地以各種合法方式中的任一種劃分為多個執(zhí)行集。在這樣的模糊情況下,分配算法可以默認地選擇執(zhí)行集的一個分配,但是用戶可能已經(jīng)期望進行執(zhí)行集的不同分配,在這種情況下,用戶可以修改分配(例如,通過插入出口點以在組件鏈中更早地關(guān)閉執(zhí)行集)??商娲?,分配算法可以被配置為識別其中可能有多個合法分配的模糊配置,并且提示用戶輸入以選擇一個配置。
參考圖10A,用戶已將三個組件(第一數(shù)據(jù)集1022,第一計算組件1024和第二數(shù)據(jù)集1026)拖動到數(shù)據(jù)處理圖開發(fā)用戶界面的畫布1028上。用戶還沒有使用鏈路將組件1022、1024、1026的端口連接在一起,并且分配算法尚未在數(shù)據(jù)處理圖中發(fā)現(xiàn)任何執(zhí)行集(除了根執(zhí)行集)。
參考圖10B,當用戶用鏈路將組件1022、1024、1026的端口連接在一起時,分配算法自動發(fā)現(xiàn)第一執(zhí)行集1030,第一執(zhí)行集1030包括第一計算組件1024。通過用戶界面將第一執(zhí)行集1030顯示給用戶。當用戶繼續(xù)向圖中添加組件和鏈路時,分配算法自動發(fā)現(xiàn)執(zhí)行集,并通過用戶界面顯示執(zhí)行集。
參考圖10C,在一些示例中,用戶可能需要打破鏈路(例如,將另一組件插入到鏈路中)。在這樣的示例中,如果分配算法被允許重新分析數(shù)據(jù)處理圖,則第一執(zhí)行集1030將被去除,可能導致用戶的工作中斷和丟失。
為了避免這種中斷,當用戶從數(shù)據(jù)處理圖中去除流或組件時,可以不執(zhí)行分配算法,而是保持其余組件及它們的執(zhí)行集關(guān)聯(lián)未受影響。例如,在圖10C中,其輸入和輸出端口斷開,第一組件1024仍然包括在第一執(zhí)行集1030中。在一些示例中,當斷開的組件被重新連接時,則允許分配算法自動地發(fā)現(xiàn)和顯示與重新連接的組件相關(guān)聯(lián)的任何執(zhí)行集。
在一些示例中,如果數(shù)據(jù)處理圖的組件不具有明確的(例如,用戶定義的)執(zhí)行集指定,則允許分配算法發(fā)現(xiàn)組件屬于哪個執(zhí)行集。否則,如果組件具有明確的用戶定義的執(zhí)行集指定,則不允許分配算法選擇該組件包括在哪個執(zhí)行集中。例如,如果用戶將組件手動移動到給定的執(zhí)行集中,則不允許分配算法將該組件包括在除用戶指定的執(zhí)行集之外的任何執(zhí)行集中。也就是說,對數(shù)據(jù)處理圖的任何用戶修改不能被分配算法重寫(overridden)。
在一些示例中,用戶界面允許用戶使用手勢或通過輸入設備進行的其他交互來將組件提升到給定執(zhí)行集中和/或?qū)⒔M件從給定執(zhí)行集中降級。在一些示例中,用戶可以使用菜單選項或其他提示來提升或降級組件。在其他示例中,用戶可以簡單地將組件拖動到用戶界面中的期望執(zhí)行集中。
在一些示例中,用戶界面允許用戶為數(shù)據(jù)處理圖中的執(zhí)行集指定一個或多個約束。例如,用戶可以將執(zhí)行約束為在給定時間并行運行不超過N次。
在一些示例中,編譯器/解釋器120接收包括手動定義的執(zhí)行集和由分配算法發(fā)現(xiàn)的執(zhí)行集的混合的數(shù)據(jù)處理圖的表示。
在一些示例中,用戶可以使用界面定義另一類型的執(zhí)行集,稱為啟用/禁止執(zhí)行集。例如,用戶可以圍繞他們希望被包括在啟用/禁止執(zhí)行集中的一個或多個組件繪制框。啟用/禁止執(zhí)行集包括一個或多個組件并且具有標量輸入端口。如果上游組件的標量輸出端口向啟用/禁止執(zhí)行集的標量輸入端口提供一個數(shù)據(jù)元素,則允許啟用/禁止執(zhí)行集中的組件執(zhí)行。如果上游組件的標量輸出端口向啟用/禁止執(zhí)行集的標量輸入端口提供零數(shù)據(jù)元素,則啟用/禁止執(zhí)行集中包括的組件被禁止。任何執(zhí)行集(包括啟用/禁止執(zhí)行集)可以包括控制輸入和輸出端口,其可用于確定整個執(zhí)行集是否將被執(zhí)行以及是否將控制信號傳播到其他組件或執(zhí)行集。如果執(zhí)行集被并行化(即具有多個實例),則在執(zhí)行任何實例之前必須激活輸入控制端口,并且在所有實例完成執(zhí)行之后激活輸出控制端口。在一些示例中,通過將端口的可視表示放置在執(zhí)行集的邊界上來提供這些輸入和輸出控制端口。在其他示例中,通過將這些輸入和輸出控制端口放置在執(zhí)行集前方的附加組件上來提供這些輸入和輸出控制端口。例如,該附加的“對于所有組件”可以(例如,由用戶界面自動地或由用戶手動地)插入在上游集合輸出數(shù)據(jù)端口和入口點指示符之間,或者代替入口點指示符(即,在上游集合輸出數(shù)據(jù)端口和驅(qū)動輸入標量數(shù)據(jù)端口之間)。
如上文參照圖7注意到的,在一些示例中,用戶可以通過沿著數(shù)據(jù)處理圖的流放置執(zhí)行集入口點和出口點組件來明確地定義執(zhí)行集入口點和出口點。
在一些示例中,用戶界面提供實時反饋以在他們的圖包括非法操作時通知用戶。例如,如果存在由在用戶指定的執(zhí)行集中的組件引起的沖突,則分配算法可以通過用戶界面向用戶發(fā)出警告。為了提供實時反饋,分配算法將驗證規(guī)則應用于數(shù)據(jù)處理圖以通知用戶數(shù)據(jù)處理圖是否合法。參考圖11A,非法數(shù)據(jù)處理圖配置1195的一個示例包括兩個數(shù)據(jù)源:將數(shù)據(jù)元素的第一集合饋送到第一執(zhí)行集1197中的第一組件1102的標量端口的第一數(shù)據(jù)源1191,以及將數(shù)據(jù)元素的第二集合饋送到第二執(zhí)行集1199中的第二組件1104的標量端口的第二數(shù)據(jù)源1198。第二執(zhí)行集1199輸出數(shù)據(jù)元素的第三集合,然后該第三集合被輸入到第一執(zhí)行集1197中的第三組件1106的標量數(shù)據(jù)端口。由于兩個不同的數(shù)據(jù)元素的集合連接到第一執(zhí)行集1197中的不同標量端口,所以沒有辦法知道應該實例化第一執(zhí)行集1197中的組件的多少并行實例(因為針對存在于第一執(zhí)行集1197的邊界處的每個數(shù)據(jù)元素生成組件的一個實例)。在一些示例中,通過在例如第二組件1104上顯示錯誤指示符1108來通知用戶此沖突。
參考圖11B,非法數(shù)據(jù)處理配置1110的另一示例包括將數(shù)據(jù)元素的集合饋送到第一執(zhí)行集1116中的第一組件1114的標量輸入端口的數(shù)據(jù)源1112。第一組件1114的標量輸出將其輸出作為數(shù)據(jù)的集合提供到第一執(zhí)行集1116外部的第二組件1118的集合端口。第二組件1118從集合型輸出端口將數(shù)據(jù)元素的集合提供到第一執(zhí)行集1116中的第三組件1120的標量數(shù)據(jù)端口。
通過從第一執(zhí)行集1116外的第一組件1114的集合型輸出端口傳遞數(shù)據(jù)元素的集合,在第二組件1118處處理數(shù)據(jù)元素的集合,然后將處理后的數(shù)據(jù)元素的集合傳遞回第三組件1120的標量端口,定義了“執(zhí)行集循環(huán)”。
通常,執(zhí)行集循環(huán)是非法的,因為它們不利于執(zhí)行排序。例如,通常允許具有進入執(zhí)行集或離開執(zhí)行集的附加流,因為對于輸入而言,輸入數(shù)據(jù)可以在執(zhí)行集被執(zhí)行之前得到緩存,對于輸出而言,輸出數(shù)據(jù)可以在執(zhí)行集完成執(zhí)行之后被聚集。但是,如果需要外部組件在執(zhí)行集之前和之后運行,則這是不可能的。
在一些示例中,通過在一個或多個組件上顯示錯誤指示符1108來通知用戶執(zhí)行集循環(huán)。
在一些示例中,如果每個執(zhí)行集入口點與至少一個對應的執(zhí)行集出口點不匹配,則數(shù)據(jù)處理圖被認為是非法的??商娲兀哂腥肟邳c但沒有對應出口點的執(zhí)行集可以被允許作為用戶定義的執(zhí)行集,即使其不會被分配算法自動識別。在這些情況下,在(一個或多個)最下游組件完成執(zhí)行之后,執(zhí)行集可以結(jié)束(而不提供任何輸出數(shù)據(jù)元素)。在一些示例中,如果每個鎖定操作不與對應的解鎖操作匹配,則數(shù)據(jù)處理圖被認為是非法的。可替代地,如果沒有明確指定,則可以推斷解鎖操作,并且如果推斷的解鎖操作將需要在與鎖定操作不同的執(zhí)行集中,則僅指示為非法。在一些示例中,如果鎖定操作及其對應的解鎖操作不存在于同一執(zhí)行集中,則數(shù)據(jù)處理圖被認為是非法的。
4控制圖的狀態(tài)機
在為執(zhí)行準備數(shù)據(jù)處理圖的過程中,編譯器/解釋器120還在控制圖生成過程中生成控制圖。在一些實現(xiàn)方式中,生成控制圖包括生成用于執(zhí)行與各個組件相對應的任務的可執(zhí)行代碼和與確定任務之間的數(shù)據(jù)流和控制流的各種組件間鏈路相對應的代碼。這包括由編譯器/解釋器120發(fā)現(xiàn)的執(zhí)行集的層級結(jié)構(gòu)中的數(shù)據(jù)傳送和控制傳送。
生成這樣的可執(zhí)行代碼的一部分包括在一些數(shù)據(jù)結(jié)構(gòu)表示中為每個執(zhí)行集生成對應的控制圖,包括任何啟用/禁止執(zhí)行集。執(zhí)行集內(nèi)的任何嵌套執(zhí)行集被視為表示該嵌套執(zhí)行集的單個組件,用于生成控制圖。此代表性組件的端口對應于嵌套執(zhí)行集內(nèi)連接到跨越嵌套執(zhí)行集邊界的鏈路的組件的端口。編譯器/解釋器120然后將使用該控制圖來生成控制代碼。這個生成的控制代碼有效地實現(xiàn)了在運行時控制執(zhí)行的狀態(tài)機。特別地,一旦執(zhí)行開始,則該生成的控制代碼控制組件或端口何時從該狀態(tài)機的一個狀態(tài)轉(zhuǎn)換到另一個狀態(tài)。
圖12A示出了編譯器/解釋器120如何將根執(zhí)行集的第一組件對1202和第二組件對1204組合成控制圖1206的示例。在該示例中,第一組件對1202包括由相應集合數(shù)據(jù)端口1212、1214連接的第一組件1208和第二組件1210。第二組件對1204包括由相應標量數(shù)據(jù)端口1220、1222連接的第三組件1216和第四組件1218。
編譯器/解釋器120通過添加開始組件1224和完成組件1226并且按照數(shù)據(jù)處理圖的拓撲的指示將組件連接到開始組件1224和完成組件1226來創(chuàng)建控制圖。開始組件和完成組件不執(zhí)行任何計算任務,但編譯器/解釋器120將使用開始組件和完成組件來管理控制信號,該控制信號將用于開始某些組件的執(zhí)行并確定執(zhí)行集中的所有組件何時已完成執(zhí)行。
為了確定特定組件是否需要連接到開始組件1224,編譯器/解釋器120檢查至該組件的輸入,以基于到上游串行端口的現(xiàn)有鏈路確定該組件是否沒有被指定開始執(zhí)行,如上所述,上游串行端口包括控制端口和標量端口。
例如,如果組件沒有至其控制輸入端口的鏈路,則它可能永遠不會開始執(zhí)行,因為將永遠不會有控制信號來指示它開始。另一方面,即使沒有控制輸入,也可能取決于組件具有的數(shù)據(jù)輸入的類型,針對數(shù)據(jù)的到達而觸發(fā)該組件的執(zhí)行。例如,如果組件具有標量輸入端口,則即使在其控制輸入端口處沒有控制信號,一旦該組件在其標量輸入端口處看到數(shù)據(jù),該組件仍將開始執(zhí)行。另一方面,如果組件只有集合數(shù)據(jù)輸入,那么這種情況不會發(fā)生。如果這樣的組件不具有用來觸發(fā)執(zhí)行的控制輸入或標量數(shù)據(jù)輸入,則它將需要至開始組件1224的連接。
在圖12A的上下文中,第一組件1208既不具有控制輸入也不具有標量數(shù)據(jù)輸入。因此,第一組件1208將無法自己開始執(zhí)行。因此,第一組件1208必須鏈接到開始組件1224。第三組件1216同樣既不具有控制輸入也不具有標量數(shù)據(jù)輸入。因此,第三組件1216也必須鏈接到開始組件1224。
第四組件1218沒有控制輸入。但是它被連接以從第三組件1216接收標量數(shù)據(jù)輸入。因此,它將在通過其輸入標量端口1222接收到數(shù)據(jù)時開始執(zhí)行。因此,第四組件1218不需要連接到開始組件1224。
第二組件1210被配置為從第一組件1208接收數(shù)據(jù)。然而,在輸入集合端口1214而不是在輸入標量端口處接收該數(shù)據(jù)。結(jié)果,類似于第一組件,第二組件1210也必須連接到開始組件1224。
編譯器/解釋器120還需要識別哪些組件將需要連接到完成組件1226。
通常,當組件缺少控制輸出鏈路或(任何類型的)數(shù)據(jù)輸出鏈路時,將組件連接到完成組件1226。在圖12A的左側(cè)的圖中,僅第二組件1210和第四組件1218滿足該條件。因此,如圖12A的右側(cè)所示,僅這兩個組件連接到完成組件1226。
圖12B類似于圖12A,不同的是在圖的左側(cè)的第一組件1208和第三組件1216之間存在控制鏈路。與規(guī)則一致,不再需要在得到的替代控制圖1206'中將第三組件1216連接到開始組件1224。
控制圖有效地定義分布式狀態(tài)機,其中組件及其串行端口響應于上游組件和串行端口發(fā)生的轉(zhuǎn)換從一個狀態(tài)轉(zhuǎn)換到另一個狀態(tài)。通常,上游組件將從一個狀態(tài)轉(zhuǎn)換到另一個狀態(tài),導致其輸出串行端口轉(zhuǎn)換,這使得下游組件的鏈接串行輸入端口轉(zhuǎn)換,這使得這些下游組件轉(zhuǎn)換,等等。下面參照用于組件及其串行端口的狀態(tài)轉(zhuǎn)換圖更詳細地描述用于實現(xiàn)該行為的特定類型的狀態(tài)機的一個示例。
為了提供對狀態(tài)機的轉(zhuǎn)換的控制,編譯器/解釋器120移植額外的控制代碼到用于執(zhí)行由特定組件表示的任務的代碼中。如本文所使用的,“移植(graft)”意指前附、后附或既前附又后附的控制代碼。前附的控制代碼在本文被稱為“前序(prologue)”代碼,而后附的控制代碼被稱為“結(jié)束(epilogue)”代碼。組件的前序代碼在組件執(zhí)行其任務之前執(zhí)行。組件的結(jié)束代碼在組件610A已經(jīng)完成執(zhí)行其任務之后執(zhí)行。
移植的控制代碼檢查所存儲的狀態(tài)信息,例如累加器的值(例如,計數(shù)器倒計數(shù)到指示輸入已為調(diào)用組件準備就緒的值)或標志的狀態(tài)(例如,設置為指示組件已被禁止的值的標志),以確定是否使一個或多個下游組件執(zhí)行其相應的任務。
在一個實施例中,前序代碼監(jiān)視上游輸出串行端口的狀態(tài),并更新組件的輸入串行端口的狀態(tài)和組件的狀態(tài),而結(jié)束代碼在組件完成實施其任務之后更新組件的輸出串行端口。
在另一個實施例中,代替監(jiān)視上游輸出串行端口的下游組件的前序代碼,上游組件的結(jié)束代碼更新下游輸入串行端口的集合狀態(tài),并監(jiān)視該集合狀態(tài)以觸發(fā)下游組件的前序代碼在適當?shù)臅r間(例如當初始化為輸入串口數(shù)量的計數(shù)器達到零時)執(zhí)行。可替代地,代替計數(shù)器從輸入端口的數(shù)量倒計數(shù)(或向上計數(shù)到輸入端口的數(shù)量),可以使用另一形式的累加器來存儲用于觸發(fā)組件的狀態(tài)信息,例如存儲表示不同組件的不同端口的狀態(tài)的位的位圖。
作為該移植的控制代碼的結(jié)果,基于在特定組件的執(zhí)行開始和結(jié)束時一個或多個上游邏輯狀態(tài)的集合的發(fā)生,任務的完成自動導致以與由控制圖表示的數(shù)據(jù)控制依賴性一致的方式、并且以允許多個組件的并發(fā)操作并且允許使用條件控制邏輯來控制的方式自動執(zhí)行其他任務。
圖13A和圖13B示出了可用于組件(圖13A的狀態(tài)轉(zhuǎn)換圖1300)和其串行端口(圖13B的狀態(tài)轉(zhuǎn)換圖1310)的示例性狀態(tài)機的狀態(tài)轉(zhuǎn)換圖。這兩個狀態(tài)轉(zhuǎn)換圖是類似的,不同之處在于,由于活動狀態(tài)1304與正在進行的執(zhí)行相關(guān)聯(lián),并且由于只有組件而不是端口實施執(zhí)行,所以只有組件可以處于活動狀態(tài)1304。
將描述兩個狀態(tài)轉(zhuǎn)換圖的所有可能狀態(tài),以及遵循狀態(tài)之間的每個轉(zhuǎn)換所需的條件,需要參考圖13A和圖13B。在狀態(tài)轉(zhuǎn)換圖的此描述中涉及的所有輸入和輸出端口均是串行端口,因為控制圖中的組件僅需要鏈接串行端口(而不是集合端口)。控制圖中的特定組件可以處于狀態(tài)轉(zhuǎn)換圖1300中的四個邏輯狀態(tài)之一。第一狀態(tài)是未決(pending)狀態(tài)1302。這是當與控制圖相關(guān)聯(lián)的執(zhí)行集開始執(zhí)行時,組件開始的狀態(tài)。如果組件的任何輸入端口處于未決狀態(tài)1312,則組件保持未決狀態(tài)1302。如果組件恰好沒有輸入端口,則它在未決狀態(tài)1302中開始,但是立即有資格從未決狀態(tài)1302轉(zhuǎn)換出。
從未決狀態(tài)1302,組件可以轉(zhuǎn)換到活動狀態(tài)1304或禁止狀態(tài)1306。
如果組件沒有輸入端口處于未決狀態(tài)1312并且并非其所有輸入端口都處于禁止狀態(tài)1316(即,至少一個輸入端口處于完成狀態(tài)1314),則組件轉(zhuǎn)換到活動狀態(tài)1304。端口默認為“必需”,但可標記為“可選”。可選端口可以保持未連接到另一個端口,而不會導致錯誤(雖然可能有警告)。未連接的任何可選端口自動地處于完成狀態(tài)1314。只要組件仍在執(zhí)行其任務,該組件就保持在活動狀態(tài)1304。當組件處于活動狀態(tài)1304時,其多個輸出端口可以在不同時間轉(zhuǎn)換或一起從未決狀態(tài)1312轉(zhuǎn)換到完成狀態(tài)1314或禁止狀態(tài)1316。在完成其任務的執(zhí)行時,組件轉(zhuǎn)換從活動狀態(tài)1304轉(zhuǎn)換到完成狀態(tài)1308。
如果組件的任務已經(jīng)完成執(zhí)行,并且其所有輸出端口被“決斷(resolved)”,即不再未決,則組件轉(zhuǎn)換到完成狀態(tài)1308。
如果由于定制控制邏輯,或由于其所有輸入端口被禁止,或由于禁止了其所需輸入端口中的至少一個,或由于組件中的未處理錯誤而導致該組件的前序已觸發(fā)至禁止狀態(tài)1306的轉(zhuǎn)換,則該組件處于禁止狀態(tài)1306。組件的所有輸出端口也決斷到禁止狀態(tài)1316以向下游傳播這種禁止。
對于端口,狀態(tài)轉(zhuǎn)換規(guī)則取決于端口是輸入端口還是輸出端口。
端口的初始狀態(tài)是未決狀態(tài)1312。輸入端口通常跟隨它所鏈接到的上游輸出端口的狀態(tài)。因此,當上游輸出端口轉(zhuǎn)換時,在控制圖中鏈接到該輸出端口的輸入端口轉(zhuǎn)換到相同的狀態(tài)。輸出端口保持未決,直到組件在其活動狀態(tài)期間確定輸出端口應決斷到什么狀態(tài)。
如上所述,輸入端口跟隨它們所鏈接的上游輸出端口。因此,對于鏈接到單個上游輸出端口的輸入端口,當其所鏈接的上游輸出端口轉(zhuǎn)換到完成狀態(tài)1314時,該輸入端口轉(zhuǎn)換到完成狀態(tài)1314。如果輸入端口通過多個鏈路鏈接到多個上游輸出端口,則輸入端口在其上游輸出端口中的至少一個轉(zhuǎn)換到完成狀態(tài)1314之后轉(zhuǎn)換到完成狀態(tài)1314。否則,如果所有上游輸出端口轉(zhuǎn)換到禁止狀態(tài)1316,則輸入端口轉(zhuǎn)換到禁止狀態(tài)1316。一些實施例使用與該默認“或邏輯”不同的其他邏輯來確定是將輸入端口轉(zhuǎn)換到完成狀態(tài)1314還是禁止狀態(tài)1316(例如,“與邏輯”,其中僅當所有上游輸出端口處于完成狀態(tài)1314時輸入端口才轉(zhuǎn)換到完成狀態(tài)1314)。如果組件的輸入數(shù)據(jù)端口決斷為完成狀態(tài)1314,則數(shù)據(jù)元素準備就緒供該組件處理。如果組件的輸出數(shù)據(jù)端口決斷為完成狀態(tài)1314,則數(shù)據(jù)元素準備就緒從該組件向下游發(fā)送。
與輸入端口跟隨它們所鏈接到的上游輸出端口的狀態(tài)的規(guī)則一致,當與其鏈接的上游輸出端口決斷為禁止狀態(tài)1316時,輸入端口決斷為禁止狀態(tài)1316。輸出端口決斷為禁止狀態(tài)1316,或者因為活動的組件計算出的結(jié)果確定輸出端口應當被禁止,或者為了使得禁止從上游被禁止組件向下游傳播,或者如果組件中存在未處理的錯誤。在一些實施例中,編譯器可以通過禁止根在被禁止組件處的下游組件的樹來優(yōu)化執(zhí)行,而不必一個組件接一個組件地向下游傳播禁止。
在其他實施例中,可以使用各種替代狀態(tài)機,其中集合端口之間的鏈路也可以包括在控制圖中。在一些這樣的實施例中,集合端口的狀態(tài)轉(zhuǎn)換圖可以包括除未決狀態(tài)、完成狀態(tài)和禁止狀態(tài)之外的活動狀態(tài),諸如在組件的狀態(tài)轉(zhuǎn)移圖1300中。當集合端口(作為輸出端口)產(chǎn)生數(shù)據(jù)或(作為輸入端口)消耗數(shù)據(jù)時,集合端口處于活動狀態(tài)。對于輸入集合端口,例如,一旦確定不是所有輸入端口都將被禁止,就可以在上游產(chǎn)生第一數(shù)據(jù)元素時觸發(fā)活動狀態(tài)。在一些實施例中,沒有集合端口的禁止狀態(tài)。包括集合端口的狀態(tài)轉(zhuǎn)換的控制圖中的組件所遵循的轉(zhuǎn)換規(guī)則可以以與為輸入標量端口或控制端口處理完成狀態(tài)相同的方式來處理輸入集合端口的活動狀態(tài)。
5計算平臺
回看圖1,數(shù)據(jù)處理圖的組件的實例在執(zhí)行數(shù)據(jù)處理圖的情境中被派生(spawn)為任務,并且通常在計算平臺150的多個計算節(jié)點152中執(zhí)行。如下面更詳細討論的,控制器140提供這些任務的調(diào)度和執(zhí)行軌跡的監(jiān)督控制方面,以便實現(xiàn)例如與計算負荷的分配,通信或輸入/輸出開銷的減少以及存儲器資源的使用相關(guān)的系統(tǒng)的性能目標。
通常,在由編譯器/解釋器120翻譯之后,整個計算被表達為可由計算平臺150執(zhí)行的目標語言的過程的基于任務的規(guī)范130。這些過程利用原語,諸如“派生(spawn)”和“等待”,并且可以在過程中包括原語,或調(diào)用由程序員為高級(例如,基于圖的)程序規(guī)范110中的組件指定的工作過程。
在許多情況下,組件的每個實例被實現(xiàn)為任務,其中一些任務實現(xiàn)單個組件的單個實例,一些任務實現(xiàn)執(zhí)行集的多個組件的單個實例,以及一些任務實現(xiàn)組件的連續(xù)實例。來自組件及其實例的特定映射取決于編譯器/解釋器的特定設計,使得所得到的執(zhí)行保持與計算的語義定義一致。
通常,運行時環(huán)境中的多個任務被分層級排列,例如,一個頂級任務派生多個任務,例如,一個任務用于數(shù)據(jù)處理圖的每個頂級組件。類似地,執(zhí)行集的計算可以具有用于處理整個集合的一個任務,其中多個(即許多)子任務分別用于處理集合的元素。
在運行時環(huán)境中,已經(jīng)派生的每個任務可以處于一組可能狀態(tài)之一。在第一次派生時,任務在被初始執(zhí)行之前處于派生狀態(tài)。在執(zhí)行時,它處于執(zhí)行狀態(tài)。任務時而可能處于暫停狀態(tài)。例如,在某些實現(xiàn)方式中,調(diào)度器可以在任務已經(jīng)超過處理器利用的量、正在等待資源等時將任務置于暫停狀態(tài)。在一些實現(xiàn)方式中,任務的執(zhí)行不被搶占,并且任務必須放棄控制。有三個暫停子狀態(tài):可運行,被阻止和已做完。例如,如果任務在完成其計算之前放棄控制,則任務是可運行的。當例如在父任務檢索到任務的返回值之前該任務完成其處理時,該任務是已做完的。如果任務正在等待該任務外部的事件,例如另一個任務的完成(例如,因為它已經(jīng)使用了“等待”原語)或數(shù)據(jù)記錄的可用性(例如,阻止in.read()或out.write()函數(shù)的一次執(zhí)行),則任務是被阻止的。
再次參考圖1,每個計算節(jié)點152具有一個或多個處理引擎154。在至少一些實現(xiàn)方式中,每個進程引擎與在計算節(jié)點150上執(zhí)行的單個操作系統(tǒng)進程相關(guān)聯(lián)。取決于計算節(jié)點的特性,在單個計算節(jié)點上執(zhí)行多個處理引擎可能是有效的。例如,計算節(jié)點可以是具有多個單獨處理器的服務器計算機,或者服務器計算機可以具有帶多個處理器內(nèi)核的單個處理器,或者可以是具有多個內(nèi)核的多個處理器的組合。在任何情況下,執(zhí)行多個處理引擎都可能比在計算節(jié)點152上僅使用單個處理引擎更有效。
處理引擎的一個示例托管在虛擬機的情境中。一種類型的虛擬機是Java虛擬機(JVM),其提供在其中可以執(zhí)行以Java Bytecode(Java字節(jié)碼)的編譯形式指定的任務的環(huán)境。但是也可以使用其他形式的處理引擎,其可以使用或可以不使用虛擬機架構(gòu)。
參考圖14,計算節(jié)點152的每個處理引擎154具有一個或多個運行器1450。每個運行器1450使用一個或多個進程或進程線程來執(zhí)行可運行任務。在一些實現(xiàn)方式中,每個運行器具有相關(guān)聯(lián)的進程線程,但是運行器與線程的這種關(guān)聯(lián)不是必需的。在任何時候,每個運行器正在執(zhí)行計算的最多一個可運行任務。每個運行器具有單獨的可運行隊列1466。計算的每個可運行任務在系統(tǒng)的運行器1450的一個可運行隊列1466中。每個運行器1450具有調(diào)度器/解釋器1460,其監(jiān)視當前運行的任務,并且當該任務將狀態(tài)改變?yōu)橐炎鐾?,被阻止或暫停時,從運行隊列1466中選擇另一個任務并執(zhí)行它。任務與運行器相關(guān)聯(lián),并且不可運行的運行器的任務被保持在可運行隊列1466之外,例如,如圖中所示,在被阻止和已做完隊列1468中。
例如,當初始化處理引擎154時,可以創(chuàng)建運行器1450,為每個引擎創(chuàng)建預配置數(shù)量的運行器。如下所述,在一些實現(xiàn)方式中,可以向處理引擎添加或去除運行器,并且甚至在數(shù)據(jù)處理圖的執(zhí)行期間,可以從計算平臺150添加和去除處理引擎本身。然而,對于下面的初始描述,我們假設處理引擎的數(shù)量以及每個處理引擎內(nèi)運行器的數(shù)量保持恒定。
作為示例,對數(shù)據(jù)處理圖的處理開始于在頂層任務中執(zhí)行主過程。例如,基于任務的控制器140指示與處理引擎1450之一的監(jiān)視器1452通信的計算節(jié)點中的一個開始執(zhí)行主過程。在該示例中,監(jiān)視器1452將用于執(zhí)行主過程的任務放置在處理引擎之一的可運行隊列1466中。在該示例中,運行器是空閑的(即,此時沒有其他任務在運行,并且在可運行隊列中沒有其他可運行任務),所以該運行器的調(diào)度器/解釋器1460從可運行隊列中取出該任務并且開始執(zhí)行任務。當以需要解釋的語言表達過程時,調(diào)度器/解釋器1460解釋過程的連續(xù)語句。
在該示例中,主過程的第一語句為支持無序集合的流的鏈路創(chuàng)建鏈路緩存器1470(即,分配存儲器),其在該示例中包括無序無界緩存器,即緩存器1,緩存器2和緩存器3。可以使用各種方法創(chuàng)建這種類型的組件間鏈路,并且管理用于這些鏈路的相關(guān)聯(lián)的計算資源(包括鏈路緩存器1470),其包括其上游端口是集合端口的任何鏈路。在一些示例中,鏈路緩存器1470包括用于表示集合的源的輸出集合端口的緩存器和用于表示集合的目標的輸入集合端口的單獨緩存器。這些緩存器可以在開始處理集合之前在運行時分配,并且在對集合的處理結(jié)束之后被解除分配(即,釋放用于緩存器的內(nèi)存)。在該示例中,這些鏈路緩存器1470被分配在其中任務的運行器正在執(zhí)行的處理引擎154的存儲器中。通常,其中創(chuàng)建緩存器的存儲器在半導體隨機存取存儲器(RAM)中,盡管在一些實現(xiàn)方式中,諸如磁盤之類的其他存儲設備可以用于存儲至少一些緩存數(shù)據(jù)。注意,在其他方法中,緩存器對運行器本身而言可以是本地的。在實踐中,如果處理引擎154被實現(xiàn)為操作系統(tǒng)進程,則緩存器被創(chuàng)建為該進程的地址空間中的存儲器區(qū)域。因此,直接基于硬件地址對緩存器的訪問限于在該進程內(nèi)執(zhí)行的指令。注意,在這種方法中,如果多個運行器將能夠讀取或?qū)懭刖彺嫫鳎瑒t可能對緩存器需要至少進行一些同步和訪問控制,例如使用鎖(lock)或信號量(semaphore)。在其中每個運行器在操作系統(tǒng)進程內(nèi)被實現(xiàn)為單個線程的方法中,緩存器可以與特定運行器相關(guān)聯(lián),并且所有訪問可以被限制到該運行器,從而避免來自多個線程的潛在爭用。在下面的討論中,我們假設可以從處理引擎中的任何運行器訪問緩存器,并且實現(xiàn)適當?shù)脑L問控制以允許這樣的共享訪問。
主進程的后續(xù)步驟涉及派生或主過程調(diào)用的forall(用于所有)原語。通常,至少在默認情況下,任務或子任務的派生使得這些任務最初在與父進程相同的運行器中形成。例如,派生的Work_Read_External_Data(工作讀取外部數(shù)據(jù))任務在同一個運行器上派生。在任務正在訪問外部數(shù)據(jù)的程度上,任務可以利用至該外部數(shù)據(jù)的I/O接口1464。例如,該接口可以包括到外部數(shù)據(jù)庫、網(wǎng)絡數(shù)據(jù)連接的端點等的開放連接。這樣的I/O接口可以綁定到特定的運行器,因此使用該接口的任務可能需要訪問僅來自該運行器的接口,如下面在運行器之間任務的潛在遷移的情境中進一步討論的。在該示例中,我們假設任務以合理計量的方式填充緩存器1,并且不會例如通過使緩存器1增長超過處理引擎的容量而“淹沒(overwhelm)”系統(tǒng)。下面還討論對控制方面的方法,例如,以避免資源的擁塞或耗盡。
與Work_Read_External_Data任務的執(zhí)行并發(fā)地,forall_Work A導致針對從緩存器1讀取的每個記錄派生任務。特別地,“forall”原語引起由要執(zhí)行原語的自變量標識的任務的多個實例,其中實例的數(shù)量通常由在運行時接收的數(shù)據(jù)元素的數(shù)量確定,并且其中它們被執(zhí)行的位置和它們被調(diào)用的順序可以不受編譯器限制而用于在之后的運行時確定。如上所述,在默認情況下,這些任務也在相同的運行器1450上創(chuàng)建,并且在沒有其他控制的情況下,與從緩存器1可得到的數(shù)據(jù)一樣快地派生這些任務。Work_B和Work_Read_External_Data的任務類似地在相同的運行器上創(chuàng)建。
注意,基于任務的規(guī)范使用“forall”原語,而沒有明確地指定運行時控制器將如何實現(xiàn)任務的分布,以導致所有數(shù)據(jù)待處理。如上所述,運行時控制器可以使用的一種方法是在同一計算節(jié)點上派生單獨的任務,然后依賴于遷移特征以使得任務在分開的節(jié)點上執(zhí)行,從而平衡負載??梢允褂闷渌椒ǎ渲小癴orall”原語導致在多個節(jié)點上直接執(zhí)行多個任務。在游標(cursor)定義內(nèi)存數(shù)據(jù)庫的表的行的基于索引的子集的情況下,游標“forall”原語的實現(xiàn)可以使得游標被分割成多個部分,每個部分與存儲在不同節(jié)點上的記錄相關(guān)聯(lián),并且為不同節(jié)點上的游標的單獨部分派生任務,從而導致處理和數(shù)據(jù)存儲的局部性。但是應當理解,可以在運行時控制器和分布式計算平臺的一個或多個實施例中實現(xiàn)多種方法來執(zhí)行在作為編譯器120輸出的基于任務的規(guī)范130中使用的“forall”原語。在一些示例中,方法的選擇可以取決于例如基于記錄的數(shù)量,計算節(jié)點上的數(shù)據(jù)分布,節(jié)點上的負載等的運行時決策。在任何情況下,用于實現(xiàn)“forall”原語的方法不一定對于數(shù)據(jù)處理圖的開發(fā)人員或編譯器的設計者是已知的。
系統(tǒng)的特征在于任務可以在創(chuàng)建運行器之后在運行器之間傳送。非常一般地,這種任務傳送的一種方式是通過“挪用”或“拉動”機制來實現(xiàn)的,其中空閑或至少輕微加載的運行器使得來自另一運行器的任務被傳送給它。雖然可以使用各種標準,但是運行器可運行隊列1466中的多個可運行任務可以基于本地標準(諸如在其可運行隊列中是否有少于閾值數(shù)量的任務)來確定該運行器是否應當尋求從其他運行器挪用的任務。在一些實現(xiàn)方式中,更全局性的決策進程可用于在多個運行器上重新平衡任務隊列,但總體效果是類似的。
在至少一些實施例中,將任務從一個運行器挪用到另一個運行器不是必然涉及轉(zhuǎn)移該任務的所有數(shù)據(jù)。例如,只有當前執(zhí)行“框架”中可訪問的數(shù)據(jù)(例如,用于從當前程序范圍可訪問的局部和全局變量的數(shù)據(jù),例如當前子例程調(diào)用)與引用一起打包回任務“主(home)”運行器。此數(shù)據(jù)足以在遷移的目標運行器處創(chuàng)建任務的可運行副本,并且目標可運行隊列中的條目準備好在在該運行器中執(zhí)行。
當遷移的運行器完成執(zhí)行時,或者通過從局部變量可用的程序范圍返回該遷移的運行器耗盡了傳送到該運行器的數(shù)據(jù)時,任務被傳送回主運行器,其中用于任務的數(shù)據(jù)被合并,并且任務再次在其主運行器處可運行。
注意,在單個處理引擎內(nèi)傳送任務期間,運行器之間的通信可以通過本地存儲器(即,避免磁盤或網(wǎng)絡通信),從而消耗相對少的資源。在允許處理引擎之間進行挪用和遷移的實現(xiàn)方式中,在從一個運行器轉(zhuǎn)換到另一個運行器時,任務消耗相對較少的資源,例如,主要消耗處理引擎之間的通信資源而不是計算資源。此外,這種通信的等待時間相對不顯著,因為主運行器和目標運行器被假定為在傳送期間忙于計算,主運行器是因為其可運行隊列被大量填充并且因此不可能空,而目標運行器是因為挪用是在預期在目標處的可運行隊列被清空的情況下進行的。
在與圖2A-圖2B中所示的計算相關(guān)聯(lián)的任務的執(zhí)行的示例中,任務挪用機制將用于計算的負載分布在一個或多個處理引擎的運行器上。然而,注意,某些數(shù)據(jù)訪問被限于特定運行器(或可能限于特定處理引擎)。例如,如上文所述,緩存器2的數(shù)據(jù)可以由單個運行器(或可能一組運行器)訪問,然而可能需要寫入緩存器2的Work_A任務可能已經(jīng)被無法寫入緩存器2的運行器挪用。在這樣的情況下,當任務需要采取必須在與當前正在執(zhí)行的任務所在的運行器不同的運行器上執(zhí)行的動作時,以“遷移”或“推動”方式將任務遷移到合適的運行器。
在至少一些示例中,計算平臺150支持一組全局變量對(鍵,值)的全局數(shù)據(jù)存儲。該數(shù)據(jù)存儲可以分布在多個計算節(jié)點(或處理引擎)上的存儲器(例如,RAM或磁盤)上。鍵的名稱空間是全局的,因為鍵的規(guī)范在所有計算節(jié)點152及其運行器1450處具有相同的含義。這些變量的值在任務被實例化、執(zhí)行和終止時持續(xù),從而提供了一種在任務之間傳遞信息的方式,而不需要經(jīng)由共同的父任務將這種信息從一個任務傳遞到另一個任務。如下所述,根據(jù)鍵對進行的訪問被控制,使得值的使用和更新不會導致任務之間的沖突。在一些示例中,任務對于它們的一些或全部執(zhí)行而獲得對特定(鍵,值)對的獨占訪問。
通常,(鍵,值)對的存儲是分布的,并且任何特定(鍵,值)對與特定計算節(jié)點152相關(guān)聯(lián)。例如,(鍵,值)對存儲在該計算節(jié)點處的分布式表存儲1480中。在一些實現(xiàn)方式中,派生原語允許指定鍵和從相關(guān)聯(lián)的變量到任務的局部變量的映射。當指定一個鍵時,派生的任務在其執(zhí)行的持續(xù)時間內(nèi)獲得對鍵的獨占訪問。在執(zhí)行開始之前,將值從存儲傳遞到任務的本地上下文中,并且在執(zhí)行完成后,本地上下文中的值將被傳遞回全局存儲。如果一個派生原語指定另一個正在執(zhí)行的任務使用的鍵,則這個新派生的任務將被阻止,直到它可以獲得對該鍵的獨占訪問。在一些實現(xiàn)方式中,每個計算節(jié)點可以確定特定鍵的主節(jié)點,并且當請求派生任務時,該請求由(鍵,值)對駐留的計算節(jié)點處理,并且任務的執(zhí)行將最初在該節(jié)點開始。在替代實施例中,用于獲得對這種全局共享(鍵,值)對的類似的獨占訪問的其他方法不是必然涉及在與存儲相同的位置發(fā)起任務,例如通過傳送獨占訪問的請求并且隨后使用更新的鍵值來傳送獨占訪問的釋放。任務可以創(chuàng)建新的(鍵,值)對,在默認情況下,在創(chuàng)建新(鍵,值)對時新的(鍵,值)對存儲在任務運行的節(jié)點上。
全局狀態(tài)變量的一種用途是在執(zhí)行集合的連續(xù)記錄的函數(shù)期間進行聚集。例如,全局存儲維護分配給鍵的值的窗口,而不是作為單項的值。因此,在編程模型中,可以將值添加到與鍵相關(guān)聯(lián)地維護的歷史中,并且可以提供先前添加的值的函數(shù)。值的窗口可以根據(jù)項目的數(shù)量(即,最后的100項)定義,通過時間窗口定義(即,例如在最后10分鐘中添加的項目,由值被添加時的時間定義或由每個值被添加時提供的顯式時間戳定義)。注意,編程模型不需要明確刪除落在窗口外的舊值,窗口的定義允許實現(xiàn)自動執(zhí)行這樣的刪除。編程模型包括用于創(chuàng)建這種基于窗口的鍵控全局變量的多個原語(例如,定義窗口的性質(zhì)和范圍),將值添加到鍵以及值的窗口的計算函數(shù)(例如,最大值,平均值,不同值的數(shù)量,等等)。一些原語將針對鍵的新值的添加和窗口函數(shù)的返回(例如,將新值添加到鍵并返回添加的最后100個值的平均值)組合。
在至少一些示例中,全局存儲還包括經(jīng)由稱為句柄的標識符訪問的面向記錄的共享數(shù)據(jù)。例如,句柄可以標識數(shù)據(jù)記錄的源或宿,或者作為另一示例,句柄可以標識數(shù)據(jù)集中的特定記錄。通常,句柄被鍵入,因為句柄點提供了訪問數(shù)據(jù)的方式,并且還提供被訪問的數(shù)據(jù)結(jié)構(gòu)的定義。例如,句柄可以具有與其相關(guān)聯(lián)的數(shù)據(jù)記錄的字段(列)結(jié)構(gòu)。
在至少一些示例中,全局存儲器(例如,在計算節(jié)點的存儲器中)包括針對多行類型化數(shù)據(jù)的一個或多個表的表存儲,其中該表格或表格的特定記錄經(jīng)由稱為句柄的標識符被訪問。表的行類型可以是具有向量、記錄向量等的層級記錄類型。在一些示例中,表可以具有提供對行的哈?;駼樹(有序)訪問的一個或多個索引,并且游標可以基于表、索引或索引和鍵值創(chuàng)建。行可以單獨插入、更新或刪除。為了支持事務處理,任務可以鎖定一個或多個表的一行或多行,例如,用于在對數(shù)據(jù)處理圖的組件的處理期間讀取或更新訪問。表可以被視為用于數(shù)據(jù)并行操作的集合,例如,作為數(shù)據(jù)處理圖中的數(shù)據(jù)的源或目標。通常,對表進行索引,并且可以基于產(chǎn)生游標的索引來選擇表的行的子集,然后使用該游標來提供所選擇的行作為數(shù)據(jù)源。在一些示例中,另外的原語對任務可用,用于諸如分割游標和估計與句柄相關(guān)聯(lián)的記錄的數(shù)量的動作。當提供游標作為用于執(zhí)行集的數(shù)據(jù)源時,游標可以被分割成多個部分,每個部分將表的一些行提供給執(zhí)行集的對應實例,從而提供并行性并且適當?shù)胤指钣螛耸沟媚軌蛟诖鎯π械墓?jié)點上執(zhí)行。數(shù)據(jù)表還可以由實現(xiàn)事務的任務訪問,使得維護數(shù)據(jù)表的修改,以便在任務之外不可見,直到由任務明確地提交這些修改。在一些示例中,可以通過鎖定表的一個或多個行來實現(xiàn)這樣的事務支持,而在其他示例中,可以實現(xiàn)涉及行的多個版本的更復雜的方法,以比可以僅使用鎖定提供更高的潛在并發(fā)性。
文件、數(shù)據(jù)流和內(nèi)存表都是被稱為集合的示例。讀取器任務從集合中讀取記錄,并且寫入器任務將記錄寫入集合。一些任務既是讀取器又是寫入器。
如上所述,表示集合的流可以使用內(nèi)存緩存器在運行時系統(tǒng)中實現(xiàn)??商娲?,在各種實現(xiàn)方式中可以使用任何形式的存儲,包括數(shù)據(jù)庫內(nèi)的表或分布式存儲系統(tǒng)。在一些實現(xiàn)方式中,使用內(nèi)存中分布式數(shù)據(jù)庫。在一些實現(xiàn)方式中,編譯器以不是必然暴露給數(shù)據(jù)處理圖的開發(fā)人員的方式使用內(nèi)存表來實現(xiàn)這樣的流。例如,編譯器可以使上游組件填充表的多個行,并且下游組件讀取先前填充的行,從而實現(xiàn)無序數(shù)據(jù)流。運行時間控制器可以調(diào)用與執(zhí)行集相對應的任務的多個實例,從而通過以數(shù)據(jù)元素被接收到存儲中的順序不同的順序從存儲中取出這些數(shù)據(jù)元素,對來自上游集合端口的驅(qū)動數(shù)據(jù)元素進行處理,防止某些形式的阻塞。例如,可以調(diào)用任務的實例而不阻止任何特定的其他實例調(diào)用任何實例(即,直到任何特定的其他實例完成處理一個或多個數(shù)據(jù)元素之后)。
通常,集合中的記錄可以在該記錄中的數(shù)據(jù)被首次寫入之前具有句柄。例如,可以將表設置為索引的一組記錄的目標,并且即使在寫入那些記錄的數(shù)據(jù)之前,各個記錄也可以具有句柄。
6實現(xiàn)方式
上述方法可以例如使用執(zhí)行合適的軟件指令的可編程計算系統(tǒng)來實現(xiàn),或者可以在諸如現(xiàn)場可編程門陣列(FPGA)或一些混合形式的合適的硬件中實現(xiàn)。例如,在編程方法中,軟件可以包括在一個或多個編程或可編程計算系統(tǒng)(其可以是諸如分布式、客戶端/服務器或網(wǎng)格的各種架構(gòu))上執(zhí)行的一個或多個計算機程序中的過程,每個計算系統(tǒng)包括至少一個處理器,至少一個數(shù)據(jù)存儲系統(tǒng)(包括易失性和/或非易失性存儲器和/或存儲元件),至少一個用戶界面(用于使用至少一個輸入設備或端口接收輸入,并且用于使用至少一個輸出設備或端口提供輸出)。軟件可以包括例如提供與數(shù)據(jù)處理圖的設計、配置和執(zhí)行相關(guān)的服務的更大程序的一個或多個模塊。程序的模塊(例如,數(shù)據(jù)處理圖的組件)可以被實現(xiàn)為符合存儲在數(shù)據(jù)倉庫中的數(shù)據(jù)模型的數(shù)據(jù)結(jié)構(gòu)或其他有組織的數(shù)據(jù)。
軟件可以使用持續(xù)一段時間(例如,動態(tài)存儲器裝置(例如動態(tài)RAM)的刷新周期之間的時間)的介質(zhì)的物理特性(例如,表面凹坑和平臺、磁疇或電荷等)以非暫時性形式存儲,例如被實施在易失性或非易失性存儲介質(zhì)或任何其它非暫時性介質(zhì)中。在準備加載指令時,軟件可以提供在有形、非暫時性介質(zhì)上,例如CD-ROM或其他計算機可讀介質(zhì)(例如,可由通用或?qū)S糜嬎阆到y(tǒng)或設備讀取),或者可以通過網(wǎng)絡的通信介質(zhì)被遞送(例如,被編碼成傳播信號)到其被執(zhí)行的計算系統(tǒng)的有形、非暫時性介質(zhì)??梢栽趯S糜嬎銠C上或使用諸如協(xié)處理器或現(xiàn)場可編程門陣列(FPGA)或特定的專用集成電路(ASIC)的專用硬件來執(zhí)行處理中的一些或全部。處理可以以分布式方式實現(xiàn),其中由軟件指定的計算的不同部分由不同的計算元件執(zhí)行。每個這樣的計算機程序優(yōu)選地存儲在或下載到可由通用或?qū)S每删幊逃嬎銠C訪問的存儲設備的計算機可讀存儲介質(zhì)(例如,固態(tài)存儲器或介質(zhì),或磁介質(zhì)或光介質(zhì))上,用于當計算機讀取存儲設備介質(zhì)以執(zhí)行本文所述的處理時,配置和操作計算機。本發(fā)明的系統(tǒng)還可以被認為可實現(xiàn)為配置有計算機程序的有形的、非暫時性介質(zhì),其中如此配置的介質(zhì)使得計算機以特定和預定義的方式操作以執(zhí)行本文描述的一個或多個處理步驟。
已經(jīng)描述了本發(fā)明的多個實施例。然而,應當理解,前述描述旨在說明而不是限制本發(fā)明的范圍,本發(fā)明的范圍由所附權(quán)利要求的范圍限定。因此,其他實施例也在所附權(quán)利要求的范圍內(nèi)。例如,在不脫離本發(fā)明的范圍的情況下可以進行各種修改。另外,上述的一些步驟可以是與順序無關(guān)的,并且因此可以以與所描述的順序不同的順序來執(zhí)行。
權(quán)利要求書(按照條約第19條的修改)
1.一種用于處理基于圖的程序規(guī)范的方法,所述方法包括:
接收所述基于圖的程序規(guī)范,所述基于圖的程序規(guī)范包括:
多個組件,每個組件對應于處理任務并且包括用于發(fā)送或接收一個或多個數(shù)據(jù)元素的一個或多個端口;以及
一個或多個鏈路,所述一個或多個鏈路中的每個鏈路將所述多個組件中的上游組件的輸出端口連接到所述多個組件中的下游組件的輸入端口;以及
處理所述基于圖的程序規(guī)范,以生成表示所述基于圖的程序規(guī)范的所述多個組件的子集的準備好的代碼,所述處理包括:
至少部分地基于鏈接的組件的特性,在不同子集中識別組件之間的多個子集邊界;
基于所識別的子集邊界形成子集;以及
為每個形成的子集生成準備好的代碼,當用于運行時系統(tǒng)執(zhí)行時,所述準備好的代碼使得根據(jù)為該形成的子集的準備好的代碼中嵌入的信息來執(zhí)行與該形成的子集中的組件對應的處理任務,其中所述運行時系統(tǒng)實例化該形成的子集的一定數(shù)量的實例,并且在運行時間期間至少部分地基于所述運行時系統(tǒng)在處理多個數(shù)據(jù)元素的集時的性能來動態(tài)地確定所述數(shù)量。
2.根據(jù)權(quán)利要求1所述的方法,其中形成子集包括:遍歷所述基于圖的程序規(guī)范的組件,同時保持所遍歷的子集邊界的記錄,以及將所述基于圖的程序規(guī)范的每個組件與從所遍歷的子集邊界的記錄中確定的單個子集標識符相關(guān)聯(lián)。
3.根據(jù)權(quán)利要求2所述的方法,其中與所述多個組件的所識別的子集相關(guān)聯(lián)的每個子集標識符是唯一的。
4.根據(jù)權(quán)利要求2所述的方法,其中所遍歷的子集邊界的記錄被維護為標識符值的路徑。
5.根據(jù)權(quán)利要求4所述的方法,其中所述標識符值的路徑包括通過分隔符彼此分隔的標識符值的字符串。
6.根據(jù)權(quán)利要求1所述的方法,其中形成子集包括:
將所述基于圖的程序規(guī)范的第一組件與一子集標識符相關(guān)聯(lián);
將該子集標識符傳播到所述第一組件的下游的組件;以及
基于所識別的子集邊界,在該子集標識符的傳播過程中修改該子集標識符。
7.根據(jù)權(quán)利要求6所述的方法,其中在該子集標識符的傳播過程中修改該子集標識符包括:
在遍歷所述第一子集邊界時,將該子集標識符的值從第一子集標識符值改變?yōu)榕c第一子集邊界相關(guān)聯(lián)的第二子集標識符值;以及
在遍歷與所述第一子集邊界相關(guān)聯(lián)的第二子集邊界時,將該子集標識符的值改變?yōu)樗龅谝蛔蛹瘶俗R符值。
8.根據(jù)任一項前述權(quán)利要求所述的方法,其中至少部分地基于鏈接的組件的特性識別一個或多個子集邊界包括:基于上游組件上的第一類型的端口與下游組件上的第二類型的端口之間的鏈路來識別子集邊界。
9.根據(jù)任一項前述權(quán)利要求所述的方法,其中至少部分地基于鏈接的組件的特性識別一個或多個子集邊界包括:基于上游組件與下游組件之間的確定類型的鏈路來識別子集邊界,其中所述確定類型的鏈路是組件之間多種不同類型的鏈路之一。
10.根據(jù)任一項前述權(quán)利要求所述的方法,其中為每個形成的子集生成準備好的代碼包括:對于至少一個形成的子集,將指示與該形成的子集中的組件對應的處理任務之間的允許的并發(fā)性的信息嵌入到所述準備好的代碼中。
11.根據(jù)任一項前述權(quán)利要求所述的方法,其中為每個形成的子集生成準備好的代碼包括:對于至少一個形成的子集,將指示相對于其它形成的子集的優(yōu)先級的信息嵌入到所述準備好的代碼中。
12.根據(jù)任一項前述權(quán)利要求所述的方法,其中為每個形成的子集生成準備好的代碼包括:對于至少一個形成的子集,將指示與該形成的子集中的組件對應的一個或多個處理任務的事務性的信息嵌入到所述準備好的代碼中。
13.根據(jù)任一項前述權(quán)利要求所述的方法,其中為每個形成的子集生成準備好的代碼包括:對于至少一個形成的子集,將指示在所述準備好的代碼的執(zhí)行過程中要鎖定的至少一個資源的信息嵌入到所述準備好的代碼中。
14.根據(jù)任一項前述權(quán)利要求所述的方法,其中為每個形成的子集生成準備好的代碼包括:對于至少一個形成的子集,將指示與該形成的子集的組件對應的一個或多個處理任務所處理的數(shù)據(jù)元素之間的排序特性的信息嵌入到所述準備好的代碼中。
15.根據(jù)任一項前述權(quán)利要求所述的方法,其中為每個形成的子集生成準備好的代碼包括:對于至少一個形成的子集,將指示使用所述準備好的代碼執(zhí)行該形成的子集的每個實例所操作的數(shù)據(jù)元素的數(shù)量的信息嵌入到所述準備好的代碼中。
16.一種以非暫時形式存儲在計算機可讀介質(zhì)上的軟件,用于處理基于圖的程序規(guī)范,所述軟件包括用于使得計算系統(tǒng)執(zhí)行以下操作的指令:
接收所述基于圖的程序規(guī)范,所述基于圖的程序規(guī)范包括:
多個組件,每個組件對應于處理任務并且包括用于發(fā)送或接收一個或多個數(shù)據(jù)元素的一個或多個端口;以及
一個或多個鏈路,所述一個或多個鏈路中的每個鏈路將所述多個組件中的上游組件的輸出端口連接到所述多個組件中的下游組件的輸入端口;以及
處理所述基于圖的程序規(guī)范,以生成表示所述基于圖的程序規(guī)范的所述多個組件的子集的準備好的代碼,所述處理包括:
至少部分地基于鏈接的組件的特性,在不同子集中識別組件之間的多個子集邊界;
基于所識別的子集邊界形成子集;以及
為每個形成的子集生成準備好的代碼,當用于運行時系統(tǒng)執(zhí)行時,所述準備好的代碼使得根據(jù)為該形成的子集的準備好的代碼中嵌入的信息來執(zhí)行與該形成的子集中的組件對應的處理任務,其中所述運行時系統(tǒng)實例化該形成的子集的一定數(shù)量的實例,并且在運行時間期間至少部分地基于所述運行時系統(tǒng)在處理多個數(shù)據(jù)元素的集時的性能來動態(tài)地確定所述數(shù)量。
17.一種用于處理基于圖的程序規(guī)范的計算系統(tǒng),所述計算系統(tǒng)包括:
至少一個輸入設備或端口,被配置為接收所述基于圖的程序規(guī)范,所述基于圖的程序規(guī)范包括:
多個組件,每個組件對應于處理任務并且包括用于發(fā)送或接收一個或多個數(shù)據(jù)元素的一個或多個端口;以及
一個或多個鏈路,所述一個或多個鏈路中的每個鏈路將所述多個組件中的上游組件的輸出端口連接到所述多個組件中的下游組件的輸入端口;以及
至少一個處理器,被配置為處理所述基于圖的程序規(guī)范,以生成表示所述基于圖的程序規(guī)范的所述多個組件的子集的準備好的代碼,所述處理包括:
至少部分地基于鏈接的組件的特性,在不同子集中識別組件之間的多個子集邊界;
基于所識別的子集邊界形成子集;以及
為每個形成的子集生成準備好的代碼,當用于運行時系統(tǒng)執(zhí)行時,所述準備好的代碼使得根據(jù)為該形成的子集的準備好的代碼中嵌入的信息來執(zhí)行與該形成的子集中的組件對應的處理任務,其中所述運行時系統(tǒng)實例化該形成的子集的一定數(shù)量的實例,并且在運行時間期間至少部分地基于所述運行時系統(tǒng)在處理多個數(shù)據(jù)元素的集時的性能來動態(tài)地確定所述數(shù)量。
18.根據(jù)權(quán)利要求1至15中任一項所述的方法,其中如果存在多個實例,則將所述多個實例中的每一個應用于所述多個數(shù)據(jù)元素的集中的數(shù)據(jù)元素的不同的相應子集。