亚洲成年人黄色一级片,日本香港三级亚洲三级,黄色成人小视频,国产青草视频,国产一区二区久久精品,91在线免费公开视频,成年轻人网站色直接看

管理任務(wù)的調(diào)用的制作方法

文檔序號:11935105閱讀:301來源:國知局
管理任務(wù)的調(diào)用的制作方法與工藝

本申請要求于2014年9月2日提交的美國申請序列號62/044,665以及于2015年5月20日提交的美國申請序列號62/164,175的優(yōu)先權(quán)。

技術(shù)領(lǐng)域

本說明書涉及一種用于管理任務(wù)的調(diào)用的方法。



背景技術(shù):

一種用于數(shù)據(jù)流計算的方法利用基于圖的表示,其中對應(yīng)于圖的節(jié)點(頂點)的計算組件通過與圖的鏈路(有向邊)對應(yīng)的數(shù)據(jù)流(稱為“數(shù)據(jù)流圖”)耦合。通過數(shù)據(jù)流鏈路連接到上游組件的下游組件接收輸入數(shù)據(jù)元素的有序流,并且以所接收的順序處理輸入數(shù)據(jù)元素,可選地生成一個或多個對應(yīng)的輸出數(shù)據(jù)元素流。用于執(zhí)行這種基于圖的計算的系統(tǒng)描述于發(fā)明名稱為“EXECUTING COMPUTATIONS EXPRESSED AS GRAPHS(執(zhí)行表達(dá)為圖的計算)”的在先美國專利5,966,072中,其通過引用并入本文。在與該在先專利中描述的方法相關(guān)的實現(xiàn)方式中,每個組件被實現(xiàn)為駐留在通常多個計算機服務(wù)器之一上的進(jìn)程。每個計算機服務(wù)器可以具有在任何一個時間活動的多個這樣的組件進(jìn)程,并且操作系統(tǒng)(例如,Unix)調(diào)度器在該服務(wù)器上托管的組件之間共享資源(例如,處理器時間和/或處理器內(nèi)核)。在這種實現(xiàn)方式中,組件之間的數(shù)據(jù)流可以使用操作系統(tǒng)的數(shù)據(jù)通信服務(wù)和連接服務(wù)器的數(shù)據(jù)網(wǎng)絡(luò)(例如,命名管道,TCP/IP會話等)來實現(xiàn)。組件的子集通常用作來自整體計算的數(shù)據(jù)的源和/或數(shù)據(jù)宿(或數(shù)據(jù)接收器,sink),例如,去往和/或來自數(shù)據(jù)文件、數(shù)據(jù)庫表和外部數(shù)據(jù)流。然后,在例如通過協(xié)調(diào)進(jìn)程建立組件進(jìn)程和數(shù)據(jù)流之后,數(shù)據(jù)流過整個計算系統(tǒng),該計算系統(tǒng)實現(xiàn)表達(dá)為通常由每個組件處的輸入數(shù)據(jù)的可用性控制的圖的計算并且為每個組件調(diào)度計算資源。因此,至少通過使不同的組件能夠由不同的進(jìn)程(托管在相同或不同的服務(wù)器計算機或處理器內(nèi)核上)并行地執(zhí)行,可以實現(xiàn)并行性,其中不同組件在通過數(shù)據(jù)流圖的不同路徑上并行地執(zhí)行在本文中被稱為組件并行性,并且不同組件通過數(shù)據(jù)流圖在相同路徑的不同部分上并行執(zhí)行在本文中被稱為流水線并行性。

其他形式的并行性也得到這種方法的支持。例如,輸入數(shù)據(jù)集可以例如根據(jù)數(shù)據(jù)集的記錄中字段的值的分區(qū)來分割,其中每個部分被發(fā)送到處理數(shù)據(jù)集的記錄的組件的單獨副本。組件的這種單獨的副本(或“實例”)可以在單獨的服務(wù)器計算機或服務(wù)器計算機的單獨的處理器內(nèi)核上執(zhí)行,從而實現(xiàn)本文所稱的數(shù)據(jù)并行性??梢院喜为毥M件的結(jié)果以再次形成單個數(shù)據(jù)流或數(shù)據(jù)集。用于執(zhí)行組件實例的計算機或處理器內(nèi)核的數(shù)量將由開發(fā)人員在開發(fā)數(shù)據(jù)流圖時指定。

可以使用各種方法來提高這種方法的效率。例如,組件的每個實例不一定必須在其自己的操作系統(tǒng)進(jìn)程中托管,例如使用一個操作系統(tǒng)進(jìn)程來實現(xiàn)多個組件(例如,形成更大圖的連接子圖的組件)。

上述方法的至少一些實現(xiàn)方式受到與在底層計算機服務(wù)器上所得到的進(jìn)程的執(zhí)行效率有關(guān)的限制。例如,這些限制可能涉及重新配置圖的運行實例以改變數(shù)據(jù)并行度、改變到托管各種組件的服務(wù)器和/或平衡不同計算資源上的負(fù)載的困難?,F(xiàn)有的基于圖的計算系統(tǒng)也具有的缺陷是啟動時間慢,這通常是因為太多的進(jìn)程被不必要地啟動,浪費了大的存儲量。通常,進(jìn)程在啟動圖的執(zhí)行時開始,并在圖的執(zhí)行完成時結(jié)束。

已經(jīng)使用了用于分布計算的其他系統(tǒng),其中將整體計算劃分為更小的部分,并且將這些部分從一個主計算機服務(wù)器分發(fā)到各個其他(例如,“從屬”)計算機服務(wù)器,從屬計算機服務(wù)器各自獨立地執(zhí)行計算并將其結(jié)果返回到主服務(wù)器。一些這樣的方法被稱為“網(wǎng)格計算”。然而,除了經(jīng)由調(diào)用那些部分的主計算機服務(wù)器之外,這樣的方法通常依賴于每個計算的獨立性,而不提供用于在計算部分之間傳遞數(shù)據(jù)或調(diào)度和/或?qū)@些部分的執(zhí)行進(jìn)行排序的機制。因此,對于托管涉及多個組件之間的交互的計算,這樣的方法沒有提供直接有效的解決方案。

用于大型數(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)中存儲的計算,但是許多計算不匹配該框架和/或不容易適應(yīng)于使得它們的所有輸入和輸出都在分布式文件系統(tǒng)中。

總體而言,與組件(或組件的并行執(zhí)行副本)托管在不同服務(wù)器上的上述方法相比,需要提高計算的底層規(guī)范是圖的計算的計算效率(例如,增加給定計算資源的每單位處理的記錄的數(shù)量)。此外,期望能夠適應(yīng)變化的計算資源和需求。還需要提供一種計算方法,其允許適應(yīng)在一個或多個基于圖的計算的執(zhí)行期間可用的計算資源的變化,和/或允許適應(yīng)例如由于正在處理的數(shù)據(jù)的特性導(dǎo)致的這樣的計算的不同組件的計算負(fù)載的變化或者負(fù)載的時間變化。還需要提供能夠有效地利用具有不同特性的計算資源的計算方法,例如使用具有每個服務(wù)器不同數(shù)量的處理器、每個處理器不同數(shù)量的處理器內(nèi)核等的服務(wù)器,以有效地支持同質(zhì)和異質(zhì)環(huán)境。還期望使基于圖的計算快速啟動。提供這種效率和適應(yīng)性的一個方面是在創(chuàng)建圖時(在設(shè)計時)開發(fā)人員做出的選擇、(在編譯時)編譯器所采取的動作和(在運行時)運行時系統(tǒng)所采取的動作之間提供適當(dāng)?shù)姆蛛x和抽象屏障。



技術(shù)實現(xiàn)要素:

在一個方面,一般性地,一種方法包括:存儲基于圖的程序規(guī)范,所述基于圖的程序規(guī)范包括對應(yīng)于任務(wù)的多個組件,所述多個組件中的至少一些組件每個具有以下中的至少一個:(1)至少一個輸入端口,用于接收待由對應(yīng)任務(wù)處理的數(shù)據(jù)元素的集合,或者(2)至少一個集合型輸出端口,用于提供數(shù)據(jù)元素的集合由與鏈接到集合型輸出端口的組件相對應(yīng)的任務(wù)處理;以及執(zhí)行由所述基于圖的程序規(guī)范指定的程序,所述執(zhí)行包括:經(jīng)由連接到所述多個組件中的第一組件的集合型輸出端口以及所述多個組件中的第二組件的輸入端口的鏈路,以第一順序?qū)?shù)據(jù)元素的第一集合中的兩個或更多數(shù)據(jù)元素接收到第一存儲區(qū)中,以及調(diào)用對應(yīng)于所述第二組件的任務(wù)的多個實例以處理數(shù)據(jù)元素的所述第一集合中的數(shù)據(jù)元素,包括:以第二順序從所述第一存儲區(qū)取出數(shù)據(jù)元素,直到任何特定實例完成處理一個或多個數(shù)據(jù)元素后不阻止調(diào)用任何實例,其中所述第一順序不同于所述第二順序。

各個方面可以包括以下特征中的一個或多個。

調(diào)用對應(yīng)于所述第二組件的任務(wù)的一個或多個實例包括調(diào)用對應(yīng)于所述第二組件的任務(wù)的多個實例。

調(diào)用對應(yīng)于所述第二組件的任務(wù)的多個實例包括調(diào)用對應(yīng)于所述第二組件的任務(wù)的多個順序執(zhí)行的實例。

調(diào)用對應(yīng)于所述第二組件的任務(wù)的多個實例包括調(diào)用對應(yīng)于所述第二組件的任務(wù)的多個并發(fā)執(zhí)行的實例。

對應(yīng)于所述第二組件的任務(wù)的多個實例中的任務(wù)的每個實例對應(yīng)于數(shù)據(jù)元素的所述第一集合的不同的、非重疊的子集。

數(shù)據(jù)的所述第一集合的每個不同的、非重疊的子集包括單個數(shù)據(jù)元素。

所述第二組件的輸入端口是集合型輸入端口,用于接收待由對應(yīng)于所述第二組件的任務(wù)處理的數(shù)據(jù)元素的集合,并且調(diào)用對應(yīng)于所述第二組件的任務(wù)的一個或多個實例包括調(diào)用對應(yīng)于所述第二組件的任務(wù)的單個實例。

對應(yīng)于所述第二組件的任務(wù)的單個實例迭代地處理數(shù)據(jù)元素的所述第一集合中的數(shù)據(jù)元素。

所述執(zhí)行還包括生成包括第一數(shù)量的數(shù)據(jù)元素的輸出,所述第一數(shù)量與所述第一集合中數(shù)據(jù)元素的第二數(shù)量相同。

所述執(zhí)行還包括以第三順序?qū)⑺鲚敵鎏峁┙o第二存儲區(qū),所述第三順序獨立于數(shù)據(jù)元素的所述第一集合的所述第一順序。

所述執(zhí)行還包括生成包括第一數(shù)量的數(shù)據(jù)元素的輸出,其中所述第一數(shù)量與所述第一集合中數(shù)據(jù)元素的第二數(shù)量不同。

所述多個組件中的至少一些組件每個具有:至少一個標(biāo)量型輸入端口,用于接收待由對應(yīng)任務(wù)處理的單個數(shù)據(jù)元素,以及至少一個標(biāo)量型輸出端口,用于提供單個數(shù)據(jù)元素由與鏈接到標(biāo)量型輸出端口的組件相對應(yīng)的任務(wù)處理;以及執(zhí)行由所述基于圖的程序規(guī)范指定的程序還包括:經(jīng)由將標(biāo)量型輸出端口連接到標(biāo)量型輸入端口的鏈路,在所述多個組件中的第三組件的標(biāo)量型輸入端口處,從所述多個組件中的第四組件的標(biāo)量型輸出端口接收單個數(shù)據(jù)元素;以及響應(yīng)于在標(biāo)量型輸入端口處接收到單個數(shù)據(jù)元素,調(diào)用對應(yīng)于所述第三組件的任務(wù)的實例。

執(zhí)行由所述基于圖的程序規(guī)范指定的程序還包括:直到在標(biāo)量型輸入端口處接收到單個數(shù)據(jù)元素后,阻止調(diào)用對應(yīng)于所述第三組件的任務(wù)。

執(zhí)行由所述基于圖的程序規(guī)范指定的程序還包括:直到在標(biāo)量型輸入端口處接收到單個數(shù)據(jù)元素后,阻止直接地或間接地調(diào)用與取決于所述第三組件的組件相對應(yīng)的任務(wù)。

所述方法還包括確定連接到所述第一組件的集合型輸出端口和所述第二組件的輸入端口的鏈路的存在,此鏈路的存在標(biāo)志著可以重新排序所述第一集合內(nèi)的數(shù)據(jù)元素。

在另一方面中,一般性地,一種以非暫時形式存儲在計算機可讀介質(zhì)上的軟件,所述軟件包括用于使得計算系統(tǒng)執(zhí)行以下操作的指令:存儲基于圖的程序規(guī)范,所述基于圖的程序規(guī)范包括對應(yīng)于任務(wù)的多個組件,所述多個組件中的至少一些組件每個具有以下中的至少一個:(1)至少一個輸入端口,用于接收待由對應(yīng)任務(wù)處理的數(shù)據(jù)元素的集合,或者(2)至少一個集合輸出端口,用于提供數(shù)據(jù)元素的集合由與鏈接到集合輸出端口的組件相對應(yīng)的任務(wù)處理;以及執(zhí)行由所述基于圖的程序規(guī)范指定的程序,所述執(zhí)行包括:經(jīng)由連接到所述多個組件中的第一組件的集合輸出端口以及所述多個組件中的第二組件的輸入端口的鏈路,以第一順序?qū)?shù)據(jù)元素的第一集合中的兩個或更多數(shù)據(jù)元素接收到第一存儲區(qū)中,以及調(diào)用對應(yīng)于所述第二組件的任務(wù)的多個實例以處理數(shù)據(jù)元素的所述第一集合中的數(shù)據(jù)元素,包括:以第二順序從所述第一存儲區(qū)取出數(shù)據(jù)元素,直到任何特定實例完成處理一個或多個數(shù)據(jù)元素后不阻止調(diào)用任何實例,其中所述第一順序不同于所述第二順序。

在另一方面中,一般性地,一種計算系統(tǒng)包括:數(shù)據(jù)存儲系統(tǒng),用于存儲基于圖的程序規(guī)范,所述基于圖的程序規(guī)范包括對應(yīng)于任務(wù)的多個組件,所述多個組件中的至少一些組件每個具有以下中的至少一個:(1)至少一個輸入端口,用于接收待由對應(yīng)任務(wù)處理的數(shù)據(jù)元素的集合,或者(2)至少一個集合輸出端口,用于提供數(shù)據(jù)元素的集合由與鏈接到集合輸出端口的組件相對應(yīng)的任務(wù)處理;以及至少一個處理器,被配置為執(zhí)行由所述基于圖的程序規(guī)范指定的程序,所述執(zhí)行包括:經(jīng)由連接到所述多個組件中的第一組件的集合輸出端口以及所述多個組件中的第二組件的輸入端口的鏈路,以第一順序?qū)?shù)據(jù)元素的第一集合中的兩個或更多數(shù)據(jù)元素接收到第一存儲區(qū)中,以及調(diào)用對應(yīng)于所述第二組件的任務(wù)的多個實例以處理數(shù)據(jù)元素的所述第一集合中的數(shù)據(jù)元素,包括:以第二順序從所述第一存儲區(qū)取出數(shù)據(jù)元素,直到任何特定實例完成處理一個或多個數(shù)據(jù)元素后不阻止調(diào)用任何實例,其中所述第一順序不同于所述第二順序。

各個方面可以具有一個或多個以下優(yōu)點。

本文所描述的技術(shù)還便于在其層級結(jié)構(gòu)的各個層級處使用非常規(guī)技術(shù)特征來高效處理計算系統(tǒng)中的大量數(shù)據(jù)。這些技術(shù)特征在計算系統(tǒng)的各種操作階段(包括設(shè)計時,編譯時和運行時)一起工作。編程平臺使得基于圖的程序規(guī)范能夠在設(shè)計時指定期望的計算。編譯時編譯器準(zhǔn)備目標(biāo)程序規(guī)范,以便在運行時在計算系統(tǒng)的多個服務(wù)器之間有效地分配細(xì)粒度任務(wù)。例如,根據(jù)基于圖的程序規(guī)范中的任何控制流和數(shù)據(jù)流約束來配置多個任務(wù)。運行時系統(tǒng)支持以提高計算效率(例如,以給定計算資源的每單位被處理記錄的數(shù)量為單位)的方式對并發(fā)執(zhí)行的這些任務(wù)進(jìn)行動態(tài)分配。各種技術(shù)特征一起工作以實現(xiàn)相對于常規(guī)系統(tǒng)的效率增益。

例如,計算系統(tǒng)能夠以有利于并行執(zhí)行的方式,使用對應(yīng)于數(shù)據(jù)處理圖(或其它基于圖的程序規(guī)范)的組件的任務(wù)來處理數(shù)據(jù)元素。計算系統(tǒng)能夠識別用于提供與特定類型的存儲相關(guān)聯(lián)的數(shù)據(jù)元素集合的集合型輸出端口。例如,緩存區(qū)可以被配置為以第一順序接收數(shù)據(jù)元素,然后在調(diào)用任務(wù)的實例處理數(shù)據(jù)元素之后,可以以第二順序取出數(shù)據(jù)元素,而不阻止任何實例的調(diào)用,直到任何特定實例完成處理一個或多個數(shù)據(jù)元素后。計算系統(tǒng)能夠以這種靈活性進(jìn)行操作,這有利于任務(wù)并行化,因為集合型輸出端口向運行時系統(tǒng)發(fā)信號,以許可重新排序集合內(nèi)的數(shù)據(jù)元素。因此,計算系統(tǒng)可以確保集合上的計算被并行化,提高了計算系統(tǒng)的內(nèi)部功能的效率并且有助于數(shù)據(jù)處理圖的有效執(zhí)行。

