本發(fā)明涉及數(shù)據(jù)處理技術(shù)領(lǐng)域,尤其涉及一種適用于流計(jì)算的數(shù)據(jù)調(diào)度方法。
背景技術(shù):
隨著信息技術(shù)的飛速發(fā)展,基于數(shù)據(jù)處理和數(shù)據(jù)分析的應(yīng)用受到了廣泛的歡迎和關(guān)注。大量信息源帶來(lái)了數(shù)據(jù)規(guī)模的爆發(fā)式增長(zhǎng),因此對(duì)海量數(shù)據(jù)進(jìn)行復(fù)雜計(jì)算已經(jīng)遠(yuǎn)遠(yuǎn)超過(guò)單臺(tái)計(jì)算機(jī)的處理能力,由此推動(dòng)了對(duì)分布式系統(tǒng)及其關(guān)鍵技術(shù)的研究。
分布式計(jì)算中把需要進(jìn)行復(fù)雜計(jì)算的海量數(shù)據(jù)切分成小塊后分交由多臺(tái)計(jì)算機(jī)并行處理,并將局部計(jì)算結(jié)果整合得出最終結(jié)果。在復(fù)雜、海量、異構(gòu)的數(shù)據(jù)環(huán)境中,不僅包含靜態(tài)的、離線的、結(jié)構(gòu)化的數(shù)據(jù),還有實(shí)時(shí)傳輸?shù)?、持續(xù)產(chǎn)生的、非結(jié)構(gòu)化的數(shù)據(jù)。面對(duì)這些“無(wú)限”運(yùn)動(dòng)著的數(shù)據(jù),如果不能對(duì)其進(jìn)行高效率的實(shí)時(shí)處理,將錯(cuò)過(guò)數(shù)據(jù)流中攜帶的關(guān)鍵信息。整合來(lái)自多個(gè)異構(gòu)數(shù)據(jù)源的“運(yùn)動(dòng)”數(shù)據(jù),在其“運(yùn)動(dòng)”的過(guò)程執(zhí)行復(fù)雜的邏輯處理,包括數(shù)值計(jì)算、數(shù)據(jù)挖掘和模型預(yù)測(cè),實(shí)時(shí)地給出用戶關(guān)心的結(jié)果,這是傳統(tǒng)分布式計(jì)算模式所無(wú)法做到的。
在傳統(tǒng)的數(shù)據(jù)調(diào)度方法中,數(shù)據(jù)往往獨(dú)立于應(yīng)用,由系統(tǒng)負(fù)責(zé)將數(shù)據(jù)集中存儲(chǔ)到磁盤上的關(guān)系表里并基于該關(guān)系表進(jìn)行調(diào)度,存儲(chǔ)的數(shù)據(jù)是靜態(tài)的、固定的集合。針對(duì)這種處理模式的應(yīng)用雖然可能頻繁查詢,但因?yàn)椴僮鞯膶?duì)象是持久和穩(wěn)定的,因此傳統(tǒng)的數(shù)據(jù)調(diào)度方式并不適用于流計(jì)算。
技術(shù)實(shí)現(xiàn)要素:
本發(fā)明所要解決的技術(shù)問(wèn)題在于提供一種適用于流計(jì)算的數(shù)據(jù)調(diào)度方法。
為解決上述技術(shù)問(wèn)題,本發(fā)明采用如下技術(shù)方案:
本發(fā)明提供了一種數(shù)據(jù)調(diào)度方法,包括:
實(shí)時(shí)獲取數(shù)據(jù)流和待處理任務(wù)的訂閱關(guān)系,建立與待處理任務(wù)一一對(duì)應(yīng)的鏈表;
逐條讀取來(lái)自數(shù)據(jù)管道的數(shù)據(jù)流;
根據(jù)所述訂閱關(guān)系,將接收到的數(shù)據(jù)流放入對(duì)應(yīng)的鏈表中;
基于鏈表,傳輸對(duì)應(yīng)的數(shù)據(jù)流。
優(yōu)選的,在實(shí)時(shí)獲取數(shù)據(jù)流和待處理任務(wù)的訂閱關(guān)系之前,還包括:
在特定端口監(jiān)聽連接請(qǐng)求;
當(dāng)獲取到預(yù)設(shè)信號(hào),打開數(shù)據(jù)管道。
優(yōu)選的,實(shí)時(shí)獲取數(shù)據(jù)流和待處理任務(wù)的訂閱關(guān)系包括:
獲取處于就緒狀態(tài)的待處理任務(wù)的優(yōu)先級(jí);
基于各處于就緒狀態(tài)的待處理任務(wù)的優(yōu)先級(jí),對(duì)各處于就緒狀態(tài)的待處理任務(wù)進(jìn)行排位,獲得優(yōu)先級(jí)隊(duì)列;
基于所述優(yōu)先級(jí)隊(duì)列,開啟數(shù)個(gè)位于所述優(yōu)先級(jí)隊(duì)列前列的待處理任務(wù);
實(shí)時(shí)獲取數(shù)據(jù)流和所開啟的待處理任務(wù)的訂閱關(guān)系。
優(yōu)選的,該數(shù)據(jù)調(diào)度方法還包括:
當(dāng)檢測(cè)到系統(tǒng)負(fù)載負(fù)荷超出預(yù)設(shè)負(fù)荷范圍或抖動(dòng)幅度超出預(yù)設(shè)幅度范圍時(shí),重新計(jì)算處于就緒狀態(tài)的待處理任務(wù)的優(yōu)先級(jí)。
優(yōu)選的,該數(shù)據(jù)調(diào)度方法還包括:
根據(jù)系統(tǒng)負(fù)載自適應(yīng)調(diào)整同時(shí)開啟的待處理任務(wù)的數(shù)量。
優(yōu)選的,同時(shí)開啟的待處理任務(wù)的數(shù)量為t=c/p,其中,c為系統(tǒng)所具有的處理器的數(shù)量,p為密集計(jì)算所占的時(shí)間比重,其中,p為小于或等于1的任意實(shí)數(shù)。
優(yōu)選的,將輸出數(shù)據(jù)流和對(duì)應(yīng)的輸出數(shù)據(jù)流名進(jìn)行存儲(chǔ)。
優(yōu)選的,待處理任務(wù)的優(yōu)先級(jí)的影響因子包括待處理任務(wù)的重要程度、系統(tǒng)的運(yùn)行狀況和任務(wù)算子的類型。
本發(fā)明實(shí)施例提供了一種適用于流計(jì)算的數(shù)據(jù)調(diào)度方法,該方法根據(jù)待處理任務(wù)和數(shù)據(jù)流的實(shí)時(shí)的訂閱關(guān)系,建立與待處理任務(wù)一一對(duì)應(yīng)的鏈表,之后讀取數(shù)據(jù)流,并將數(shù)據(jù)流存儲(chǔ)入對(duì)應(yīng)的鏈表中,最終將鏈表傳輸出去。由于鏈表是當(dāng)需要使用時(shí)才根據(jù)待處理任務(wù)進(jìn)行分配的,因此系統(tǒng)的硬件資源可以得到充分利用,并且這樣的調(diào)度是動(dòng)態(tài)的、非固定的集合,每個(gè)系統(tǒng)存儲(chǔ)空間內(nèi)的操作對(duì)象并非是持久和穩(wěn)定的,這樣的數(shù)據(jù)調(diào)度方法可適用于流計(jì)算。
附圖說(shuō)明
為了更清楚地說(shuō)明本發(fā)明實(shí)施例或現(xiàn)有技術(shù)中的技術(shù)方案,下面將對(duì)實(shí)施例描述中所需要使用的附圖作簡(jiǎn)單地介紹,顯而易見地,下面描述中的附圖僅僅是本發(fā)明的一些實(shí)施例,對(duì)于本領(lǐng)域普通技術(shù)人員來(lái)講,在不付出創(chuàng)造性勞動(dòng)的前提下,還可以根據(jù)這些附圖獲得其他的附圖。
圖1為本發(fā)明實(shí)施例提供的數(shù)據(jù)調(diào)度方法的流程示意圖。
具體實(shí)施方式
下面將結(jié)合本發(fā)明實(shí)施例中的附圖,對(duì)本發(fā)明實(shí)施例中的技術(shù)方案進(jìn)行清楚、完整地描述,顯然,所描述的實(shí)施例是本發(fā)明一部分實(shí)施例,而不是全部的實(shí)施例?;诒景l(fā)明中的實(shí)施例,本領(lǐng)域普通技術(shù)人員在沒(méi)有做出創(chuàng)造性勞動(dòng)前提下所獲得的所有其他實(shí)施例,都屬于本發(fā)明保護(hù)的范圍。
本發(fā)明實(shí)施例提供了一種適用于流計(jì)算的數(shù)據(jù)調(diào)度方法,如圖1所示,該數(shù)據(jù)調(diào)度方法包括:
步驟s1、實(shí)時(shí)獲取數(shù)據(jù)流和待處理任務(wù)的訂閱關(guān)系,建立與待處理任務(wù)一一對(duì)應(yīng)的鏈表。
實(shí)時(shí)獲取數(shù)據(jù)流和待處理任務(wù)的訂閱關(guān)系,可以實(shí)時(shí)了解到各待處理任務(wù)所需的數(shù)據(jù)流的數(shù)量、名稱、所需容量的大小等要素,并實(shí)時(shí)建立與待處理任務(wù)一一對(duì)應(yīng)的鏈表。如此,可以靈活地、充分地應(yīng)用處理系統(tǒng)或處理器的硬件設(shè)備、配置,使得處理系統(tǒng)或處理器得到充分發(fā)揮。
具體的,可通過(guò)zookeeper這樣一個(gè)分布式系統(tǒng)的可靠協(xié)調(diào)系統(tǒng)實(shí)時(shí)獲取數(shù)據(jù)流和外部的待處理任務(wù)的訂閱關(guān)系,實(shí)際上,一個(gè)待處理任務(wù)可能會(huì)依賴于多個(gè)輸入數(shù)據(jù)流,多個(gè)待處理任務(wù)之間可能需要使用同一個(gè)數(shù)據(jù)流。其中,鏈表可以以待處理任務(wù)的名稱進(jìn)行命名以進(jìn)行區(qū)分,或者也可對(duì)每一個(gè)鏈表賦予特定的標(biāo)識(shí)符、一串?dāng)?shù)字編碼之類,并建立鏈表與待處理任務(wù)的關(guān)系,從而建立與待處理任務(wù)一一對(duì)應(yīng)的鏈表。
步驟s2、逐條讀取來(lái)自數(shù)據(jù)管道的數(shù)據(jù)流。
為了讀取來(lái)自數(shù)據(jù)管道的數(shù)據(jù)流,首先需要打開數(shù)據(jù)管道。為了使得數(shù)據(jù)管道只在有需要的時(shí)候開啟,節(jié)省對(duì)硬件的占用時(shí)間,從而提高硬件的利用率,本發(fā)明實(shí)施例中,可首先在特定端口監(jiān)聽連接請(qǐng)求;當(dāng)獲取到預(yù)設(shè)的連接請(qǐng)求時(shí),打開數(shù)據(jù)管道。
具體的,可采用每線程循環(huán)(oneloopperthread)模式,在特定端口監(jiān)聽連接請(qǐng)求,當(dāng)收到來(lái)自上游的數(shù)據(jù)流名稱時(shí),代表上游已經(jīng)按照數(shù)據(jù)流名稱切分好一整個(gè)數(shù)據(jù)流,以讀?。╮ead)標(biāo)志打開先入先出(firstinputfirstoutput,簡(jiǎn)稱fifo)數(shù)據(jù)管道的讀端,逐條讀取其中的數(shù)據(jù)流。
步驟s3、根據(jù)訂閱關(guān)系,將接收到的數(shù)據(jù)流放入對(duì)應(yīng)的鏈表中。
步驟s4、基于鏈表,傳輸對(duì)應(yīng)的數(shù)據(jù)流。
由于與待處理任務(wù)對(duì)應(yīng)的數(shù)據(jù)流已經(jīng)放入對(duì)應(yīng)的鏈表中,因此,可以直接傳輸鏈表,相當(dāng)于把對(duì)應(yīng)待處理任務(wù)整合好的數(shù)據(jù)包進(jìn)行傳輸,方便且能保證數(shù)據(jù)的完整性。
進(jìn)一步的,為了防止數(shù)據(jù)包在傳輸?shù)倪^(guò)程中出錯(cuò),使得數(shù)據(jù)丟失。本發(fā)明實(shí)施例中,還可將輸出的數(shù)據(jù)流和對(duì)應(yīng)的數(shù)據(jù)流名進(jìn)行存儲(chǔ),這樣一旦數(shù)據(jù)流在傳輸?shù)倪^(guò)程中丟失,可以調(diào)取存儲(chǔ)記錄,再次發(fā)送數(shù)據(jù)流,保證了數(shù)據(jù)調(diào)度的完整性。
需要說(shuō)明的是,當(dāng)用很小的流量使cpu滿負(fù)荷或者用很小的cpu占用率使流量占滿網(wǎng)卡時(shí),多線程并不能帶來(lái)系統(tǒng)性能的提升,反而會(huì)帶來(lái)線程間切換、cpu爭(zhēng)用的性能損耗。但當(dāng)輸入/輸出操作和cpu計(jì)算在時(shí)間上“重疊”時(shí),多線程可以有效地降低系統(tǒng)延時(shí)。如果僅靠單線程既要負(fù)責(zé)接收輸入的數(shù)據(jù)流,又要負(fù)責(zé)邏輯計(jì)算,必然會(huì)因?yàn)楹臅r(shí)的輸入/輸出操作使處理任務(wù)等待,cpu閑置,增加響應(yīng)延遲。
因此本發(fā)明實(shí)施例中,可同時(shí)針對(duì)多個(gè)待處理任務(wù)進(jìn)行數(shù)據(jù)調(diào)度。但當(dāng)待處理任務(wù)過(guò)多時(shí),受到硬件配置的制約,無(wú)法同時(shí)處理所有的待處理任務(wù),因此,可對(duì)所有待處理任務(wù)進(jìn)行優(yōu)先級(jí)的計(jì)算、排序,優(yōu)先處理優(yōu)先級(jí)較高的多個(gè)待處理任務(wù)。
由于每一次完成優(yōu)先級(jí)的計(jì)算、排序過(guò)后,都需要重新提取優(yōu)先級(jí)較高的待處理任務(wù),即對(duì)對(duì)應(yīng)的待處理任務(wù)分配處理時(shí)間片。由于每個(gè)待處理任務(wù)肚餓時(shí)間片不是一致的,這增大了處理難度。因此,本發(fā)明實(shí)施例中,對(duì)待處理任務(wù)的優(yōu)先級(jí)的計(jì)算、排序不是周期性進(jìn)行的。因?yàn)楫?dāng)系統(tǒng)運(yùn)行穩(wěn)定、各項(xiàng)指標(biāo)沒(méi)有明顯波動(dòng)、任務(wù)算子沒(méi)有變更、輸入數(shù)據(jù)源的流速平穩(wěn)時(shí),沒(méi)有必要周期性地重新計(jì)算待處理任務(wù)的優(yōu)先級(jí)并重排優(yōu)先級(jí)隊(duì)列,這樣做反而會(huì)給節(jié)點(diǎn)帶來(lái)額外的負(fù)荷,此外,重新分配時(shí)間片會(huì)導(dǎo)致原本連續(xù)執(zhí)行的任務(wù)被中斷,增大了響應(yīng)延時(shí)。只有當(dāng)系統(tǒng)負(fù)載負(fù)荷較重、抖動(dòng)較大,預(yù)計(jì)會(huì)影響任務(wù)執(zhí)行效率時(shí),優(yōu)先級(jí)的重新計(jì)算和任務(wù)的重新調(diào)度才是有必要的。
其中,優(yōu)先級(jí)的影響因子包括該待處理任務(wù)的重要程度、節(jié)點(diǎn)的運(yùn)行狀況、任務(wù)算子的類型等等。
具體的,可同時(shí)處理多少個(gè)待處理任務(wù)可根據(jù)需要根據(jù)系統(tǒng)負(fù)載自適應(yīng)調(diào)整,即系統(tǒng)在處理待處理任務(wù)時(shí),密集計(jì)算所占的時(shí)間比重為p(0<p<=1),而系統(tǒng)一共有c個(gè)cpu,為了讓這c個(gè)cpu均參與執(zhí)行而又不過(guò)載,同時(shí)開啟的待處理任務(wù)的數(shù)量為t=c/p。
對(duì)這一策略進(jìn)行邊界條件驗(yàn)證:假設(shè)c=8,p=1.0,待處理任務(wù)完全是密集計(jì)算,則t=8。因?yàn)橥瑫r(shí)處理8個(gè)待處理任務(wù)就能讓8個(gè)cpu飽和,cpu資源己經(jīng)用盡,更多的并行處理的待處理任務(wù)并不能提高效率。假設(shè)c=8,p=0.5,執(zhí)行待處理任務(wù)時(shí)的計(jì)算一半是cpu密集型,一半是i/o密集型,則t=16??紤]操作系統(tǒng)能靈活合理地調(diào)度睡眠(sleeping)/寫磁盤(writing)/執(zhí)行(running)線程,那么大概16個(gè)“50%繁忙的線程”能讓8個(gè)cpu滿負(fù)荷運(yùn)轉(zhuǎn),啟動(dòng)更多的線程并不能提高吞吐量,反而因?yàn)樵黾由舷挛那袚Q的開銷而降低性能。t可以取一個(gè)固定值,比如5*c。
綜上所述,本發(fā)明實(shí)施例提供了一種適用于流計(jì)算的數(shù)據(jù)調(diào)度方法,該方法根據(jù)待處理任務(wù)和數(shù)據(jù)流的實(shí)時(shí)的訂閱關(guān)系,建立與待處理任務(wù)一一對(duì)應(yīng)的鏈表,之后讀取數(shù)據(jù)流,并將數(shù)據(jù)流存儲(chǔ)入對(duì)應(yīng)的鏈表中,最終將鏈表傳輸出去。由于鏈表是當(dāng)需要使用時(shí)才根據(jù)待處理任務(wù)進(jìn)行分配的,因此系統(tǒng)的硬件資源可以得到充分利用,并且這樣的調(diào)度是動(dòng)態(tài)的、非固定的集合,每個(gè)系統(tǒng)存儲(chǔ)空間內(nèi)的操作對(duì)象并非是持久和穩(wěn)定的,這樣的數(shù)據(jù)調(diào)度方法可適用于流計(jì)算。
以上所述,僅為本發(fā)明的具體實(shí)施方式,但本發(fā)明的保護(hù)范圍并不局限于此,任何熟悉本技術(shù)領(lǐng)域的技術(shù)人員在本發(fā)明揭露的技術(shù)范圍內(nèi),可輕易想到變化或替換,都應(yīng)涵蓋在本發(fā)明的保護(hù)范圍之內(nèi)。因此,本發(fā)明的保護(hù)范圍應(yīng)以所述權(quán)利要求的保護(hù)范圍為準(zhǔn)。