當(dāng)執(zhí)行本文所描述的方法時,這些技術(shù)還表現(xiàn)出對計算系統(tǒng)的內(nèi)部功能的進(jìn)一步的技術(shù)效果,諸如減少對存儲器和其他計算資源的需求,以及減少系統(tǒng)在處理各個數(shù)據(jù)元素時的延遲。特別地,這些優(yōu)點有助于數(shù)據(jù)處理圖的高效執(zhí)行。例如,由于在執(zhí)行圖時由其他進(jìn)程(例如,Unix進(jìn)程)啟動多個進(jìn)程,因而傳統(tǒng)的基于圖的計算系統(tǒng)可能具有相對較高的延遲(例如,幾十毫秒的量級),導(dǎo)致這些進(jìn)程的累積啟動時間。然而,本文描述的技術(shù)通過允許單個進(jìn)程內(nèi)的程序代碼直接啟動其他程序代碼而不需要進(jìn)程啟動開銷,從而有利于實現(xiàn)相對較低的延遲時間(例如,幾十微秒的數(shù)量級)以及每秒處理的數(shù)據(jù)的更高的吞吐量。有助于數(shù)據(jù)處理圖的高效執(zhí)行的其他方面在以下描述中將顯而易見。

從下面的描述和權(quán)利要求書中,本發(fā)明的其它特征和優(yōu)點將變得顯而易見。

附圖說明

圖1是基于任務(wù)的計算系統(tǒng)的框圖。

圖2A是具有控制和數(shù)據(jù)端口的數(shù)據(jù)處理圖的一部分的示例。

圖2B-圖2C是具有控制端口和數(shù)據(jù)端口的數(shù)據(jù)處理圖的示例。

圖3A是包括多個標(biāo)量輸出端口到標(biāo)量輸入端口連接的數(shù)據(jù)處理圖。

圖3B是包括多個集合輸出端口到集合輸入端口連接的數(shù)據(jù)處理圖。

圖3C是包括集合輸出端口到標(biāo)量輸入端口連接和標(biāo)量輸出端口到集合輸入端口連接的數(shù)據(jù)處理圖。

圖4A是兩個組件之間的標(biāo)量端口到標(biāo)量端口連接。

圖4B是兩個組件之間的集合端口到集合端口連接。

圖4C是兩個組件之間的集合端口到標(biāo)量端口連接,包括執(zhí)行集入口點。

圖4D是兩個組件之間的標(biāo)量端口到集合端口連接,包括執(zhí)行集出口點。

圖5是應(yīng)用基于堆棧的分配算法的數(shù)據(jù)處理圖。

圖6是應(yīng)用基于全局映射的分配算法的數(shù)據(jù)處理圖。

圖7是具有用戶定義的執(zhí)行集的數(shù)據(jù)處理圖。

圖8A和圖8B示出了數(shù)據(jù)處理圖中的“相同集”關(guān)系。

圖9是具有復(fù)制數(shù)據(jù)元素的入口點的數(shù)據(jù)處理圖。

圖10A-圖10C示出了用戶界面工作流。

圖11A是具有非法執(zhí)行集的數(shù)據(jù)處理圖。

圖11B是具有非法執(zhí)行集循環(huán)的數(shù)據(jù)處理圖。

圖12A-圖12B是數(shù)據(jù)處理圖和對應(yīng)的控制圖的示例的圖。

圖13A-圖13B是示例性執(zhí)行狀態(tài)機的狀態(tài)轉(zhuǎn)換圖。

圖14是一組處理引擎的圖。

具體實施方式

參考圖1,基于任務(wù)的計算系統(tǒng)100使用高級程序規(guī)范110來控制計算平臺150的計算資源和存儲資源,以執(zhí)行由程序規(guī)范110指定的計算。編譯器/解釋器120接收高級程序規(guī)范110并生成可由基于任務(wù)的運行時接口/控制器140執(zhí)行的形式的基于任務(wù)的規(guī)范130。編譯器/解釋器120識別一個或多個“組件”的一個或多個“執(zhí)行集”,其可以單獨地或作為單元被實例化為要應(yīng)用于多個數(shù)據(jù)元素中每一個元素的細(xì)粒度任務(wù)。如下面更詳細(xì)描述的,編譯或解釋進(jìn)程的一部分涉及識別這些執(zhí)行集并且準(zhǔn)備所述執(zhí)行集用于執(zhí)行。應(yīng)當(dāng)理解,編譯器/解釋器120可以使用包括諸如解析高級程序規(guī)范110、驗證語法、類型檢查數(shù)據(jù)格式、生成任何錯誤或警告以及準(zhǔn)備基于任務(wù)的規(guī)范130之類的步驟的各種算法中的任何算法,并且例如編譯器/解釋器120可以利用各種技術(shù)來優(yōu)化在計算平臺150上執(zhí)行的計算的效率。由編譯器/解釋器120生成的目標(biāo)程序規(guī)范本身可以是將由系統(tǒng)100的另一部分進(jìn)一步處理(例如,進(jìn)一步編譯、解釋等)以產(chǎn)生基于任務(wù)的規(guī)范130的中間形式。下面的討論概述了這種變換的一個或多個示例,但是當(dāng)然,例如由編譯器設(shè)計的技術(shù)人員將理解的,用于變換的其他方法也是可能的。

通常,計算平臺150由多個計算節(jié)點152(例如,提供分布式計算資源和分布式存儲資源這二者的個體服務(wù)器計算機)組成,從而實現(xiàn)高度并行性。如下面進(jìn)一步詳細(xì)討論的,在高級程序規(guī)范110中表示的計算在計算平臺150上被執(zhí)行為相對細(xì)粒度的任務(wù),進(jìn)一步實現(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ù)處理特性取決于不同類型的端口如何鏈接在一起。例如,如下面更詳細(xì)描述的,不同類型的端口之間的鏈路可以導(dǎo)致提供層級形式的并行性的不同“執(zhí)行集”中的組件的嵌套子集。某些數(shù)據(jù)處理特性由端口的類型所暗示。組件可能具有的不同類型的端口包括:

·集合輸入或輸出端口,意味著組件的實例將分別讀取或?qū)懭雽⑼ㄟ^耦合到該端口的鏈路的集合(collection)的所有數(shù)據(jù)元素。對于在它們的集合端口之間具有單個鏈路的一對組件,通常允許下游組件在上游組件正在寫入數(shù)據(jù)元素時讀取這些數(shù)據(jù)元素,從而實現(xiàn)上游組件和下游組件之間的流水線并行性。如下面更詳細(xì)描述的,數(shù)據(jù)元素也可以被重新排序,這使得并行化具有效率。在一些圖形表示中,例如在編程圖形界面中,這樣的集合端口通常由組件處的正方形連接符指示。

·標(biāo)量輸入或輸出端口,意味著組件的一個實例將分別從耦合到端口的鏈路讀取或?qū)懭胫炼嘁粋€數(shù)據(jù)元素。對于在其標(biāo)量端口之間具有單個鏈路的一對組件,在上游組件已經(jīng)完成執(zhí)行之后通過使用作為控制傳送的單個數(shù)據(jù)元素的傳送來強制下游組件的串行執(zhí)行。在一些圖形表示中,例如在編程圖形界面中,這樣的標(biāo)量端口通常由該組件處的三角形連接符指示。

·控制輸入或輸出端口,類似于標(biāo)量輸入或輸出,但是不需要發(fā)送數(shù)據(jù)元素,并且用于在組件之間通信控制的傳送。對于具有在它們的控制端口之間的鏈路的一對組件,在上游組件已經(jīng)完成執(zhí)行之后強制下游組件的串行執(zhí)行(即使那些組件也具有集合端口之間的鏈路)。在一些圖形表示中,例如在編程圖形界面中,這樣的控制端口通常由組件處的圓形連接符指示。

這些不同類型的端口實現(xiàn)了數(shù)據(jù)處理圖的靈活設(shè)計,允許數(shù)據(jù)流和控制流與端口類型的重疊屬性的強大組合。特別地,存在兩種類型的端口(稱為“數(shù)據(jù)端口”):集合端口和標(biāo)量端口,用于傳送一些形式的數(shù)據(jù);還存在兩種類型的端口(稱為“串行端口”):標(biāo)量端口和控制端口,用于強制串行執(zhí)行。數(shù)據(jù)處理圖通常將具有作為“源組件”而沒有任何連接的輸入數(shù)據(jù)端口的一個或多個組件,以及作為“宿(sink)組件”而沒有任何連接的輸出數(shù)據(jù)端口的一個或多個組件。一些組件將具有連接的輸入和輸出數(shù)據(jù)端口。在一些實施例中,不允許圖具有循環(huán),因此必須是有向無環(huán)圖(DAG)。該特征可以用于利用DAG的某些特性,如下面更詳細(xì)描述的。

在數(shù)據(jù)處理圖的組件上使用專用控制端口還使得能夠靈活控制計算的不同部分,這種靈活控制使用某些其他控制流技術(shù)是不可能實現(xiàn)的。例如,能夠在數(shù)據(jù)流圖之間應(yīng)用依賴性約束的作業(yè)控制解決方案無法提供由定義單個數(shù)據(jù)流圖內(nèi)的組件之間的依賴性約束的控制端口實現(xiàn)的精細(xì)粒度控制。此外,將組件分配到順序運行的不同階段的數(shù)據(jù)流圖不允許對單個組件排序方面的靈活性。例如,使用簡單階段不可能的嵌套控制拓?fù)淇梢允褂帽疚拿枋龅目刂贫丝诤蛨?zhí)行集來定義。這種更大的靈活性也可以潛在地通過允許更多的組件盡可能地并發(fā)運行來提高性能。

通過以不同的方式連接不同類型的端口,開發(fā)人員能夠在數(shù)據(jù)處理圖的組件的端口之間指定不同類型的鏈路配置。例如,一種類型的鏈路配置可以對應(yīng)于連接到相同類型的端口的特定類型的端口(例如,標(biāo)量到標(biāo)量鏈路),另一種類型的鏈路配置可以對應(yīng)于連接到不同類型的端口的特定類型的端口(例如,集合到標(biāo)量鏈路)。這些不同類型的鏈接配置既用作開發(fā)人員在視覺上識別與數(shù)據(jù)處理圖的一部分相關(guān)聯(lián)的預(yù)期行為的方式,又用作向編譯器/解釋器120指示啟用該行為所需的對應(yīng)類型的編譯進(jìn)程的方式。雖然本文描述的示例使用用于不同類型的端口的獨特形狀以可視地表示不同類型的鏈路配置,但是系統(tǒng)的其他實現(xiàn)方式可以通過提供不同類型的鏈路并且為每種類型的鏈路分配獨特的視覺指示符(例如,厚度,線型,顏色等)來區(qū)分不同類型的鏈路配置的行為。然而,為了用上面列出的三種類型的端口使用鏈路類型而不是端口類型來表示相同種類的鏈路配置,將存在多于三種類型的鏈路(例如,標(biāo)量到標(biāo)量、集合到集合、控制到控制、集合到標(biāo)量、標(biāo)量到集合、標(biāo)量到控制等)。其他示例可以包括不同類型的端口,但是沒有在數(shù)據(jù)處理圖內(nèi)可視地明確指示端口類型。

編譯器/解釋器120執(zhí)行準(zhǔn)備數(shù)據(jù)處理圖用于執(zhí)行的過程。第一過程是執(zhí)行集發(fā)現(xiàn)預(yù)處理過程,用于識別組件的潛在的嵌套執(zhí)行集的層級結(jié)構(gòu)。第二過程是控制圖生成過程,用于為每個執(zhí)行集生成對應(yīng)的控制圖,編譯器/解釋器120將使用該控制圖來形成控制代碼,該控制代碼將在運行時有效地實現(xiàn)狀態(tài)機,用于控制每個執(zhí)行集內(nèi)的組件的執(zhí)行。下面將更詳細(xì)地描述這些過程中的每一個。

具有至少一個輸入數(shù)據(jù)端口的組件指定要對每個輸入數(shù)據(jù)元素或集合(或其多個輸入端口上的一元組的數(shù)據(jù)元素和/或集合)執(zhí)行的處理。這種規(guī)范的一種形式是作為將要對一個或一元組輸入數(shù)據(jù)元素和/或集合執(zhí)行的過程。如果組件具有至少一個輸出數(shù)據(jù)端口,則其可以產(chǎn)生對應(yīng)的一個或一元組輸出數(shù)據(jù)元素和/或集合??梢砸愿呒壍幕谡Z句的語言(例如,使用Java源語句或例如在美國專利8,069,129“Editing and Compiling Business Rules(編輯和編譯業(yè)務(wù)規(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ù)集)的記錄,并且記錄的集合可以是表中的所有記錄。例如,具有單個標(biāo)量輸入端口和單個標(biāo)量輸出端口的組件的一種類型的工作過程包括接收一個輸入記錄,對該記錄執(zhí)行計算,以及提供一個輸出記錄。另一種類型的工作過程可以指定從多個標(biāo)量輸入端口接收的一元組輸入記錄如何被處理以形成在多個標(biāo)量輸出端口上發(fā)出的輸出記錄的一元組。

由數(shù)據(jù)處理圖指定的計算的語義定義固有地是平行的,因為它表示對由圖定義的計算的處理的順序和并發(fā)性的約束和/或無約束。因此,計算的定義不要求結(jié)果等同于計算步驟的某種順序排序。另一方面,計算的定義確實提供了需要對計算的部分進(jìn)行排序的特定約束以及對計算的部分的并行執(zhí)行的限制。

在數(shù)據(jù)處理圖的討論中,假定將組件的多個實例實現(xiàn)為運行時系統(tǒng)中的分開的“任務(wù)”,作為表示排序和并行約束的方式。在討論基于圖的規(guī)范本身的特性之后,將更全面地進(jìn)行將數(shù)據(jù)處理圖實現(xiàn)為基于任務(wù)的規(guī)范的更具體討論,其實現(xiàn)與語義定義一致的計算。

通常,數(shù)據(jù)處理圖中的每個組件將在圖的執(zhí)行期間在計算平臺中被多次實例化。每個組件的實例的數(shù)量可以取決于該組件被分配給多個執(zhí)行集中的哪一個。當(dāng)實例化組件的多個實例時,多于一個實例可以并行執(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)生單個輸出記錄并且端口被指示為標(biāo)量端口的示例中,可以執(zhí)行組件的多個實例,并且在工作過程的多次執(zhí)行之間沒有為不同的輸入記錄保持狀態(tài)。

此外,在一些實施例中,系統(tǒng)支持不遵循上面介紹的最細(xì)粒度規(guī)范的工作過程。例如,工作過程可以在內(nèi)部實現(xiàn)迭代,例如,其通過標(biāo)量端口接受單個記錄并通過集合端口提供多個輸出記錄。

如上所述,存在兩種類型的數(shù)據(jù)端口:集合端口和標(biāo)量端口,用于傳送一些形式的數(shù)據(jù);還存在兩種類型的串行端口:標(biāo)量端口和控制端口,用于強制串行執(zhí)行。在一些情況下,一種類型的端口可以通過鏈路連接到另一類型的端口。這些情況中的一些將在下面描述。在某些情況下,一種類型的端口將鏈接到同一類型的端口。兩個控制端口之間的鏈路(稱為“控制鏈路”)在鏈接的組件之間施加串行執(zhí)行排序,而不需要通過鏈路發(fā)送數(shù)據(jù)。兩個數(shù)據(jù)端口之間的鏈路(稱為“數(shù)據(jù)鏈路”)提供數(shù)據(jù)流,并且還在標(biāo)量端口的情況下強制串行執(zhí)行排序約束,并且在集合端口的情況下不需要串行執(zhí)行排序。典型的組件通常具有至少兩種端口,包括輸入和輸出數(shù)據(jù)端口(集合端口或標(biāo)量端口)以及輸入和輸出控制端口??刂奇溌穼⑸嫌谓M件的控制端口連接到下游組件的控制端口。類似地,數(shù)據(jù)鏈路將上游組件的數(shù)據(jù)端口連接到下游組件的數(shù)據(jù)端口。

開發(fā)人員可以使用圖形用戶界面從一組組件中指定特定的數(shù)據(jù)處理計算,每個組件執(zhí)行特定的任務(wù)(例如,數(shù)據(jù)處理任務(wù))。開發(fā)人員通過在顯示屏幕上顯示的畫布區(qū)域上組裝數(shù)據(jù)處理圖來進(jìn)行這樣的指定。這涉及將組件放置在畫布上,用適當(dāng)?shù)逆溌愤B接它們的各個端口,以及適當(dāng)?shù)嘏渲媒M件。以下簡單示例說明了在具有單對集合端口和單對控制端口的組件的情況下的某些行為。

圖2a示出了被組裝的數(shù)據(jù)處理圖的一部分包括第一組件210A的示例,第一組件210A具有輸入控制端口212A和輸出控制端口214A以及輸入集合端口216A和輸出集合端口218A??刂奇溌?20A,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)。如下面將更詳細(xì)地描述的,對于無序集合,數(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)用進(jìn)程或調(diào)取與由接收側(cè)的組件表示的任務(wù)相關(guān)聯(lián)的函數(shù)的進(jìn)程(或者在禁止的情況下省略這種調(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é)果,通過使標(biāo)量數(shù)據(jù)端口能夠連接到控制端口,可以提供額外的靈活性。

圖2B示出了示例性數(shù)據(jù)處理圖230,其利用了由將標(biāo)量端口連接到控制端口的能力所賦予的靈活性。

數(shù)據(jù)處理圖230的特征如下:標(biāo)記為“計算日期信息”的第一組件231,標(biāo)記為“制作每月報告?”的第二組件232,標(biāo)記為“制作每周報告”的第三組件233,標(biāo)記為“每月報告”的第四組件234,標(biāo)記為“制作每周報告?”的第五組件235和標(biāo)記為“每周報告”的第六組件236。數(shù)據(jù)處理圖230執(zhí)行過程,該過程總是產(chǎn)生每日報告、每日報告和每周報告、或所有三種報告。關(guān)于這些結(jié)果中的哪些將發(fā)生的決定取決于對由第一組件231提供的某些日期信息的評估。因此,圖2B示出了有效地控制執(zhí)行的數(shù)據(jù)的示例。

當(dāng)?shù)谝唤M件231將日期信息從輸出標(biāo)量端口提供到第二組件232的輸入標(biāo)量端口和第三組件233的輸入標(biāo)量端口時,執(zhí)行開始。沒有連接的輸入控制端口的第二組件232立即工作。包括第三組件233的所有其他組件具有連接的輸入控制端口,并且必須等待由適當(dāng)?shù)恼刂菩盘柤せ睢?/p>

第二組件232檢查該日期信息并確定是否適合制作每月報告。有兩種可能的結(jié)果:需要每月報告,或者不需要。第二組件232和第三組件233都具有兩個輸出標(biāo)量端口,并且都被配置為執(zhí)行選擇函數(shù),該選擇函數(shù)提供數(shù)據(jù)元素,該數(shù)據(jù)元素在一個輸出標(biāo)量端口(即,所選端口)上用作正控制信號并且在另一個輸出標(biāo)量端口上用作負(fù)控制信號。

如果基于日期信息,第二組件232確定不需要每月報告,則第二組件232將數(shù)據(jù)元素從其底部輸出標(biāo)量端口發(fā)送到第三組件233的輸入控制端口。該數(shù)據(jù)元素被解釋為正控制信號,其向第三組件233指示第二組件232已經(jīng)完成了對由第一組件231提供的數(shù)據(jù)的處理,并且第三組件233現(xiàn)在可以開始處理其接收的日期信息數(shù)據(jù)。

另一方面,如果第二組件232基于由第一組件231提供的日期信息確定需要每月報告,則第二組件232改為將被解釋為正控制信號的數(shù)據(jù)元素從其輸出標(biāo)量端口發(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)由其輸入標(biāo)量端口處理由第一組件231提供的數(shù)據(jù)。唯一的區(qū)別在于哪個組件觸發(fā)它開始處理:是第二組件232還是第四組件234。這是因為第三組件233上的兩個輸入控制端口將使用OR邏輯進(jìn)行組合,使得在任一端口(或兩者)接收的正控制信號將觸發(fā)處理。

圖230的其余部分以基本上相同的方式操作,只是第三組件233接管第二組件232的角色,第六組件236接管第四組件234的角色。

在被其輸入控制端口處來自第二組件232或第四組件234的控制信號激活時,第三組件233通過將第一組件231連接到第三組件233的數(shù)據(jù)鏈路檢查由第一組件231提供的日期信息。如果第三組件233基于日期信息確定不需要每周報告,則第三組件233將被解釋為正控制信號的數(shù)據(jù)元素從其輸出標(biāo)量端口之一發(fā)送到第五組件235的輸入控制端口。

另一方面,如果第三組件233確定需要每周報告,則第三組件233將被解釋為正控制信號的數(shù)據(jù)元素從其另一輸出標(biāo)量端口發(fā)送到第六組件236的輸入控制端口。第六組件236繼續(xù)創(chuàng)建每周報告。在完成時,第六組件236將被解釋為正控制信號的數(shù)據(jù)元素從其輸出標(biāo)量端口發(fā)送到第五組件235的輸入控制端口。

因此,第五組件235將總是最終執(zhí)行,唯一的區(qū)別是第三組件233還是第六組件236最終觸發(fā)第五組件235開始執(zhí)行。在從第三組件233或第六組件236接收到控制信號時,第五組件235創(chuàng)建每日報告。

圖2C還示出了標(biāo)量和集合數(shù)據(jù)端口的使用。

圖2C示出了數(shù)據(jù)處理圖240,其具有標(biāo)記為“輸入文件”的第一組件241,標(biāo)記為“從請求獲取文件名”的第二組件242,標(biāo)記為“讀取文件”的第三組件243,標(biāo)記為“是壞記錄?”的第四組件244,標(biāo)記為“無效記錄”的第五組件245,標(biāo)記為“生成壞記錄文件名”的第六組件246,標(biāo)記為“任何驗證錯誤?”的第七組件247和標(biāo)記為“發(fā)送警報”的第八組件248。此圖旨在將壞記錄寫入文件,并在檢測到這種壞記錄時發(fā)送警報。

組件241和243是用作數(shù)據(jù)的源的組件的示例,并且組件245是用作數(shù)據(jù)的宿(接收器)的組件的示例。組件241和243使用可以以文件系統(tǒng)(諸如本地文件系統(tǒng)或分布式文件系統(tǒng))中的各種格式中的任一種存儲的輸入文件作為其源。輸入文件組件讀取文件的內(nèi)容,并從該文件產(chǎn)生記錄的集合。標(biāo)量輸入端口(如組件243所示)提供指定要讀取的文件的位置(例如,路徑或統(tǒng)一資源定位符)和要使用的記錄格式的數(shù)據(jù)元素。在一些情況下,位置和記錄格式可以作為參數(shù)提供給輸入文件組件,在這種情況下,輸入標(biāo)量端口不需要連接到任何上游組件,并且不需要顯示(對于組件241也是如此)。集合輸出端口(如組件241和243兩者上的所示)提供記錄的集合。類似地,輸出文件組件(諸如組件245)將通過輸入集合端口接收的記錄的集合寫到輸出文件(其位置和記錄格式可以可選地由輸入標(biāo)量端口指定)。輸入文件組件或輸出文件組件還可以包括鏈接到另一組件(諸如組件245)的控制端口的控制輸入或輸出端口。

在所示的數(shù)據(jù)處理圖240中,較大的虛線矩形內(nèi)的組件是執(zhí)行集(execution set)的一部分。此執(zhí)行集包含嵌套在其中的另一個執(zhí)行集。該嵌套執(zhí)行集也在虛線矩形內(nèi)示出,其僅包含第四組件244。下面更詳細(xì)地討論執(zhí)行集。

在操作中,第一組件241讀取輸入文件。當(dāng)?shù)谝唤M件241正在執(zhí)行時,第一組件241經(jīng)由從輸出集合數(shù)據(jù)端口到第二組件242的輸入集合數(shù)據(jù)端口的數(shù)據(jù)鏈路將輸入文件內(nèi)的記錄的集合提供給第二組件。第二組件242的不同實例和其他下游組件(它們在同一執(zhí)行集中)可以針對集合中的每個記錄執(zhí)行,如下面將更詳細(xì)描述的。由于第二組件242沒有連接到其控制輸入的任何東西,所以第二組件242立即開始處理。在完成時,第二組件242在其輸出標(biāo)量端口上提供文件名。該文件名在相應(yīng)輸入標(biāo)量端口處由第三組件243和第六組件246兩者接收。

第三組件243立即讀取由文件名標(biāo)識的文件,并且在輸出集合端口上提供文件的內(nèi)容以用于遞送到第四組件244的實例的輸入標(biāo)量端口。同時,第六組件246接收相同的文件名并輸出另一文件名,其提供到連接于第五組件245和第七組件247的對應(yīng)輸入標(biāo)量端口的輸出標(biāo)量端口上。

在從第六組件246接收到文件名和從第四組件244接收到壞記錄時,第五組件245將壞記錄寫入文件名由第六組件246標(biāo)識的輸出文件。

第七組件247是唯一一個在其數(shù)據(jù)輸入端口接收數(shù)據(jù)時沒有準(zhǔn)備好被啟動執(zhí)行的組件。當(dāng)?shù)谖褰M件245完成對輸出文件的寫入時,第五組件245將控制信號從其控制輸出端口發(fā)送到第七組件247的輸入控制端口。如果第七組件247確定存在錯誤,則第七組件247提供數(shù)據(jù)到第八組件248的輸入標(biāo)量端口。這使得第八組件248生成警報。這提供了控制端口用于限制數(shù)據(jù)處理圖中的某些組件的執(zhí)行的示例。

應(yīng)當(dāng)清楚的是,當(dāng)一組多個上游組件都已達(dá)到特定狀態(tài)時,基于一個組件的狀態(tài)控制另一個組件中的處理的能力使得該組件可以控制處理。例如,數(shù)據(jù)處理圖可以支持去往或來自同一控制端口的多個控制鏈路??商娲兀谝恍崿F(xiàn)方式中,組件可以包括多個輸入和輸出控制端口。默認(rèn)邏輯可以被編譯器/解釋器120應(yīng)用。開發(fā)人員還可以提供用于確定如何組合控制信號的定制邏輯。這可以通過適當(dāng)?shù)夭贾媒M合邏輯以應(yīng)用于上游組件的各種控制鏈路,并且僅當(dāng)達(dá)到某個邏輯狀態(tài)時(例如,在默認(rèn)OR邏輯的情況下,當(dāng)所有上游組件已經(jīng)完成時,并且當(dāng)至少一個上游組件已經(jīng)發(fā)送激活控制信號時)觸發(fā)組件的啟動來實現(xiàn)。

通常,控制信號可以是觸發(fā)處理開始或觸發(fā)處理禁止的信號。前者是“正控制信號”,后者是“負(fù)控制信號”。然而,如果使用組合邏輯來確定是否應(yīng)該調(diào)用任務(wù)(觸發(fā)處理的開始),則邏輯可以“反轉(zhuǎn)”通常的解釋,使得僅當(dāng)所有輸入提供負(fù)控制信號時調(diào)用任務(wù)。通常,組合邏輯可以提供用于確定與控制圖對應(yīng)的狀態(tài)機中的下一狀態(tài)的任意“真值表”,下面將更詳細(xì)描述。

未連接的控制端口可以被分配默認(rèn)狀態(tài)。在一個實施例中,默認(rèn)狀態(tài)對應(yīng)于正控制信號。如下面更詳細(xì)地描述的,這可以通過在表示數(shù)據(jù)處理圖的控制圖中使用隱式開始組件和結(jié)束組件來實現(xiàn)。

各種組件上的不同類型的數(shù)據(jù)端口允許數(shù)據(jù)以不同的方式在組件之間通過鏈路傳遞,這取決于鏈接這些組件的輸入和輸出端口的類型。如上所述,標(biāo)量端口表示至多單個數(shù)據(jù)元素(即,0或1個數(shù)據(jù)元素)的生產(chǎn)(對于標(biāo)量輸出端口)或消耗(對于標(biāo)量輸入端口)。而集合端口表示一組潛在的多個數(shù)據(jù)元素的生產(chǎn)(對于集合輸出端口)或消耗(對于集合輸入端口)。通過在單個數(shù)據(jù)處理圖中支持兩種類型的數(shù)據(jù)端口,可以更有效地分配計算資源,并且可以在任務(wù)之間生成更復(fù)雜的控制流和數(shù)據(jù)流,從而允許開發(fā)人員容易地指示期望的行為。

參考圖3A,數(shù)據(jù)處理圖300包括一連串三個連接的組件:第一組件(A1)302,第二組件(B1)304和第三組件(C1)306。第一組件包括集合型輸入端口308以及標(biāo)量型輸出端口310。第二組件304包括標(biāo)量型輸入端口312和標(biāo)量型輸出端口314。第三組件包括標(biāo)量型輸入端口316和集合型輸出端口318。

第一鏈路320將第一組件302的標(biāo)量輸出端口310連接到第二組件304的標(biāo)量輸入端口312,這允許數(shù)據(jù)在第一組件302和第二組件304之間傳遞,并且同時強制第一組件302和第二組件304的串行執(zhí)行。類似地,第二鏈路322將第二組件304的標(biāo)量輸出端口314連接到第三組件306的標(biāo)量輸入端口316,這允許數(shù)據(jù)在第二組件304和第三組件306之間傳遞,并且強制第二組件304和第三組件306的串行執(zhí)行。

由于圖3A中標(biāo)量端口的互連,第二組件304僅在第一組件302完成之后開始執(zhí)行(并且在第一鏈路320上傳遞單個數(shù)據(jù)元素),并且第三組件306僅在第二組件304完成之后開始執(zhí)行(并且在第二鏈路322上傳遞單個數(shù)據(jù)元素)。也就是說,數(shù)據(jù)處理圖中三個組件中的每一個以嚴(yán)格的順序A1/B1/C1運行一次。

在一些示例中,一個或多個組件可以被置于禁止?fàn)顟B(tài),這意味著一個或多個組件不執(zhí)行,并因此不將任何數(shù)據(jù)元素從其輸出端口傳遞出去。例如,通過確保將不執(zhí)行任何有用處理的組件不需要專用于它們的計算資源(例如,進(jìn)程或存儲器),使得能夠禁止組件,避免浪費資源。具有僅連接到被禁止組件的輸出端口的標(biāo)量輸入端口的任何組件不會執(zhí)行,因為它們不接收數(shù)據(jù)。例如,如果第一組件302被置于禁止?fàn)顟B(tài),則第二組件304的標(biāo)量輸入端口312不從第一組件302的標(biāo)量輸出端口310接收數(shù)據(jù),因此不執(zhí)行。由于第二組件304不執(zhí)行,因此第三組件306的標(biāo)量輸入端口316不接收來自第二組件304的標(biāo)量輸出端口314的數(shù)據(jù),并且也不執(zhí)行。因此,在兩個標(biāo)量端口之間傳遞的數(shù)據(jù)也用作正控制信號,類似于在兩個鏈接的控制端口之間發(fā)送的信號。

在圖3A的示例性數(shù)據(jù)處理圖中,第一組件302的輸入端口308和第三組件318的輸出端口恰好是集合端口,其對連接它們的標(biāo)量端口強加的第一組件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中的每一個指定如何處理一個或多個輸入元素的集合以生成一個或多個輸出元素的集合。在特定輸入元素和特定輸出元素之間并不必然存在一一對應(yīng)關(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ù)元素實例化多達(dá)一個組件的實例來動態(tài)地并行化數(shù)據(jù)元素的處理(例如,取決于運行時可用的計算資源)??蛇x地,在特殊情況下,可以在具有多個輸入集合端口的組件中跨數(shù)據(jù)元素維護(hù)狀態(tài)。但在一般情況下,可以允許運行時系統(tǒng)對組件的任務(wù)并行化。例如,如果運行時系統(tǒng)檢測到?jīng)]有被維持的全局狀態(tài),則可以允許對任務(wù)并行化。一些組件還可以被配置為支持維持狀態(tài),在這種情況下可以不允許并行化。如果集合是無序的,則不需要在數(shù)據(jù)元素之間保持順序意味著第二組件328的每個實例一旦可用就可以向第三組件330提供其輸出數(shù)據(jù)元素,并且第三組件330可以在第二組件328的所有實例已經(jīng)完成之前開始處理這些數(shù)據(jù)元素。

在一些示例中,圖開發(fā)者可以明確地指示可以通過將一個組件的集合型輸出端口連接到另一個組件的標(biāo)量型輸入端口來動態(tài)地并行化數(shù)據(jù)集合中數(shù)據(jù)元素的處理。這種指示還要求在集合的不同元素的處理之間無需維持狀態(tài)。參考圖3C,數(shù)據(jù)處理圖348包括一連串三個連接的組件:第一組件(A3)350、第二組件(B3)352和第三組件(C3)354。第一組件350包括集合型輸入端口356和集合型輸出端口358。第二組件352包括標(biāo)量型輸入端口360和標(biāo)量型輸出端口362。第三組件354包括集合型輸入端口364和集合型輸出端口366。

第一組件的集合型輸出端口358通過第一鏈路368連接到第二組件352的標(biāo)量型輸入端口360,并且第二組件352的標(biāo)量型輸出端口362通過第二連接370連接到集合型輸入端口364。如下面更詳細(xì)描述的,從集合型輸出端口到標(biāo)量型輸入端口的鏈路意味著進(jìn)入執(zhí)行集的入口點,并且從標(biāo)量型輸出端口到集合型輸入端口的鏈路意味著執(zhí)行集的出口點。非常普遍的情況是,如下面更詳細(xì)地描述的,包括在執(zhí)行集中的多個組件可以由運行時控制器動態(tài)地并行化以處理來自數(shù)據(jù)元素集合的數(shù)據(jù)元素。

在圖3C中,第一組件350的集合型輸出端口358和第二組件352的標(biāo)量型輸入端口360之間的鏈路368意味著進(jìn)入執(zhí)行集的入口點。第二組件352的標(biāo)量型輸出端口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)預(yù)處理過程,以準(zhǔn)備用于執(zhí)行的數(shù)據(jù)處理圖。在一般意義上,如本文所使用的,術(shù)語“執(zhí)行集”是指可以作為單元被調(diào)用并應(yīng)用于數(shù)據(jù)的一部分(諸如輸出集合端口的數(shù)據(jù)元素的一部分)的一個或多個組件的集合。因此,對于每個輸入數(shù)據(jù)元素(或呈現(xiàn)給執(zhí)行集的一個或多個輸入端口的多個輸入數(shù)據(jù)元素的元組)實施執(zhí)行集中的每個組件的至多一個實例。在執(zhí)行集內(nèi),通過到標(biāo)量和控制端口的鏈路強加排序約束,只要不違反排序約束,就允許執(zhí)行集中組件的并行執(zhí)行。由編譯器/解釋器120為執(zhí)行集準(zhǔn)備的代碼可以包括指示在執(zhí)行代碼時如何實施與組件相對應(yīng)的任務(wù)(例如,并行度)的嵌入信息(例如,注釋或修改符)。在對接收到的集合中多個數(shù)據(jù)元素的元組執(zhí)行執(zhí)行集的一個實例的示例中,所述元組可包括例如固定數(shù)量的數(shù)據(jù)元素或共享一些特性(例如,公共鍵值)的多個數(shù)據(jù)元素。在存在被允許并行執(zhí)行的至少一些組件的示例中,可以使用多個任務(wù)來實現(xiàn)執(zhí)行集,例如,用于作為整體的執(zhí)行集的任務(wù),以及用于一個或多個組件的實例的并發(fā)執(zhí)行的一個或多個子任務(wù)。因此,表示執(zhí)行集的不同實例的任務(wù)本身可以被分解成甚至更細(xì)粒度的任務(wù),例如具有可以并發(fā)執(zhí)行的子任務(wù)。用于不同執(zhí)行集的任務(wù)通??梢元毩⒉⑿械貓?zhí)行。因此,如果大型數(shù)據(jù)集有例如一百萬條記錄,則可能有一百萬個獨立的任務(wù)。一些任務(wù)可以在計算平臺150的不同節(jié)點152上執(zhí)行。任務(wù)可以使用可以被有效地并發(fā)執(zhí)行的輕量線程來執(zhí)行,甚至在單個節(jié)點152上也是如此。

通常,由分配算法標(biāo)識的執(zhí)行集(即,除根執(zhí)行集之外的執(zhí)行集)通過在執(zhí)行集的邊界處的“驅(qū)動”標(biāo)量數(shù)據(jù)端口來接收數(shù)據(jù)元素。對于在執(zhí)行集的驅(qū)動輸入標(biāo)量數(shù)據(jù)端口處接收的每個數(shù)據(jù)元素,執(zhí)行集內(nèi)的每個組件執(zhí)行一次(如果激活)或根本不執(zhí)行(如果禁止)。執(zhí)行集的多個實例可以被實例化并且并行地執(zhí)行以處理從上游集合端口對執(zhí)行集可用的多個數(shù)據(jù)元素。可以在運行時確定執(zhí)行集的并行度(并且包括不使執(zhí)行集并行化的可能決策),并且并行度僅受到運行時可用的計算資源的限制。執(zhí)行集的獨立實例的各個輸出在執(zhí)行集的(多個)輸出端口處被聚集,而不管順序如何,并且被提供給下游組件??商娲?,在其他實施例中,可以識別不同于根執(zhí)行集的不需要驅(qū)動輸入標(biāo)量數(shù)據(jù)端口的執(zhí)行集(在一些情況下,基于用戶輸入)。這樣的沒有驅(qū)動輸入標(biāo)量數(shù)據(jù)端口的執(zhí)行集如果合適的話可以使用本文所述的過程在單個實例中執(zhí)行(例如,下面描述的鎖定的執(zhí)行集)或在多個實例中并行地執(zhí)行。例如,可以設(shè)置確定執(zhí)行集將被執(zhí)行的次數(shù)和/或?qū)⒈粓?zhí)行的執(zhí)行集的并行實例的數(shù)量的參數(shù)。

非常常見的情況是,執(zhí)行集發(fā)現(xiàn)過程使用確定數(shù)據(jù)處理圖內(nèi)的組件的子集的分配算法,所述子集將被應(yīng)用為對數(shù)據(jù)元素的無序集合的輸入元素的集。分配算法遍歷數(shù)據(jù)處理圖并基于分配規(guī)則將每個組件分配給子集。如在以下示例中清楚可見的,給定數(shù)據(jù)處理圖可以包括嵌套在執(zhí)行集層級結(jié)構(gòu)的不同級別中的多個執(zhí)行集。

在本文所述的數(shù)據(jù)處理圖中,存在兩種類型的數(shù)據(jù)端口:標(biāo)量數(shù)據(jù)端口和集合數(shù)據(jù)端口。通常,如果一對鏈接的組件(即,圖4A到圖4D的上游組件A 402和下游組件B 404)通過相同類型的端口之間的鏈路連接,則在默認(rèn)情況下它們將在相同的執(zhí)行集中(除非它們由于另一個原因在不同的執(zhí)行集中)。在圖4A中,組件A 402具有輸出端口406,該端口具有標(biāo)量類型,并且組件B 404具有輸入端口408,該端口具有標(biāo)量類型。由于組件A 402和組件B 404之間的鏈路410連接兩個標(biāo)量型端口,因此在該示例中組件A 402和組件B 404處于相同的執(zhí)行集中。在圖4A中,由于組件A 402和組件B 404之間的鏈路是標(biāo)量到標(biāo)量鏈路,所以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ù)元素。

當(dāng)鏈路兩端的端口類型之間存在不匹配時,執(zhí)行集層級結(jié)構(gòu)的級別中存在隱性更改。具體地,不匹配的端口表示在執(zhí)行集層級結(jié)構(gòu)的特定級別處的執(zhí)行集的入口點或出口點。在一些示例中,執(zhí)行集入口點被定義為集合型輸出端口和標(biāo)量型輸入端口之間的鏈路。在圖4C中,在組件A 402和組件B 404之間的鏈路410處示出了執(zhí)行組入口點424的一個示例,這是因為組件A 402的輸出端口416是集合型端口,而組件B 404的輸入端口418是標(biāo)量型端口。

在一些示例中,執(zhí)行集出口點被定義為標(biāo)量型輸出端口和集合型輸入端口之間的鏈路。參考圖4D,在組件A 402與組件B 404之間的鏈路410處示出了執(zhí)行組出口點426的一個示例,這是因為組件A 402的輸出端口420是標(biāo)量型端口,而組件B 404的輸入端口422是集合型端口。

在編譯器/解釋器120進(jìn)行編譯和/或解釋之前實現(xiàn)的分配算法使用執(zhí)行集入口點和執(zhí)行集出口點來發(fā)現(xiàn)數(shù)據(jù)處理圖中存在的執(zhí)行集。

2.1基于堆棧的分配算法

為了說明的目的,在第一示例中,數(shù)據(jù)處理圖具有簡單的一維圖結(jié)構(gòu),并且使用基于堆棧的算法示出更簡單的分配算法。在基于堆棧的分配算法中,數(shù)據(jù)處理圖中的每個組件用一個或多個“ID字符串”標(biāo)記,該“ID字符串”由以分隔字符‘/’分隔的整數(shù)組成。分隔字符‘/’出現(xiàn)在給定組件的ID字符串中的次數(shù)確定執(zhí)行集層級結(jié)構(gòu)中的組件的級別。在一些示例中,組件可以具有多個輸入鏈路,并且因此可以具有多個ID字符串。在這種情況下,算法具有下面更詳細(xì)描述的規(guī)則,用于確定使用哪個ID字符串。

在基于堆棧的分配算法的一個示例中,編譯器/解釋器120根據(jù)以下過程在上游到下游方向上遍歷數(shù)據(jù)處理圖。最初,最上游的組件用ID字符串‘0’標(biāo)記,指示它是執(zhí)行集層級結(jié)構(gòu)中根級別上的組件。

然后遍歷從最上游組件到最下游組件的路徑上的鏈路和組件。如果遇到上游組件的集合型輸出端口和下游組件的集合型輸入端口之間的鏈路,則上游組件的ID字符串被傳播到下游組件。類似地,如果遇到上游組件的標(biāo)量型輸出端口和下游組件的標(biāo)量型輸入端口之間的鏈路,則上游組件的ID字符串被傳播到下游組件。

如果遇到上游組件的集合型輸出端口和下游組件的標(biāo)量型輸入端口之間的鏈路,則向下游組件分配包括上游組件的標(biāo)記其末尾附加‘/n’的標(biāo)記,其中n是<所有現(xiàn)有ID字符串整數(shù)中最大的整數(shù)>+l。如果遇到上游組件的標(biāo)量型輸出端口和下游組件的集合型輸入端口之間的鏈路,則向下游組件分配包括上游組件的標(biāo)記去除其最右邊的ID字符串整數(shù)(以及其分隔字符‘/’)的標(biāo)記。

在一些示例中,各種條件可以被認(rèn)為是非法的,并且將導(dǎo)致算法中的錯誤(例如,如果組件在執(zhí)行集層級結(jié)構(gòu)中相同級別上具有兩個不同的ID字符串,或者在執(zhí)行集中存在循環(huán))。

參考圖5,將上述基于堆棧的分配算法應(yīng)用于示例性數(shù)據(jù)處理圖550,導(dǎo)致發(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),基于堆棧的分配算法首先標(biāo)記最上游組件,具有ID字符串‘0’的第一數(shù)據(jù)集656。然后基于堆棧的分配算法遍歷通過數(shù)據(jù)處理圖550的一維路徑的組件。在遍歷該路徑時,基于堆棧的分配算法首先遍歷從第一數(shù)據(jù)集556到第一組件558的鏈路。由于第一數(shù)據(jù)集556的輸出端口是集合型輸出端口,并且第一組件558的輸入端口是標(biāo)量型輸入端口,所以第一組件558被分配ID字符串‘0/1’,其是第一數(shù)據(jù)集556的ID字符串在其末尾附加‘/1’的標(biāo)記,其中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的輸入端口是標(biāo)量型輸入端口,所以第二組件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的輸出端口是標(biāo)量型輸出端口,并且第三組件562的輸入端口是標(biāo)量型輸入端口,所以第二組件560的ID字符串(即,‘0/1/2’)被傳播到第三組件562。

然后,分配算法遍歷從第三組件562到第四組件564的鏈路。由于第三組件562的輸出端口是標(biāo)量型輸出端口,并且第四組件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的輸出端口是標(biāo)量型輸出端口,并且第五組件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ù)元素的集合的流和個體標(biāo)量數(shù)據(jù)元素之間的變化。例如,表示鏈路的線在集合端口和指示符之間可以更粗,而在指示符和標(biāo)量端口之間更細(xì)。

基于堆棧的分配算法的結(jié)果包括數(shù)據(jù)處理圖550的版本,其中每個組件用ID字符串標(biāo)記。在圖5的示例中,第一數(shù)據(jù)集556、第二數(shù)據(jù)集568和第五組件566都用ID字符串‘0’標(biāo)記。第一組件558和第四組件564用ID字符串‘0’標(biāo)記。第二組件560和第三組件562各自用ID字符串‘0/1/2’標(biāo)記。

每個唯一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)圖的事實??梢允褂猛?fù)渑判蚝蟮捻樞騺硖幚碛邢驘o環(huán)圖,以確保圖的每個組件僅在緊鄰該組件的上游的所有組件被處理之后得到處理。由于已知已經(jīng)處理了組件的緊接上游的所有組件,所以可以通過選擇該組件直接上游的(在執(zhí)行集層級結(jié)構(gòu)中)最深嵌套組件的ID字符串來確定該組件的ID字符串。

在一些示例中,基于全局映射的分配算法使用諸如Kahn算法的標(biāo)準(zhǔn)拓?fù)渑判蛩惴▉慝@得給定數(shù)據(jù)處理圖的拓?fù)渑判蚝蟮捻樞?。Kahn算法通過以下偽代碼概述:

L←將要包含被排序元素的空列表

S←沒有進(jìn)入邊的所有節(jié)點的集合

只要S是非空的,進(jìn)行以下動作:

從S去除節(jié)點n

將n添加到L的尾部

對于具有n到m的邊e的每個節(jié)點m,進(jìn)行以下動作:

從圖中去除邊e

如果m沒有其它進(jìn)入邊,則

將m插入S

如果圖具有多個邊,則

返回錯誤(圖具有至少一個循環(huán))

否則

返回L(拓?fù)渑判蚝蟮捻樞?

在確定拓?fù)渑判蚝蟮捻樞蛑?,基于全局映射的分配算法以拓?fù)渑判蚝蟮捻樞虮闅v數(shù)據(jù)處理圖的組件,以確定每個組件的適當(dāng)ID字符串(或簡稱ID號)。特別地,當(dāng)遍歷組件時,數(shù)據(jù)處理圖的每個組件將其ID字符串復(fù)制到其輸出端口。直接位于上游組件下游且沒有由于執(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的各個組件之前,將拓?fù)渑判蛩惴?例如,Kahn算法)應(yīng)用于數(shù)據(jù)處理圖,得到以下拓?fù)渑判蚝蟮捻樞颍篋1,C1,C2,C3,C4,C5,C6,D2。

利用確定的拓?fù)渑判蚝蟮捻樞?,基于全局映射的分配算法以拓?fù)渑判蚝蟮捻樞虮闅v數(shù)據(jù)處理圖的組件,以確定每個組件的適當(dāng)ID字符串,從而導(dǎo)致發(fā)現(xiàn)“1級”執(zhí)行集630和“2級”執(zhí)行集631(除了根“0級”執(zhí)行集以外)。為了實現(xiàn)兩個執(zhí)行集630、631的發(fā)現(xiàn),基于全局映射的分配算法首先標(biāo)記最上游組件,具有ID字符串‘0’的第一數(shù)據(jù)集(D1)632。然后基于堆棧的分配算法以拓?fù)渑判蚝蟮捻樞虮闅v數(shù)據(jù)處理圖628的組件和鏈路。

基于全局映射的分配算法首先遍歷從第一數(shù)據(jù)集(D1)632到第一組件(C1)638的鏈路。由于第一數(shù)據(jù)集(D1)632的輸出端口是集合型輸出端口,并且第一組件(C1)638的輸入端口是集合型輸入端口,所以沒有標(biāo)識執(zhí)行集入口點或出口點,并且從第一數(shù)據(jù)集(D1)632的輸出端口讀取第一數(shù)據(jù)集(D1)632的ID字符串(即‘0’)并且將該ID字符串分配給第一組件(C1)638。

然后,分配算法遍歷第一組件(C1)638和第二組件(C2)640之間的鏈路。由于第一組件(C1)638的輸出端口是集合型輸出端口,并且第二組件(C2)640的輸入端口是標(biāo)量型輸入端口,所以在兩個組件638、640之間標(biāo)識第一執(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的輸入端口是標(biāo)量型輸入端口,所以在兩個組件640、645之間標(biāo)識第二執(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的輸出端口是標(biāo)量型輸出端口,并且第五組件(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的輸出端口是標(biāo)量型輸出端口,并且第六組件(C6)644的輸入端口是集合型輸入端口,所以在兩個組件642、644之間識別第二執(zhí)行集出口點643。在第二執(zhí)行集出口點643處,從第五組件(C5)642的輸出端口讀取第五組件(C5)642的ID字符串并且該ID字符串用于查詢?nèi)钟成鋽?shù)據(jù)存儲649。全局映射數(shù)據(jù)存儲649返回與第一執(zhí)行集進(jìn)入點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字符串標(biāo)記。在圖6的示例中,第一數(shù)據(jù)集(D1)632,第一組件(C1)638,第六組件(C6)644和第二數(shù)據(jù)集(D2)634都用ID字符串‘0’標(biāo)記。第二組件(C2)640和第五組件(C5)642都用ID字符串‘1’標(biāo)記。第三組件(C3)645和第四組件(C4)646都用ID字符串‘2’標(biāo)記。

每個唯一的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),并且進(jìn)一步嵌套在“1級”執(zhí)行集630內(nèi)。

2.3用戶定義的執(zhí)行集

在上述示例中,(多個)分配算法用于自動發(fā)現(xiàn)存在于數(shù)據(jù)處理圖中的執(zhí)行集,而無需任何用戶干預(yù)。然而,在一些示例中,用戶可能需要除了由分配算法提供的功能之外的功能。在這種情況下,用戶可以明確地添加執(zhí)行集入口點和出口點,以明確定義執(zhí)行集開始和/或結(jié)束的位置。參考圖7,數(shù)據(jù)處理圖776包括第一數(shù)據(jù)集774,第一組件778,第二組件780和第二數(shù)據(jù)集790。將上述分配算法應(yīng)用于數(shù)據(jù)處理圖776將導(dǎo)致發(fā)現(xiàn)包括第一組件778和第二組件780的單個執(zhí)行集。然而,在這種情況下,用戶已明確定義了用于數(shù)據(jù)處理圖776的兩個執(zhí)行集(即,第一執(zhí)行集782和第二執(zhí)行集786)。具體地,用戶已經(jīng)將執(zhí)行集出口點組件784插入到從第一組件778的輸出端口出來的鏈路中,并且已經(jīng)將執(zhí)行集入口點788插入到進(jìn)入第二組件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,沒有用來指定文件位置的標(biāo)量輸入端口,而是存在用來指定多個記錄數(shù)據(jù)元素將如何產(chǎn)生的(可選的)標(biāo)量輸入端口,并且還存在用來指定每個數(shù)據(jù)元素將如何生成的參數(shù)。對于讀表組件898,沒有用來指定文件位置的標(biāo)量輸入端口,而是存在用來指定數(shù)據(jù)庫中的表的(可選的)標(biāo)量輸入端口。第一執(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ù)元素集合的副本。通常,無論鏈路來自集合端口、標(biāo)量端口還是控制端口,被分配給不同執(zhí)行集的組件之間的鏈路將數(shù)據(jù)元素或控制元素復(fù)制到流入執(zhí)行集的鏈路的所有實例,并且從流出執(zhí)行集的鏈路的所有實例聚集數(shù)據(jù)元素或控制元素。數(shù)據(jù)元素被聚集成集合,并且控制元素被聚集成向量,該向量可以根據(jù)下游組件的控制邏輯被適當(dāng)?shù)靥幚?包括可能將其標(biāo)示為錯誤)。

參考圖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)的菜單選擇目標(biāo)執(zhí)行集,或者通過將組件從源執(zhí)行集拖動到目標(biāo)執(zhí)行集(例如,經(jīng)由下面更詳細(xì)描述的用戶界面)來指定“相同集”關(guān)系。在一些示例中,實施錯誤檢查以驗證被拖拽的組件可以合法地位于目標(biāo)執(zhí)行集中。例如,可以在要彼此具有“相同集”關(guān)系的任何兩個組件上強加的一個可能的要求是,必須具有通過數(shù)據(jù)處理圖的包括這些組件的至少一個路徑。

2.5集合數(shù)據(jù)復(fù)制

在一些示例中,執(zhí)行集中的多個組件可以各自具有經(jīng)由執(zhí)行集入口點連接到上游組件的單個集合輸出端口的標(biāo)量輸入端口。類似地,執(zhí)行集中的多個組件可以各自具有連接到執(zhí)行集下游的組件的單個集合輸入端口的標(biāo)量輸出端口。

在一些示例中,為了從多個組件的集合型輸出端口向標(biāo)量輸入端口提供相同的數(shù)據(jù),執(zhí)行集入口點從集合為每個標(biāo)量輸入端口創(chuàng)建每個數(shù)據(jù)元素的復(fù)制本,并且將復(fù)制本提供到它們相應(yīng)的標(biāo)量輸入端口。類似地,為了合并由多個組件的標(biāo)量輸出端口(來自執(zhí)行集的不同的相應(yīng)迭代)輸出的數(shù)據(jù),執(zhí)行集出口點可以從多個標(biāo)量輸出端口接收輸出數(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具有第一標(biāo)量輸入端口942,并且第二組件932具有第二標(biāo)量輸入端口944。第一標(biāo)量輸入端口942和第二標(biāo)量輸入端口944均連接到執(zhí)行集入口點936并從該執(zhí)行集入口點936接收各個數(shù)據(jù)元素。如上文所述,執(zhí)行集入口點936復(fù)制從集合輸出端口934接收的數(shù)據(jù)元素,以向連接到執(zhí)行集入口點936的每個標(biāo)量輸入端口提供數(shù)據(jù)元素集合的每個數(shù)據(jù)元素的復(fù)制本。在圖9中,執(zhí)行集入口點936創(chuàng)建每個數(shù)據(jù)元素的兩個復(fù)制本,并將其中一個復(fù)制本提供給第一標(biāo)量輸入端口942,將另一個復(fù)制本提供給第二標(biāo)量輸入端口944。從圖中可以看出,在一些示例中,圖形用戶界面中的執(zhí)行集入口點936的可視表示提供了由執(zhí)行集入口點936創(chuàng)建了數(shù)據(jù)元素的多少復(fù)制本的表示。此外,在其他示例中,表示復(fù)制本的不同副本的不同入口點指示符可以被分離,并且圍繞執(zhí)行集的邊界分布為與執(zhí)行集內(nèi)需要從饋送給該執(zhí)行集的集合輸出端口提供的每個復(fù)制的數(shù)據(jù)元素的副本的組件一樣多的組件。

第一組件930和第二組件932處理它們各自的數(shù)據(jù)元素,并且經(jīng)由標(biāo)量輸出端口946、948將它們各自處理后的數(shù)據(jù)元素提供給執(zhí)行集出口點940。在一些示例中,執(zhí)行集出口點940將處理后的數(shù)據(jù)元素分組成對,將處理后的數(shù)據(jù)元素對輸出到第二數(shù)據(jù)集926的集合輸入端口938。從圖中可以看出,在一些示例中,圖形用戶界面中的執(zhí)行集出口點940的可視表示提供了關(guān)于由執(zhí)行集入口點936分組了多少數(shù)據(jù)元素的復(fù)制本的表示。

2.6資源鎖定

在一些示例中,給定執(zhí)行集中的組件可以在并行實例中運行多次。在一些示例中,并行運行實例的組件可能需要訪問共享資源。為了防止競爭情況以及與訪問共享資源的多個進(jìn)程相關(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í)行集的邊界顯式地或隱式地復(fù)制相同的數(shù)據(jù)元素,則多個標(biāo)量輸入端口可以接收該相同的數(shù)據(jù)元素。

通常,具有跨越執(zhí)行集的邊界的鏈路的所有輸出標(biāo)量端口具有來自執(zhí)行集的多個實例中的每一個的所有數(shù)據(jù)元素,這些數(shù)據(jù)元素被聚集到提供給鏈接的輸入采集端口的同一集合中。但是,如果執(zhí)行集僅具有單個實例,則具有跨越執(zhí)行集的邊界的鏈路的輸出標(biāo)量端口可以鏈接到輸入標(biāo)量端口。

通常,相同類型的兩個端口之間的鏈路可以遍歷執(zhí)行集邊界,假設(shè)執(zhí)行集的遍歷不會導(dǎo)致數(shù)據(jù)處理圖中的任何循環(huán)。

在一些示例中,默認(rèn)地為每個執(zhí)行集分配唯一標(biāo)識符(例如,‘1’)。在其他示例中,每個執(zhí)行集可以被分配執(zhí)行集ID路徑(例如,‘1/3/6’)。在一些示例中,用戶明確地提供執(zhí)行集ID字符串。執(zhí)行集ID字符串不一定是唯一的。在執(zhí)行集ID字符串不是唯一的情況下,執(zhí)行集ID字符串可以與其父、祖父節(jié)點等的執(zhí)行集ID字符串組合,從而形成唯一的ID字符串。

在一些示例中,基于全局映射的分配算法導(dǎo)致組件被分配對應(yīng)于最深嵌套執(zhí)行集的ID字符串。在一些示例中,當(dāng)為執(zhí)行集被分配了執(zhí)行集ID路徑時,執(zhí)行集ID路徑不一定是唯一的。為了補償執(zhí)行集ID路徑不唯一的情況,對執(zhí)行集ID路徑施加約束,要求給定執(zhí)行集上游的執(zhí)行集ID路徑必須是“兼容的”,其中兩個執(zhí)行集ID路徑是兼容當(dāng)且僅當(dāng)它們是相同的,或者一個是另一個的適當(dāng)前綴。例如:

·/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不兼容

上述實施例基本上沒有對標(biāo)量塊的實例的執(zhí)行強加排序/并發(fā)約束。但是,在一些實施例中,提供其他輸入以控制從饋送給執(zhí)行集的集合接收的數(shù)據(jù)元素的子集的允許并發(fā)性和所需串行化。在一些實施例中,可以對數(shù)據(jù)元素的一些子集強加根據(jù)部分排序的順序處理。

在默認(rèn)情況下,執(zhí)行集的實例可以完全并行地運行。然而,在一些情況下,用戶可能期望不同的行為。例如,如果正在處理的數(shù)據(jù)是帳戶級數(shù)據(jù),則用戶可能希望對每個帳戶內(nèi)的數(shù)據(jù)強制某些限制。例如,用戶可能想強制串行執(zhí)行。在這種情況下,可以允許跨帳戶的任何并行度,但是不能同時(即,并發(fā)地)處理同一帳戶的兩個數(shù)據(jù)元素??蛇x地,附加限制可以是有序處理,使得相同帳戶的兩個數(shù)據(jù)元素不得根據(jù)由鍵限定的順序或者通過例如接收的順序來進(jìn)行無序處理。

為了實現(xiàn)這一點,可以為執(zhí)行集提供串行化鍵。具有相同串行化鍵值的所有數(shù)據(jù)元素必須串行處理,并且在某些情況下必須按照明確定義的順序處理。運行時系統(tǒng)對具有相同串行化鍵的數(shù)據(jù)元素強制串行執(zhí)行的一種方式是通過串行化鍵來對執(zhí)行集實例進(jìn)行分區(qū):將其驅(qū)動數(shù)據(jù)元素具有特定串行化鍵(或串行化鍵的哈希值)的實例分配為在特定計算節(jié)點152上執(zhí)行。在運行時,系統(tǒng)可以通過掃描數(shù)據(jù)元素的集合來確保工作均勻分布在多個計算節(jié)點152上,以確保可運行任務(wù)的隊列保持充滿。在不需要明確定義的順序(例如在集合中)的情況下,順序可以是與它們從輸出端口(甚至集合輸出端口)產(chǎn)生的順序相同的順序,或者與控制串行化鍵組內(nèi)的處理順序的不同的校對鍵相關(guān)聯(lián)的順序相同的順序。在一些情況下,可以通過提供預(yù)定義的值作為串行化鍵來強制執(zhí)行集完全串行運行。

在一些實施例中,可以表面保持順序被保留,即使沒有嚴(yán)格根據(jù)該順序?qū)嵤┨幚硪彩侨绱?。如果?zhí)行集的輸入和輸出兩者處的數(shù)據(jù)與特定順序(例如,向量內(nèi)的元素的順序)相關(guān)聯(lián),則用戶可能希望保留該順序。即使在數(shù)據(jù)元素的處理中沒有串行化,也可以例如使用處理數(shù)據(jù)元素時與數(shù)據(jù)元素一起攜帶的排序鍵來對輸出數(shù)據(jù)元素進(jìn)行排序,以恢復(fù)與對應(yīng)的一組輸入數(shù)據(jù)元素相關(guān)聯(lián)的排序。可替代地,并行產(chǎn)生的輸出數(shù)據(jù)元素可以以與它們進(jìn)入執(zhí)行集的順序相同的順序合并,而不一定需要實施顯式排序操作。

與為執(zhí)行集準(zhǔn)備的執(zhí)行代碼相關(guān)聯(lián)的各種計算特性可以由編譯器/解釋器120來配置,可以有或沒有來自用戶的輸入。例如,上述用于指示如何實施與特定執(zhí)行集內(nèi)的組件相對應(yīng)的任務(wù)的嵌入信息可以包括以下任何內(nèi)容。所述信息可以包括指示任務(wù)將完全串行執(zhí)行(即,沒有并行性)的編譯器注釋。所述信息可以包括指示以與排序約束所允許的并行性一樣多的并行性來實施任務(wù)的編譯器注釋。所述信息可以包括指示與相同鍵值相關(guān)的任務(wù)被串行執(zhí)行并且與不同鍵值相關(guān)的任務(wù)被并行執(zhí)行的編譯器注釋(即,如上所述按鍵串行化)。

編譯器注釋或修改符可以用于指示各種計算特性中的任何一種:

·并發(fā)性(例如,如上所述的并行、串行、按鍵串行)

·不同執(zhí)行集之間的優(yōu)先性(precedence)(例如,一個執(zhí)行集的所有任務(wù)發(fā)生在另一執(zhí)行集的所有任務(wù)之后)

·事務(wù)性(例如,執(zhí)行集的任務(wù)作為數(shù)據(jù)庫事務(wù)(database transaction)處理)

·資源鎖定(例如,執(zhí)行集的任務(wù)通過特定資源(例如共享變量)實施,鎖住,允許任務(wù)將資源作為原子單元訪問)

·排序(例如,保留數(shù)據(jù)元素之間的排序)

·元組大小(例如,將由執(zhí)行集的每個實例操作的數(shù)據(jù)元素的數(shù)量)

編譯器/解釋器120可以基于自動分析作為整體的執(zhí)行集或數(shù)據(jù)處理圖的屬性,和/或基于接收來自用戶的輸入(例如,圖中的用戶注釋)確定這些特性。例如,如果在執(zhí)行集中引用鍵值,則編譯器注釋可以指示按鍵串行化。如果在執(zhí)行集內(nèi)使用資源,則編譯器修改符可以在該執(zhí)行集之前/之后允許鎖定/解鎖該資源。如果在執(zhí)行集內(nèi)存在數(shù)據(jù)庫操作,則執(zhí)行集的每個實例可以被配置為作為數(shù)據(jù)庫事務(wù)執(zhí)行。如果可以在編譯時確定可用的核的數(shù)量,則編譯器注釋可以指示每個核將對由數(shù)量為等于集合的總大小除以核的數(shù)量的數(shù)據(jù)項組成的數(shù)據(jù)項元組執(zhí)行執(zhí)行集的實例。

編譯器注釋和修改符可以被添加到以目標(biāo)語言準(zhǔn)備的代碼,諸如合適的高級語言(例如,DML)或低級可執(zhí)行代碼,或數(shù)據(jù)處理圖的目標(biāo)中間形式。例如,編譯器/解釋器120可以將組件插入到明確指示到執(zhí)行集的入口點或出口點的數(shù)據(jù)處理圖中,或者用來開始/結(jié)束事務(wù)的組件可以放置在用于處理事務(wù)的組件集的入口/出口點,或者組件可以用于鎖定/解鎖資源??商娲?,編譯器/解釋器120可以將修改符添加為修改類型的數(shù)據(jù)流鏈路。

3數(shù)據(jù)處理圖的用戶界面

在一些示例中,用戶界面允許用戶通過將組件拖動到畫布上并使用鏈路將組件的端口連接在一起來開發(fā)數(shù)據(jù)處理圖。在一些示例中,用戶界面在用戶開發(fā)數(shù)據(jù)處理圖時重復(fù)地將上述分配算法應(yīng)用于數(shù)據(jù)處理圖。例如,當(dāng)用戶向正在開發(fā)的數(shù)據(jù)處理圖中添加組件時,分配算法可以應(yīng)用于具有被添加組件的圖。然后可以將由分配算法發(fā)現(xiàn)的結(jié)果執(zhí)行集顯示為例如圍繞用戶界面中的組件繪制的框,或者顯示為包圍組件的任意形狀的區(qū)域,其可以通過用于在同一執(zhí)行集中呈現(xiàn)包含多個組件的區(qū)域的唯一的顏色、陰影、紋理或標(biāo)記來區(qū)分。在一些示例中,用戶然后可以通過向執(zhí)行集添加組件或從執(zhí)行集中去除組件來修改由分配算法發(fā)現(xiàn)的執(zhí)行集。在一些示例中,分配算法驗證修改后的執(zhí)行集是合法的。例如,各種端口之間可以存在組件和鏈路的一些配置,其可以潛在地以各種合法方式中的任一種劃分為多個執(zhí)行集。在這樣的模糊情況下,分配算法可以默認(rèn)地選擇執(zhí)行集的一個分配,但是用戶可能已經(jīng)期望進(jìn)行執(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,當(dāng)用戶用鏈路將組件1022、1024、1026的端口連接在一起時,分配算法自動發(fā)現(xiàn)第一執(zhí)行集1030,第一執(zhí)行集1030包括第一計算組件1024。通過用戶界面將第一執(zhí)行集1030顯示給用戶。當(dāng)用戶繼續(xù)向圖中添加組件和鏈路時,分配算法自動發(fā)現(xiàn)執(zhí)行集,并通過用戶界面顯示執(zhí)行集。

參考圖10C,在一些示例中,用戶可能需要打破鏈路(例如,將另一組件插入到鏈路中)。在這樣的示例中,如果分配算法被允許重新分析數(shù)據(jù)處理圖,則第一執(zhí)行集1030將被去除,可能導(dǎo)致用戶的工作中斷和丟失。

為了避免這種中斷,當(dāng)用戶從數(shù)據(jù)處理圖中去除流或組件時,可以不執(zhí)行分配算法,而是保持其余組件及它們的執(zhí)行集關(guān)聯(lián)未受影響。例如,在圖10C中,其輸入和輸出端口斷開,第一組件1024仍然包括在第一執(zhí)行集1030中。在一些示例中,當(dāng)斷開的組件被重新連接時,則允許分配算法自動地發(fā)現(xiàn)和顯示與重新連接的組件相關(guān)聯(lián)的任何執(zhí)行集。

在一些示例中,如果數(shù)據(jù)處理圖的組件不具有明確的(例如,用戶定義的)執(zhí)行集指定,則允許分配算法發(fā)現(xiàn)組件屬于哪個執(zhí)行集。否則,如果組件具有明確的用戶定義的執(zhí)行集指定,則不允許分配算法選擇該組件包括在哪個執(zhí)行集中。例如,如果用戶將組件手動移動到給定的執(zhí)行集中,則不允許分配算法將該組件包括在除用戶指定的執(zhí)行集之外的任何執(zhí)行集中。也就是說,對數(shù)據(jù)處理圖的任何用戶修改不能被分配算法重寫(overridden)。

在一些示例中,用戶界面允許用戶使用手勢或通過輸入設(shè)備進(jìn)行的其他交互來將組件提升到給定執(zhí)行集中和/或?qū)⒔M件從給定執(zhí)行集中降級。在一些示例中,用戶可以使用菜單選項或其他提示來提升或降級組件。在其他示例中,用戶可以簡單地將組件拖動到用戶界面中的期望執(zhí)行集中。

在一些示例中,用戶界面允許用戶為數(shù)據(jù)處理圖中的執(zhí)行集指定一個或多個約束。例如,用戶可以將執(zhí)行約束為在給定時間并行運行不超過N次。

在一些示例中,編譯器/解釋器120接收包括手動定義的執(zhí)行集和由分配算法發(fā)現(xiàn)的執(zhí)行集的混合的數(shù)據(jù)處理圖的表示。

在一些示例中,用戶可以使用界面定義另一類型的執(zhí)行集,稱為啟用/禁止執(zhí)行集。例如,用戶可以圍繞他們希望被包括在啟用/禁止執(zhí)行集中的一個或多個組件繪制框。啟用/禁止執(zhí)行集包括一個或多個組件并且具有標(biāo)量輸入端口。如果上游組件的標(biāo)量輸出端口向啟用/禁止執(zhí)行集的標(biāo)量輸入端口提供一個數(shù)據(jù)元素,則允許啟用/禁止執(zhí)行集中的組件執(zhí)行。如果上游組件的標(biāo)量輸出端口向啟用/禁止執(zhí)行集的標(biāo)量輸入端口提供零數(shù)據(jù)元素,則啟用/禁止執(zhí)行集中包括的組件被禁止。任何執(zhí)行集(包括啟用/禁止執(zhí)行集)可以包括控制輸入和輸出端口,其可用于確定整個執(zhí)行集是否將被執(zhí)行以及是否將控制信號傳播到其他組件或執(zhí)行集。如果執(zhí)行集被并行化(即具有多個實例),則在執(zhí)行任何實例之前必須激活輸入控制端口,并且在所有實例完成執(zhí)行之后激活輸出控制端口。在一些示例中,通過將端口的可視表示放置在執(zhí)行集的邊界上來提供這些輸入和輸出控制端口。在其他示例中,通過將這些輸入和輸出控制端口放置在執(zhí)行集前方的附加組件上來提供這些輸入和輸出控制端口。例如,該附加的“對于所有組件”可以(例如,由用戶界面自動地或由用戶手動地)插入在上游集合輸出數(shù)據(jù)端口和入口點指示符之間,或者代替入口點指示符(即,在上游集合輸出數(shù)據(jù)端口和驅(qū)動輸入標(biāo)量數(shù)據(jù)端口之間)。

如上文參照圖7注意到的,在一些示例中,用戶可以通過沿著數(shù)據(jù)處理圖的流放置執(zhí)行集入口點和出口點組件來明確地定義執(zhí)行集入口點和出口點。

在一些示例中,用戶界面提供實時反饋以在他們的圖包括非法操作時通知用戶。例如,如果存在由在用戶指定的執(zhí)行集中的組件引起的沖突,則分配算法可以通過用戶界面向用戶發(fā)出警告。為了提供實時反饋,分配算法將驗證規(guī)則應(yīng)用于數(shù)據(jù)處理圖以通知用戶數(shù)據(jù)處理圖是否合法。參考圖11A,非法數(shù)據(jù)處理圖配置1195的一個示例包括兩個數(shù)據(jù)源:將數(shù)據(jù)元素的第一集合饋送到第一執(zhí)行集1197中的第一組件1102的標(biāo)量端口的第一數(shù)據(jù)源1191,以及將數(shù)據(jù)元素的第二集合饋送到第二執(zhí)行集1199中的第二組件1104的標(biāo)量端口的第二數(shù)據(jù)源1198。第二執(zhí)行集1199輸出數(shù)據(jù)元素的第三集合,然后該第三集合被輸入到第一執(zhí)行集1197中的第三組件1106的標(biāo)量數(shù)據(jù)端口。由于兩個不同的數(shù)據(jù)元素的集合連接到第一執(zhí)行集1197中的不同標(biāo)量端口,所以沒有辦法知道應(yīng)該實例化第一執(zhí)行集1197中的組件的多少并行實例(因為針對存在于第一執(zhí)行集1197的邊界處的每個數(shù)據(jù)元素生成組件的一個實例)。在一些示例中,通過在例如第二組件1104上顯示錯誤指示符1108來通知用戶此沖突。

參考圖11B,非法數(shù)據(jù)處理配置1110的另一示例包括將數(shù)據(jù)元素的集合饋送到第一執(zhí)行集1116中的第一組件1114的標(biāo)量輸入端口的數(shù)據(jù)源1112。第一組件1114的標(biāo)量輸出將其輸出作為數(shù)據(jù)的集合提供到第一執(zhí)行集1116外部的第二組件1118的集合端口。第二組件1118從集合型輸出端口將數(shù)據(jù)元素的集合提供到第一執(zhí)行集1116中的第三組件1120的標(biāo)量數(shù)據(jù)端口。

通過從第一執(zhí)行集1116外的第一組件1114的集合型輸出端口傳遞數(shù)據(jù)元素的集合,在第二組件1118處處理數(shù)據(jù)元素的集合,然后將處理后的數(shù)據(jù)元素的集合傳遞回第三組件1120的標(biāo)量端口,定義了“執(zhí)行集循環(huán)”。

通常,執(zhí)行集循環(huán)是非法的,因為它們不利于執(zhí)行排序。例如,通常允許具有進(jìn)入執(zhí)行集或離開執(zhí)行集的附加流,因為對于輸入而言,輸入數(shù)據(jù)可以在執(zhí)行集被執(zhí)行之前得到緩存,對于輸出而言,輸出數(shù)據(jù)可以在執(zhí)行集完成執(zhí)行之后被聚集。但是,如果需要外部組件在執(zhí)行集之前和之后運行,則這是不可能的。

在一些示例中,通過在一個或多個組件上顯示錯誤指示符1108來通知用戶執(zhí)行集循環(huán)。

在一些示例中,如果每個執(zhí)行集入口點與至少一個對應(yīng)的執(zhí)行集出口點不匹配,則數(shù)據(jù)處理圖被認(rèn)為是非法的。可替代地,具有入口點但沒有對應(yīng)出口點的執(zhí)行集可以被允許作為用戶定義的執(zhí)行集,即使其不會被分配算法自動識別。在這些情況下,在(一個或多個)最下游組件完成執(zhí)行之后,執(zhí)行集可以結(jié)束(而不提供任何輸出數(shù)據(jù)元素)。在一些示例中,如果每個鎖定操作不與對應(yīng)的解鎖操作匹配,則數(shù)據(jù)處理圖被認(rèn)為是非法的??商娲兀绻麤]有明確指定,則可以推斷解鎖操作,并且如果推斷的解鎖操作將需要在與鎖定操作不同的執(zhí)行集中,則僅指示為非法。在一些示例中,如果鎖定操作及其對應(yīng)的解鎖操作不存在于同一執(zhí)行集中,則數(shù)據(jù)處理圖被認(rèn)為是非法的。

4控制圖的狀態(tài)機

在為執(zhí)行準(zhǔn)備數(shù)據(jù)處理圖的過程中,編譯器/解釋器120還在控制圖生成過程中生成控制圖。在一些實現(xiàn)方式中,生成控制圖包括生成用于執(zhí)行與各個組件相對應(yīng)的任務(wù)的可執(zhí)行代碼和與確定任務(wù)之間的數(shù)據(jù)流和控制流的各種組件間鏈路相對應(yīng)的代碼。這包括由編譯器/解釋器120發(fā)現(xiàn)的執(zhí)行集的層級結(jié)構(gòu)中的數(shù)據(jù)傳送和控制傳送。

生成這樣的可執(zhí)行代碼的一部分包括在一些數(shù)據(jù)結(jié)構(gòu)表示中為每個執(zhí)行集生成對應(yīng)的控制圖,包括任何啟用/禁止執(zhí)行集。執(zhí)行集內(nèi)的任何嵌套執(zhí)行集被視為表示該嵌套執(zhí)行集的單個組件,用于生成控制圖。此代表性組件的端口對應(yīng)于嵌套執(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包括由相應(yīng)集合數(shù)據(jù)端口1212、1214連接的第一組件1208和第二組件1210。第二組件對1204包括由相應(yīng)標(biāo)量數(shù)據(jù)端口1220、1222連接的第三組件1216和第四組件1218。

編譯器/解釋器120通過添加開始組件1224和完成組件1226并且按照數(shù)據(jù)處理圖的拓?fù)涞闹甘緦⒔M件連接到開始組件1224和完成組件1226來創(chuàng)建控制圖。開始組件和完成組件不執(zhí)行任何計算任務(wù),但編譯器/解釋器120將使用開始組件和完成組件來管理控制信號,該控制信號將用于開始某些組件的執(zhí)行并確定執(zhí)行集中的所有組件何時已完成執(zhí)行。

為了確定特定組件是否需要連接到開始組件1224,編譯器/解釋器120檢查至該組件的輸入,以基于到上游串行端口的現(xiàn)有鏈路確定該組件是否沒有被指定開始執(zhí)行,如上所述,上游串行端口包括控制端口和標(biāo)量端口。

例如,如果組件沒有至其控制輸入端口的鏈路,則它可能永遠(yuǎn)不會開始執(zhí)行,因為將永遠(yuǎn)不會有控制信號來指示它開始。另一方面,即使沒有控制輸入,也可能取決于組件具有的數(shù)據(jù)輸入的類型,針對數(shù)據(jù)的到達(dá)而觸發(fā)該組件的執(zhí)行。例如,如果組件具有標(biāo)量輸入端口,則即使在其控制輸入端口處沒有控制信號,一旦該組件在其標(biāo)量輸入端口處看到數(shù)據(jù),該組件仍將開始執(zhí)行。另一方面,如果組件只有集合數(shù)據(jù)輸入,那么這種情況不會發(fā)生。如果這樣的組件不具有用來觸發(fā)執(zhí)行的控制輸入或標(biāo)量數(shù)據(jù)輸入,則它將需要至開始組件1224的連接。

在圖12A的上下文中,第一組件1208既不具有控制輸入也不具有標(biāo)量數(shù)據(jù)輸入。因此,第一組件1208將無法自己開始執(zhí)行。因此,第一組件1208必須鏈接到開始組件1224。第三組件1216同樣既不具有控制輸入也不具有標(biāo)量數(shù)據(jù)輸入。因此,第三組件1216也必須鏈接到開始組件1224。

第四組件1218沒有控制輸入。但是它被連接以從第三組件1216接收標(biāo)量數(shù)據(jù)輸入。因此,它將在通過其輸入標(biāo)量端口1222接收到數(shù)據(jù)時開始執(zhí)行。因此,第四組件1218不需要連接到開始組件1224。

第二組件1210被配置為從第一組件1208接收數(shù)據(jù)。然而,在輸入集合端口1214而不是在輸入標(biāo)量端口處接收該數(shù)據(jù)。結(jié)果,類似于第一組件,第二組件1210也必須連接到開始組件1224。

編譯器/解釋器120還需要識別哪些組件將需要連接到完成組件1226。

通常,當(dāng)組件缺少控制輸出鏈路或(任何類型的)數(shù)據(jù)輸出鏈路時,將組件連接到完成組件1226。在圖12A的左側(cè)的圖中,僅第二組件1210和第四組件1218滿足該條件。因此,如圖12A的右側(cè)所示,僅這兩個組件連接到完成組件1226。

圖12B類似于圖12A,不同的是在圖的左側(cè)的第一組件1208和第三組件1216之間存在控制鏈路。與規(guī)則一致,不再需要在得到的替代控制圖1206'中將第三組件1216連接到開始組件1224。

控制圖有效地定義分布式狀態(tài)機,其中組件及其串行端口響應(yīng)于上游組件和串行端口發(fā)生的轉(zhuǎn)換從一個狀態(tài)轉(zhuǎn)換到另一個狀態(tài)。通常,上游組件將從一個狀態(tài)轉(zhuǎn)換到另一個狀態(tài),導(dǎo)致其輸出串行端口轉(zhuǎn)換,這使得下游組件的鏈接串行輸入端口轉(zhuǎn)換,這使得這些下游組件轉(zhuǎn)換,等等。下面參照用于組件及其串行端口的狀態(tài)轉(zhuǎn)換圖更詳細(xì)地描述用于實現(xiàn)該行為的特定類型的狀態(tài)機的一個示例。

為了提供對狀態(tài)機的轉(zhuǎn)換的控制,編譯器/解釋器120移植額外的控制代碼到用于執(zhí)行由特定組件表示的任務(wù)的代碼中。如本文所使用的,“移植(graft)”意指前附、后附或既前附又后附的控制代碼。前附的控制代碼在本文被稱為“前序(prologue)”代碼,而后附的控制代碼被稱為“結(jié)束(epilogue)”代碼。組件的前序代碼在組件執(zhí)行其任務(wù)之前執(zhí)行。組件的結(jié)束代碼在組件610A已經(jīng)完成執(zhí)行其任務(wù)之后執(zhí)行。

移植的控制代碼檢查所存儲的狀態(tài)信息,例如累加器的值(例如,計數(shù)器倒計數(shù)到指示輸入已為調(diào)用組件準(zhǔn)備就緒的值)或標(biāo)志的狀態(tài)(例如,設(shè)置為指示組件已被禁止的值的標(biāo)志),以確定是否使一個或多個下游組件執(zhí)行其相應(yīng)的任務(wù)。

在一個實施例中,前序代碼監(jiān)視上游輸出串行端口的狀態(tài),并更新組件的輸入串行端口的狀態(tài)和組件的狀態(tài),而結(jié)束代碼在組件完成實施其任務(wù)之后更新組件的輸出串行端口。

在另一個實施例中,代替監(jiān)視上游輸出串行端口的下游組件的前序代碼,上游組件的結(jié)束代碼更新下游輸入串行端口的集合狀態(tài),并監(jiān)視該集合狀態(tài)以觸發(fā)下游組件的前序代碼在適當(dāng)?shù)臅r間(例如當(dāng)初始化為輸入串口數(shù)量的計數(shù)器達(dá)到零時)執(zhí)行??商娲兀嬗嫈?shù)器從輸入端口的數(shù)量倒計數(shù)(或向上計數(shù)到輸入端口的數(shù)量),可以使用另一形式的累加器來存儲用于觸發(fā)組件的狀態(tài)信息,例如存儲表示不同組件的不同端口的狀態(tài)的位的位圖。

作為該移植的控制代碼的結(jié)果,基于在特定組件的執(zhí)行開始和結(jié)束時一個或多個上游邏輯狀態(tài)的集合的發(fā)生,任務(wù)的完成自動導(dǎo)致以與由控制圖表示的數(shù)據(jù)控制依賴性一致的方式、并且以允許多個組件的并發(fā)操作并且允許使用條件控制邏輯來控制的方式自動執(zhí)行其他任務(wù)。

圖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與正在進(jìn)行的執(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。這是當(dāng)與控制圖相關(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或禁止?fàn)顟B(tài)1306。

如果組件沒有輸入端口處于未決狀態(tài)1312并且并非其所有輸入端口都處于禁止?fàn)顟B(tài)1316(即,至少一個輸入端口處于完成狀態(tài)1314),則組件轉(zhuǎn)換到活動狀態(tài)1304。端口默認(rèn)為“必需”,但可標(biāo)記為“可選”??蛇x端口可以保持未連接到另一個端口,而不會導(dǎo)致錯誤(雖然可能有警告)。未連接的任何可選端口自動地處于完成狀態(tài)1314。只要組件仍在執(zhí)行其任務(wù),該組件就保持在活動狀態(tài)1304。當(dāng)組件處于活動狀態(tài)1304時,其多個輸出端口可以在不同時間轉(zhuǎn)換或一起從未決狀態(tài)1312轉(zhuǎn)換到完成狀態(tài)1314或禁止?fàn)顟B(tài)1316。在完成其任務(wù)的執(zhí)行時,組件轉(zhuǎn)換從活動狀態(tài)1304轉(zhuǎn)換到完成狀態(tài)1308。

如果組件的任務(wù)已經(jīng)完成執(zhí)行,并且其所有輸出端口被“決斷(resolved)”,即不再未決,則組件轉(zhuǎn)換到完成狀態(tài)1308。

如果由于定制控制邏輯,或由于其所有輸入端口被禁止,或由于禁止了其所需輸入端口中的至少一個,或由于組件中的未處理錯誤而導(dǎo)致該組件的前序已觸發(fā)至禁止?fàn)顟B(tài)1306的轉(zhuǎn)換,則該組件處于禁止?fàn)顟B(tài)1306。組件的所有輸出端口也決斷到禁止?fàn)顟B(tài)1316以向下游傳播這種禁止。

對于端口,狀態(tài)轉(zhuǎn)換規(guī)則取決于端口是輸入端口還是輸出端口。

端口的初始狀態(tài)是未決狀態(tài)1312。輸入端口通常跟隨它所鏈接到的上游輸出端口的狀態(tài)。因此,當(dāng)上游輸出端口轉(zhuǎn)換時,在控制圖中鏈接到該輸出端口的輸入端口轉(zhuǎn)換到相同的狀態(tài)。輸出端口保持未決,直到組件在其活動狀態(tài)期間確定輸出端口應(yīng)決斷到什么狀態(tài)。

如上所述,輸入端口跟隨它們所鏈接的上游輸出端口。因此,對于鏈接到單個上游輸出端口的輸入端口,當(dāng)其所鏈接的上游輸出端口轉(zhuǎn)換到完成狀態(tài)1314時,該輸入端口轉(zhuǎn)換到完成狀態(tài)1314。如果輸入端口通過多個鏈路鏈接到多個上游輸出端口,則輸入端口在其上游輸出端口中的至少一個轉(zhuǎn)換到完成狀態(tài)1314之后轉(zhuǎn)換到完成狀態(tài)1314。否則,如果所有上游輸出端口轉(zhuǎn)換到禁止?fàn)顟B(tài)1316,則輸入端口轉(zhuǎn)換到禁止?fàn)顟B(tài)1316。一些實施例使用與該默認(rèn)“或邏輯”不同的其他邏輯來確定是將輸入端口轉(zhuǎn)換到完成狀態(tài)1314還是禁止?fàn)顟B(tài)1316(例如,“與邏輯”,其中僅當(dāng)所有上游輸出端口處于完成狀態(tài)1314時輸入端口才轉(zhuǎn)換到完成狀態(tài)1314)。如果組件的輸入數(shù)據(jù)端口決斷為完成狀態(tài)1314,則數(shù)據(jù)元素準(zhǔn)備就緒供該組件處理。如果組件的輸出數(shù)據(jù)端口決斷為完成狀態(tài)1314,則數(shù)據(jù)元素準(zhǔn)備就緒從該組件向下游發(fā)送。

與輸入端口跟隨它們所鏈接到的上游輸出端口的狀態(tài)的規(guī)則一致,當(dāng)與其鏈接的上游輸出端口決斷為禁止?fàn)顟B(tài)1316時,輸入端口決斷為禁止?fàn)顟B(tài)1316。輸出端口決斷為禁止?fàn)顟B(tài)1316,或者因為活動的組件計算出的結(jié)果確定輸出端口應(yīng)當(dāng)被禁止,或者為了使得禁止從上游被禁止組件向下游傳播,或者如果組件中存在未處理的錯誤。在一些實施例中,編譯器可以通過禁止根在被禁止組件處的下游組件的樹來優(yōu)化執(zhí)行,而不必一個組件接一個組件地向下游傳播禁止。

在其他實施例中,可以使用各種替代狀態(tài)機,其中集合端口之間的鏈路也可以包括在控制圖中。在一些這樣的實施例中,集合端口的狀態(tài)轉(zhuǎn)換圖可以包括除未決狀態(tài)、完成狀態(tài)和禁止?fàn)顟B(tài)之外的活動狀態(tài),諸如在組件的狀態(tài)轉(zhuǎn)移圖1300中。當(dāng)集合端口(作為輸出端口)產(chǎn)生數(shù)據(jù)或(作為輸入端口)消耗數(shù)據(jù)時,集合端口處于活動狀態(tài)。對于輸入集合端口,例如,一旦確定不是所有輸入端口都將被禁止,就可以在上游產(chǎn)生第一數(shù)據(jù)元素時觸發(fā)活動狀態(tài)。在一些實施例中,沒有集合端口的禁止?fàn)顟B(tài)。包括集合端口的狀態(tài)轉(zhuǎn)換的控制圖中的組件所遵循的轉(zhuǎn)換規(guī)則可以以與為輸入標(biāo)量端口或控制端口處理完成狀態(tài)相同的方式來處理輸入集合端口的活動狀態(tài)。

5計算平臺

回看圖1,數(shù)據(jù)處理圖的組件的實例在執(zhí)行數(shù)據(jù)處理圖的情境中被派生(spawn)為任務(wù),并且通常在計算平臺150的多個計算節(jié)點152中執(zhí)行。如下面更詳細(xì)討論的,控制器140提供這些任務(wù)的調(diào)度和執(zhí)行軌跡的監(jiān)督控制方面,以便實現(xiàn)例如與計算負(fù)荷的分配,通信或輸入/輸出開銷的減少以及存儲器資源的使用相關(guān)的系統(tǒng)的性能目標(biāo)。

通常,在由編譯器/解釋器120翻譯之后,整個計算被表達(dá)為可由計算平臺150執(zhí)行的目標(biāo)語言的過程的基于任務(wù)的規(guī)范130。這些過程利用原語,諸如“派生(spawn)”和“等待”,并且可以在過程中包括原語,或調(diào)用由程序員為高級(例如,基于圖的)程序規(guī)范110中的組件指定的工作過程。

在許多情況下,組件的每個實例被實現(xiàn)為任務(wù),其中一些任務(wù)實現(xiàn)單個組件的單個實例,一些任務(wù)實現(xiàn)執(zhí)行集的多個組件的單個實例,以及一些任務(wù)實現(xiàn)組件的連續(xù)實例。來自組件及其實例的特定映射取決于編譯器/解釋器的特定設(shè)計,使得所得到的執(zhí)行保持與計算的語義定義一致。

通常,運行時環(huán)境中的多個任務(wù)被分層級排列,例如,一個頂級任務(wù)派生多個任務(wù),例如,一個任務(wù)用于數(shù)據(jù)處理圖的每個頂級組件。類似地,執(zhí)行集的計算可以具有用于處理整個集合的一個任務(wù),其中多個(即許多)子任務(wù)分別用于處理集合的元素。

在運行時環(huán)境中,已經(jīng)派生的每個任務(wù)可以處于一組可能狀態(tài)之一。在第一次派生時,任務(wù)在被初始執(zhí)行之前處于派生狀態(tài)。在執(zhí)行時,它處于執(zhí)行狀態(tài)。任務(wù)時而可能處于暫停狀態(tài)。例如,在某些實現(xiàn)方式中,調(diào)度器可以在任務(wù)已經(jīng)超過處理器利用的量、正在等待資源等時將任務(wù)置于暫停狀態(tài)。在一些實現(xiàn)方式中,任務(wù)的執(zhí)行不被搶占,并且任務(wù)必須放棄控制。有三個暫停子狀態(tài):可運行,被阻止和已做完。例如,如果任務(wù)在完成其計算之前放棄控制,則任務(wù)是可運行的。當(dāng)例如在父任務(wù)檢索到任務(wù)的返回值之前該任務(wù)完成其處理時,該任務(wù)是已做完的。如果任務(wù)正在等待該任務(wù)外部的事件,例如另一個任務(wù)的完成(例如,因為它已經(jīng)使用了“等待”原語)或數(shù)據(jù)記錄的可用性(例如,阻止in.read()或out.write()函數(shù)的一次執(zhí)行),則任務(wù)是被阻止的。

再次參考圖1,每個計算節(jié)點152具有一個或多個處理引擎154。在至少一些實現(xiàn)方式中,每個進(jìn)程引擎與在計算節(jié)點150上執(zhí)行的單個操作系統(tǒng)進(jìn)程相關(guān)聯(lián)。取決于計算節(jié)點的特性,在單個計算節(jié)點上執(zhí)行多個處理引擎可能是有效的。例如,計算節(jié)點可以是具有多個單獨處理器的服務(wù)器計算機,或者服務(wù)器計算機可以具有帶多個處理器內(nèi)核的單個處理器,或者可以是具有多個內(nèi)核的多個處理器的組合。在任何情況下,執(zhí)行多個處理引擎都可能比在計算節(jié)點152上僅使用單個處理引擎更有效。

處理引擎的一個示例托管在虛擬機的情境中。一種類型的虛擬機是Java虛擬機(JVM),其提供在其中可以執(zhí)行以Java Bytecode(Java字節(jié)碼)的編譯形式指定的任務(wù)的環(huán)境。但是也可以使用其他形式的處理引擎,其可以使用或可以不使用虛擬機架構(gòu)。

參考圖14,計算節(jié)點152的每個處理引擎154具有一個或多個運行器1450。每個運行器1450使用一個或多個進(jìn)程或進(jìn)程線程來執(zhí)行可運行任務(wù)。在一些實現(xiàn)方式中,每個運行器具有相關(guān)聯(lián)的進(jìn)程線程,但是運行器與線程的這種關(guān)聯(lián)不是必需的。在任何時候,每個運行器正在執(zhí)行計算的最多一個可運行任務(wù)。每個運行器具有單獨的可運行隊列1466。計算的每個可運行任務(wù)在系統(tǒng)的運行器1450的一個可運行隊列1466中。每個運行器1450具有調(diào)度器/解釋器1460,其監(jiān)視當(dāng)前運行的任務(wù),并且當(dāng)該任務(wù)將狀態(tài)改變?yōu)橐炎鐾?,被阻止或暫停時,從運行隊列1466中選擇另一個任務(wù)并執(zhí)行它。任務(wù)與運行器相關(guān)聯(lián),并且不可運行的運行器的任務(wù)被保持在可運行隊列1466之外,例如,如圖中所示,在被阻止和已做完隊列1468中。

例如,當(dāng)初始化處理引擎154時,可以創(chuàng)建運行器1450,為每個引擎創(chuàng)建預(yù)配置數(shù)量的運行器。如下所述,在一些實現(xiàn)方式中,可以向處理引擎添加或去除運行器,并且甚至在數(shù)據(jù)處理圖的執(zhí)行期間,可以從計算平臺150添加和去除處理引擎本身。然而,對于下面的初始描述,我們假設(shè)處理引擎的數(shù)量以及每個處理引擎內(nèi)運行器的數(shù)量保持恒定。

作為示例,對數(shù)據(jù)處理圖的處理開始于在頂層任務(wù)中執(zhí)行主過程。例如,基于任務(wù)的控制器140指示與處理引擎1450之一的監(jiān)視器1452通信的計算節(jié)點中的一個開始執(zhí)行主過程。在該示例中,監(jiān)視器1452將用于執(zhí)行主過程的任務(wù)放置在處理引擎之一的可運行隊列1466中。在該示例中,運行器是空閑的(即,此時沒有其他任務(wù)在運行,并且在可運行隊列中沒有其他可運行任務(wù)),所以該運行器的調(diào)度器/解釋器1460從可運行隊列中取出該任務(wù)并且開始執(zhí)行任務(wù)。當(dāng)以需要解釋的語言表達(dá)過程時,調(diào)度器/解釋器1460解釋過程的連續(xù)語句。

在該示例中,主過程的第一語句為支持無序集合的流的鏈路創(chuàng)建鏈路緩存器1470(即,分配存儲器),其在該示例中包括無序無界緩存器,即緩存器1,緩存器2和緩存器3??梢允褂酶鞣N方法創(chuàng)建這種類型的組件間鏈路,并且管理用于這些鏈路的相關(guān)聯(lián)的計算資源(包括鏈路緩存器1470),其包括其上游端口是集合端口的任何鏈路。在一些示例中,鏈路緩存器1470包括用于表示集合的源的輸出集合端口的緩存器和用于表示集合的目標(biāo)的輸入集合端口的單獨緩存器。這些緩存器可以在開始處理集合之前在運行時分配,并且在對集合的處理結(jié)束之后被解除分配(即,釋放用于緩存器的內(nèi)存)。在該示例中,這些鏈路緩存器1470被分配在其中任務(wù)的運行器正在執(zhí)行的處理引擎154的存儲器中。通常,其中創(chuàng)建緩存器的存儲器在半導(dǎo)體隨機存取存儲器(RAM)中,盡管在一些實現(xiàn)方式中,諸如磁盤之類的其他存儲設(shè)備可以用于存儲至少一些緩存數(shù)據(jù)。注意,在其他方法中,緩存器對運行器本身而言可以是本地的。在實踐中,如果處理引擎154被實現(xiàn)為操作系統(tǒng)進(jìn)程,則緩存器被創(chuàng)建為該進(jìn)程的地址空間中的存儲器區(qū)域。因此,直接基于硬件地址對緩存器的訪問限于在該進(jìn)程內(nèi)執(zhí)行的指令。注意,在這種方法中,如果多個運行器將能夠讀取或?qū)懭刖彺嫫?,則可能對緩存器需要至少進(jìn)行一些同步和訪問控制,例如使用鎖(lock)或信號量(semaphore)。在其中每個運行器在操作系統(tǒng)進(jìn)程內(nèi)被實現(xiàn)為單個線程的方法中,緩存器可以與特定運行器相關(guān)聯(lián),并且所有訪問可以被限制到該運行器,從而避免來自多個線程的潛在爭用。在下面的討論中,我們假設(shè)可以從處理引擎中的任何運行器訪問緩存器,并且實現(xiàn)適當(dāng)?shù)脑L問控制以允許這樣的共享訪問。

主進(jìn)程的后續(xù)步驟涉及派生或主過程調(diào)用的forall(用于所有)原語。通常,至少在默認(rèn)情況下,任務(wù)或子任務(wù)的派生使得這些任務(wù)最初在與父進(jìn)程相同的運行器中形成。例如,派生的Work_Read_External_Data(工作讀取外部數(shù)據(jù))任務(wù)在同一個運行器上派生。在任務(wù)正在訪問外部數(shù)據(jù)的程度上,任務(wù)可以利用至該外部數(shù)據(jù)的I/O接口1464。例如,該接口可以包括到外部數(shù)據(jù)庫、網(wǎng)絡(luò)數(shù)據(jù)連接的端點等的開放連接。這樣的I/O接口可以綁定到特定的運行器,因此使用該接口的任務(wù)可能需要訪問僅來自該運行器的接口,如下面在運行器之間任務(wù)的潛在遷移的情境中進(jìn)一步討論的。在該示例中,我們假設(shè)任務(wù)以合理計量的方式填充緩存器1,并且不會例如通過使緩存器1增長超過處理引擎的容量而“淹沒(overwhelm)”系統(tǒng)。下面還討論對控制方面的方法,例如,以避免資源的擁塞或耗盡。

與Work_Read_External_Data任務(wù)的執(zhí)行并發(fā)地,forall_Work A導(dǎo)致針對從緩存器1讀取的每個記錄派生任務(wù)。特別地,“forall”原語引起由要執(zhí)行原語的自變量標(biāo)識的任務(wù)的多個實例,其中實例的數(shù)量通常由在運行時接收的數(shù)據(jù)元素的數(shù)量確定,并且其中它們被執(zhí)行的位置和它們被調(diào)用的順序可以不受編譯器限制而用于在之后的運行時確定。如上所述,在默認(rèn)情況下,這些任務(wù)也在相同的運行器1450上創(chuàng)建,并且在沒有其他控制的情況下,與從緩存器1可得到的數(shù)據(jù)一樣快地派生這些任務(wù)。Work_B和Work_Read_External_Data的任務(wù)類似地在相同的運行器上創(chuàng)建。

注意,基于任務(wù)的規(guī)范使用“forall”原語,而沒有明確地指定運行時控制器將如何實現(xiàn)任務(wù)的分布,以導(dǎo)致所有數(shù)據(jù)待處理。如上所述,運行時控制器可以使用的一種方法是在同一計算節(jié)點上派生單獨的任務(wù),然后依賴于遷移特征以使得任務(wù)在分開的節(jié)點上執(zhí)行,從而平衡負(fù)載。可以使用其他方法,其中“forall”原語導(dǎo)致在多個節(jié)點上直接執(zhí)行多個任務(wù)。在游標(biāo)(cursor)定義內(nèi)存數(shù)據(jù)庫的表的行的基于索引的子集的情況下,游標(biāo)“forall”原語的實現(xiàn)可以使得游標(biāo)被分割成多個部分,每個部分與存儲在不同節(jié)點上的記錄相關(guān)聯(lián),并且為不同節(jié)點上的游標(biāo)的單獨部分派生任務(wù),從而導(dǎo)致處理和數(shù)據(jù)存儲的局部性。但是應(yīng)當(dāng)理解,可以在運行時控制器和分布式計算平臺的一個或多個實施例中實現(xiàn)多種方法來執(zhí)行在作為編譯器120輸出的基于任務(wù)的規(guī)范130中使用的“forall”原語。在一些示例中,方法的選擇可以取決于例如基于記錄的數(shù)量,計算節(jié)點上的數(shù)據(jù)分布,節(jié)點上的負(fù)載等的運行時決策。在任何情況下,用于實現(xiàn)“forall”原語的方法不一定對于數(shù)據(jù)處理圖的開發(fā)人員或編譯器的設(shè)計者是已知的。

系統(tǒng)的特征在于任務(wù)可以在創(chuàng)建運行器之后在運行器之間傳送。非常一般地,這種任務(wù)傳送的一種方式是通過“挪用”或“拉動”機制來實現(xiàn)的,其中空閑或至少輕微加載的運行器使得來自另一運行器的任務(wù)被傳送給它。雖然可以使用各種標(biāo)準(zhǔn),但是運行器可運行隊列1466中的多個可運行任務(wù)可以基于本地標(biāo)準(zhǔn)(諸如在其可運行隊列中是否有少于閾值數(shù)量的任務(wù))來確定該運行器是否應(yīng)當(dāng)尋求從其他運行器挪用的任務(wù)。在一些實現(xiàn)方式中,更全局性的決策進(jìn)程可用于在多個運行器上重新平衡任務(wù)隊列,但總體效果是類似的。

在至少一些實施例中,將任務(wù)從一個運行器挪用到另一個運行器不是必然涉及轉(zhuǎn)移該任務(wù)的所有數(shù)據(jù)。例如,只有當(dāng)前執(zhí)行“框架”中可訪問的數(shù)據(jù)(例如,用于從當(dāng)前程序范圍可訪問的局部和全局變量的數(shù)據(jù),例如當(dāng)前子例程調(diào)用)與引用一起打包回任務(wù)“主(home)”運行器。此數(shù)據(jù)足以在遷移的目標(biāo)運行器處創(chuàng)建任務(wù)的可運行副本,并且目標(biāo)可運行隊列中的條目準(zhǔn)備好在在該運行器中執(zhí)行。

當(dāng)遷移的運行器完成執(zhí)行時,或者通過從局部變量可用的程序范圍返回該遷移的運行器耗盡了傳送到該運行器的數(shù)據(jù)時,任務(wù)被傳送回主運行器,其中用于任務(wù)的數(shù)據(jù)被合并,并且任務(wù)再次在其主運行器處可運行。

注意,在單個處理引擎內(nèi)傳送任務(wù)期間,運行器之間的通信可以通過本地存儲器(即,避免磁盤或網(wǎng)絡(luò)通信),從而消耗相對少的資源。在允許處理引擎之間進(jìn)行挪用和遷移的實現(xiàn)方式中,在從一個運行器轉(zhuǎn)換到另一個運行器時,任務(wù)消耗相對較少的資源,例如,主要消耗處理引擎之間的通信資源而不是計算資源。此外,這種通信的等待時間相對不顯著,因為主運行器和目標(biāo)運行器被假定為在傳送期間忙于計算,主運行器是因為其可運行隊列被大量填充并且因此不可能空,而目標(biāo)運行器是因為挪用是在預(yù)期在目標(biāo)處的可運行隊列被清空的情況下進(jìn)行的。

在與圖2A-圖2B中所示的計算相關(guān)聯(lián)的任務(wù)的執(zhí)行的示例中,任務(wù)挪用機制將用于計算的負(fù)載分布在一個或多個處理引擎的運行器上。然而,注意,某些數(shù)據(jù)訪問被限于特定運行器(或可能限于特定處理引擎)。例如,如上文所述,緩存器2的數(shù)據(jù)可以由單個運行器(或可能一組運行器)訪問,然而可能需要寫入緩存器2的Work_A任務(wù)可能已經(jīng)被無法寫入緩存器2的運行器挪用。在這樣的情況下,當(dāng)任務(wù)需要采取必須在與當(dāng)前正在執(zhí)行的任務(wù)所在的運行器不同的運行器上執(zhí)行的動作時,以“遷移”或“推動”方式將任務(wù)遷移到合適的運行器。

在至少一些示例中,計算平臺150支持一組全局變量對(鍵,值)的全局?jǐn)?shù)據(jù)存儲。該數(shù)據(jù)存儲可以分布在多個計算節(jié)點(或處理引擎)上的存儲器(例如,RAM或磁盤)上。鍵的名稱空間是全局的,因為鍵的規(guī)范在所有計算節(jié)點152及其運行器1450處具有相同的含義。這些變量的值在任務(wù)被實例化、執(zhí)行和終止時持續(xù),從而提供了一種在任務(wù)之間傳遞信息的方式,而不需要經(jīng)由共同的父任務(wù)將這種信息從一個任務(wù)傳遞到另一個任務(wù)。如下所述,根據(jù)鍵對進(jìn)行的訪問被控制,使得值的使用和更新不會導(dǎo)致任務(wù)之間的沖突。在一些示例中,任務(wù)對于它們的一些或全部執(zhí)行而獲得對特定(鍵,值)對的獨占訪問。

通常,(鍵,值)對的存儲是分布的,并且任何特定(鍵,值)對與特定計算節(jié)點152相關(guān)聯(lián)。例如,(鍵,值)對存儲在該計算節(jié)點處的分布式表存儲1480中。在一些實現(xiàn)方式中,派生原語允許指定鍵和從相關(guān)聯(lián)的變量到任務(wù)的局部變量的映射。當(dāng)指定一個鍵時,派生的任務(wù)在其執(zhí)行的持續(xù)時間內(nèi)獲得對鍵的獨占訪問。在執(zhí)行開始之前,將值從存儲傳遞到任務(wù)的本地上下文中,并且在執(zhí)行完成后,本地上下文中的值將被傳遞回全局存儲。如果一個派生原語指定另一個正在執(zhí)行的任務(wù)使用的鍵,則這個新派生的任務(wù)將被阻止,直到它可以獲得對該鍵的獨占訪問。在一些實現(xiàn)方式中,每個計算節(jié)點可以確定特定鍵的主節(jié)點,并且當(dāng)請求派生任務(wù)時,該請求由(鍵,值)對駐留的計算節(jié)點處理,并且任務(wù)的執(zhí)行將最初在該節(jié)點開始。在替代實施例中,用于獲得對這種全局共享(鍵,值)對的類似的獨占訪問的其他方法不是必然涉及在與存儲相同的位置發(fā)起任務(wù),例如通過傳送獨占訪問的請求并且隨后使用更新的鍵值來傳送獨占訪問的釋放。任務(wù)可以創(chuàng)建新的(鍵,值)對,在默認(rèn)情況下,在創(chuàng)建新(鍵,值)對時新的(鍵,值)對存儲在任務(wù)運行的節(jié)點上。

全局狀態(tài)變量的一種用途是在執(zhí)行集合的連續(xù)記錄的函數(shù)期間進(jìn)行聚集。例如,全局存儲維護(hù)分配給鍵的值的窗口,而不是作為單項的值。因此,在編程模型中,可以將值添加到與鍵相關(guān)聯(lián)地維護(hù)的歷史中,并且可以提供先前添加的值的函數(shù)。值的窗口可以根據(jù)項目的數(shù)量(即,最后的100項)定義,通過時間窗口定義(即,例如在最后10分鐘中添加的項目,由值被添加時的時間定義或由每個值被添加時提供的顯式時間戳定義)。注意,編程模型不需要明確刪除落在窗口外的舊值,窗口的定義允許實現(xiàn)自動執(zhí)行這樣的刪除。編程模型包括用于創(chuàng)建這種基于窗口的鍵控全局變量的多個原語(例如,定義窗口的性質(zhì)和范圍),將值添加到鍵以及值的窗口的計算函數(shù)(例如,最大值,平均值,不同值的數(shù)量,等等)。一些原語將針對鍵的新值的添加和窗口函數(shù)的返回(例如,將新值添加到鍵并返回添加的最后100個值的平均值)組合。

在至少一些示例中,全局存儲還包括經(jīng)由稱為句柄的標(biāo)識符訪問的面向記錄的共享數(shù)據(jù)。例如,句柄可以標(biāo)識數(shù)據(jù)記錄的源或宿,或者作為另一示例,句柄可以標(biāo)識數(shù)據(jù)集中的特定記錄。通常,句柄被鍵入,因為句柄點提供了訪問數(shù)據(jù)的方式,并且還提供被訪問的數(shù)據(jù)結(jié)構(gòu)的定義。例如,句柄可以具有與其相關(guān)聯(lián)的數(shù)據(jù)記錄的字段(列)結(jié)構(gòu)。

在至少一些示例中,全局存儲器(例如,在計算節(jié)點的存儲器中)包括針對多行類型化數(shù)據(jù)的一個或多個表的表存儲,其中該表格或表格的特定記錄經(jīng)由稱為句柄的標(biāo)識符被訪問。表的行類型可以是具有向量、記錄向量等的層級記錄類型。在一些示例中,表可以具有提供對行的哈希或B樹(有序)訪問的一個或多個索引,并且游標(biāo)可以基于表、索引或索引和鍵值創(chuàng)建。行可以單獨插入、更新或刪除。為了支持事務(wù)處理,任務(wù)可以鎖定一個或多個表的一行或多行,例如,用于在對數(shù)據(jù)處理圖的組件的處理期間讀取或更新訪問。表可以被視為用于數(shù)據(jù)并行操作的集合,例如,作為數(shù)據(jù)處理圖中的數(shù)據(jù)的源或目標(biāo)。通常,對表進(jìn)行索引,并且可以基于產(chǎn)生游標(biāo)的索引來選擇表的行的子集,然后使用該游標(biāo)來提供所選擇的行作為數(shù)據(jù)源。在一些示例中,另外的原語對任務(wù)可用,用于諸如分割游標(biāo)和估計與句柄相關(guān)聯(lián)的記錄的數(shù)量的動作。當(dāng)提供游標(biāo)作為用于執(zhí)行集的數(shù)據(jù)源時,游標(biāo)可以被分割成多個部分,每個部分將表的一些行提供給執(zhí)行集的對應(yīng)實例,從而提供并行性并且適當(dāng)?shù)胤指钣螛?biāo)使得能夠在存儲行的節(jié)點上執(zhí)行。數(shù)據(jù)表還可以由實現(xiàn)事務(wù)的任務(wù)訪問,使得維護(hù)數(shù)據(jù)表的修改,以便在任務(wù)之外不可見,直到由任務(wù)明確地提交這些修改。在一些示例中,可以通過鎖定表的一個或多個行來實現(xiàn)這樣的事務(wù)支持,而在其他示例中,可以實現(xiàn)涉及行的多個版本的更復(fù)雜的方法,以比可以僅使用鎖定提供更高的潛在并發(fā)性。

文件、數(shù)據(jù)流和內(nèi)存表都是被稱為集合的示例。讀取器任務(wù)從集合中讀取記錄,并且寫入器任務(wù)將記錄寫入集合。一些任務(wù)既是讀取器又是寫入器。

如上所述,表示集合的流可以使用內(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í)行集相對應(yīng)的任務(wù)的多個實例,從而通過以數(shù)據(jù)元素被接收到存儲中的順序不同的順序從存儲中取出這些數(shù)據(jù)元素,對來自上游集合端口的驅(qū)動數(shù)據(jù)元素進(jìn)行處理,防止某些形式的阻塞。例如,可以調(diào)用任務(wù)的實例而不阻止任何特定的其他實例調(diào)用任何實例(即,直到任何特定的其他實例完成處理一個或多個數(shù)據(jù)元素之后)。

通常,集合中的記錄可以在該記錄中的數(shù)據(jù)被首次寫入之前具有句柄。例如,可以將表設(shè)置為索引的一組記錄的目標(biāo),并且即使在寫入那些記錄的數(shù)據(jù)之前,各個記錄也可以具有句柄。

6實現(xiàn)方式

上述方法可以例如使用執(zhí)行合適的軟件指令的可編程計算系統(tǒng)來實現(xiàn),或者可以在諸如現(xiàn)場可編程門陣列(FPGA)或一些混合形式的合適的硬件中實現(xiàn)。例如,在編程方法中,軟件可以包括在一個或多個編程或可編程計算系統(tǒng)(其可以是諸如分布式、客戶端/服務(wù)器或網(wǎng)格的各種架構(gòu))上執(zhí)行的一個或多個計算機程序中的過程,每個計算系統(tǒng)包括至少一個處理器,至少一個數(shù)據(jù)存儲系統(tǒng)(包括易失性和/或非易失性存儲器和/或存儲元件),至少一個用戶界面(用于使用至少一個輸入設(shè)備或端口接收輸入,并且用于使用至少一個輸出設(shè)備或端口提供輸出)。軟件可以包括例如提供與數(shù)據(jù)處理圖的設(shè)計、配置和執(zhí)行相關(guān)的服務(wù)的更大程序的一個或多個模塊。程序的模塊(例如,數(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ǔn)備加載指令時,軟件可以提供在有形、非暫時性介質(zhì)上,例如CD-ROM或其他計算機可讀介質(zhì)(例如,可由通用或?qū)S糜嬎阆到y(tǒng)或設(shè)備讀取),或者可以通過網(wǎng)絡(luò)的通信介質(zhì)被遞送(例如,被編碼成傳播信號)到其被執(zhí)行的計算系統(tǒng)的有形、非暫時性介質(zhì)??梢栽趯S糜嬎銠C上或使用諸如協(xié)處理器或現(xiàn)場可編程門陣列(FPGA)或特定的專用集成電路(ASIC)的專用硬件來執(zhí)行處理中的一些或全部。處理可以以分布式方式實現(xiàn),其中由軟件指定的計算的不同部分由不同的計算元件執(zhí)行。每個這樣的計算機程序優(yōu)選地存儲在或下載到可由通用或?qū)S每删幊逃嬎銠C訪問的存儲設(shè)備的計算機可讀存儲介質(zhì)(例如,固態(tài)存儲器或介質(zhì),或磁介質(zhì)或光介質(zhì))上,用于當(dāng)計算機讀取存儲設(shè)備介質(zhì)以執(zhí)行本文所述的處理時,配置和操作計算機。本發(fā)明的系統(tǒng)還可以被認(rèn)為可實現(xiàn)為配置有計算機程序的有形的、非暫時性介質(zhì),其中如此配置的介質(zhì)使得計算機以特定和預(yù)定義的方式操作以執(zhí)行本文描述的一個或多個處理步驟。

已經(jīng)描述了本發(fā)明的多個實施例。然而,應(yīng)當(dāng)理解,前述描述旨在說明而不是限制本發(fā)明的范圍,本發(fā)明的范圍由所附權(quán)利要求的范圍限定。因此,其他實施例也在所附權(quán)利要求的范圍內(nèi)。例如,在不脫離本發(fā)明的范圍的情況下可以進(jìn)行各種修改。另外,上述的一些步驟可以是與順序無關(guān)的,并且因此可以以與所描述的順序不同的順序來執(zhí)行。

權(quán)利要求書(按照條約第19條的修改)

1.一種用于執(zhí)行基于圖的程序規(guī)范的方法,所述方法包括:

存儲基于圖的程序規(guī)范,所述基于圖的程序規(guī)范包括對應(yīng)于任務(wù)的多個組件,所述多個組件中的至少一些組件每個具有以下中的至少一個:

(1)至少一個輸入端口,用于接收待由對應(yīng)任務(wù)處理的數(shù)據(jù)元素的集合,或者

(2)至少一個集合型輸出端口,用于提供數(shù)據(jù)元素的集合由與鏈接到集合型輸出端口的組件相對應(yīng)的任務(wù)處理;以及

執(zhí)行由所述基于圖的程序規(guī)范指定的程序,所述執(zhí)行包括:

經(jīng)由連接到所述多個組件中的第一組件的集合型輸出端口以及所述多個組件中的第二組件的輸入端口的鏈路,以第一順序?qū)?shù)據(jù)元素的第一集合中的兩個或更多數(shù)據(jù)元素接收到第一存儲區(qū)中,以及

調(diào)用對應(yīng)于所述第二組件的任務(wù)的多個實例以處理數(shù)據(jù)元素的所述第一集合中的數(shù)據(jù)元素,包括:以第二順序從所述第一存儲區(qū)取出數(shù)據(jù)元素,直到任何特定實例完成處理一個或多個數(shù)據(jù)元素后不阻止任何實例,

其中所述第一順序不同于所述第二順序。

2.根據(jù)權(quán)利要求1所述的方法,其中調(diào)用對應(yīng)于所述第二組件的任務(wù)的一個或多個實例包括調(diào)用對應(yīng)于所述第二組件的任務(wù)的多個實例。

3.根據(jù)權(quán)利要求2所述的方法,其中調(diào)用對應(yīng)于所述第二組件的任務(wù)的多個實例包括調(diào)用對應(yīng)于所述第二組件的任務(wù)的多個順序執(zhí)行的實例。

4.根據(jù)權(quán)利要求2所述的方法,其中調(diào)用對應(yīng)于所述第二組件的任務(wù)的多個實例包括調(diào)用對應(yīng)于所述第二組件的任務(wù)的多個并發(fā)執(zhí)行的實例。

5.根據(jù)權(quán)利要求4所述的方法,其中對應(yīng)于所述第二組件的任務(wù)的多個實例中的任務(wù)的每個實例對應(yīng)于數(shù)據(jù)元素的所述第一集合的不同的、非重疊的子集。

6.根據(jù)權(quán)利要求5所述的方法,其中數(shù)據(jù)的所述第一集合的每個不同的、非重疊的子集包括單個數(shù)據(jù)元素。

7.根據(jù)權(quán)利要求1所述的方法,其中所述第二組件的輸入端口是集合型輸入端口,用于接收待由對應(yīng)于所述第二組件的任務(wù)處理的數(shù)據(jù)元素的集合,并且調(diào)用對應(yīng)于所述第二組件的任務(wù)的一個或多個實例包括調(diào)用對應(yīng)于所述第二組件的任務(wù)的單個實例。

8.根據(jù)權(quán)利要求7所述的方法,其中對應(yīng)于所述第二組件的任務(wù)的單個實例迭代地處理數(shù)據(jù)元素的所述第一集合中的數(shù)據(jù)元素。

9.根據(jù)前述權(quán)利要求中任一項所述的方法,其中所述執(zhí)行還包括生成包括第一數(shù)量的數(shù)據(jù)元素的輸出,所述第一數(shù)量與所述第一集合中數(shù)據(jù)元素的第二數(shù)量相同。

10.根據(jù)權(quán)利要求9所述的方法,其中所述執(zhí)行還包括以第三順序?qū)⑺鲚敵鎏峁┙o第二存儲區(qū),所述第三順序獨立于數(shù)據(jù)元素的所述第一集合的所述第一順序。

11.根據(jù)權(quán)利要求1至8中任一項所述的方法,其中所述執(zhí)行還包括生成包括第一數(shù)量的數(shù)據(jù)元素的輸出,其中所述第一數(shù)量與所述第一集合中數(shù)據(jù)元素的第二數(shù)量不同。

12.根據(jù)前述權(quán)利要求中任一項所述的方法,其中所述多個組件中的至少一些組件每個具有:

至少一個標(biāo)量型輸入端口,用于接收待由對應(yīng)任務(wù)處理的單個數(shù)據(jù)元素,以及

至少一個標(biāo)量型輸出端口,用于提供單個數(shù)據(jù)元素由與鏈接到標(biāo)量型輸出端口的組件相對應(yīng)的任務(wù)處理;以及

執(zhí)行由所述基于圖的程序規(guī)范指定的程序還包括:

經(jīng)由將標(biāo)量型輸出端口連接到標(biāo)量型輸入端口的鏈路,在所述多個組件中的第三組件的標(biāo)量型輸入端口處,從所述多個組件中的第四組件的標(biāo)量型輸出端口接收單個數(shù)據(jù)元素;以及

響應(yīng)于在標(biāo)量型輸入端口處接收到單個數(shù)據(jù)元素,調(diào)用對應(yīng)于所述第三組件的任務(wù)的實例。

13.根據(jù)權(quán)利要求12所述的方法,其中執(zhí)行由所述基于圖的程序規(guī)范指定的程序還包括:直到在標(biāo)量型輸入端口處接收到單個數(shù)據(jù)元素后,阻止調(diào)用對應(yīng)于所述第三組件的任務(wù)。

14.根據(jù)權(quán)利要求12或13所述的方法,其中執(zhí)行由所述基于圖的程序規(guī)范指定的程序還包括:直到在標(biāo)量型輸入端口處接收到單個數(shù)據(jù)元素后,阻止直接地或間接地調(diào)用與依賴于所述第三組件的組件相對應(yīng)的任務(wù)。

15.根據(jù)前述權(quán)利要求中任一項所述的方法,還包括確定連接到所述第一組件的集合型輸出端口和所述第二組件的輸入端口的鏈路的存在,此鏈路的存在標(biāo)志著可以重新排序所述第一集合內(nèi)的數(shù)據(jù)元素。

16.一種以非暫時形式存儲在計算機可讀介質(zhì)上的軟件,用于執(zhí)行基于圖的程序規(guī)范,所述軟件包括用于使得計算系統(tǒng)執(zhí)行以下操作的指令:

存儲基于圖的程序規(guī)范,所述基于圖的程序規(guī)范包括對應(yīng)于任務(wù)的多個組件,所述多個組件中的至少一些組件每個具有以下中的至少一個:

(1)至少一個輸入端口,用于接收待由對應(yīng)任務(wù)處理的數(shù)據(jù)元素的集合,或者

(2)至少一個集合輸出端口,用于提供數(shù)據(jù)元素的集合由與鏈接到集合輸出端口的組件相對應(yīng)的任務(wù)處理;以及

執(zhí)行由所述基于圖的程序規(guī)范指定的程序,所述執(zhí)行包括:

經(jīng)由連接到所述多個組件中的第一組件的集合輸出端口以及所述多個組件中的第二組件的輸入端口的鏈路,以第一順序?qū)?shù)據(jù)元素的第一集合中的兩個或更多數(shù)據(jù)元素接收到第一存儲區(qū)中,以及

調(diào)用對應(yīng)于所述第二組件的任務(wù)的多個實例以處理數(shù)據(jù)元素的所述第一集合中的數(shù)據(jù)元素,包括:以第二順序從所述第一存儲區(qū)取出數(shù)據(jù)元素,直到任何特定實例完成處理一個或多個數(shù)據(jù)元素后不阻止任何實例,

其中所述第一順序不同于所述第二順序。

17.一種計算系統(tǒng),用于執(zhí)行基于圖的程序規(guī)范,所述計算系統(tǒng)包括:

數(shù)據(jù)存儲系統(tǒng),用于存儲基于圖的程序規(guī)范,所述基于圖的程序規(guī)范包括對應(yīng)于任務(wù)的多個組件,所述多個組件中的至少一些組件每個具有以下中的至少一個:

(1)至少一個輸入端口,用于接收待由對應(yīng)任務(wù)處理的數(shù)據(jù)元素的集合,或者

(2)至少一個集合輸出端口,用于提供數(shù)據(jù)元素的集合由與鏈接到集合輸出端口的組件相對應(yīng)的任務(wù)處理;以及

至少一個處理器,被配置為執(zhí)行由所述基于圖的程序規(guī)范指定的程序,所述執(zhí)行包括:

經(jīng)由連接到所述多個組件中的第一組件的集合輸出端口以及所述多個組件中的第二組件的輸入端口的鏈路,以第一順序?qū)?shù)據(jù)元素的第一集合中的兩個或更多數(shù)據(jù)元素接收到第一存儲區(qū)中,以及

調(diào)用對應(yīng)于所述第二組件的任務(wù)的多個實例以處理數(shù)據(jù)元素的所述第一集合中的數(shù)據(jù)元素,包括:以第二順序從所述第一存儲區(qū)取出數(shù)據(jù)元素,直到任何特定實例完成處理一個或多個數(shù)據(jù)元素后不阻止任何實例,

其中所述第一順序不同于所述第二順序。

當(dāng)前第1頁1 2 3 
網(wǎng)友詢問留言 已有0條留言
  • 還沒有人留言評論。精彩留言會獲得點贊!
1