MapReduce中任務(wù)的調(diào)度方法和流水化執(zhí)行方法
【技術(shù)領(lǐng)域】
[0001] 本發(fā)明屬于計算機(jī)軟件應(yīng)用技術(shù)領(lǐng)域,涉及分布式計算框架MapReduce系統(tǒng)中的 任務(wù)執(zhí)行和調(diào)度,尤其涉及一種MapReduce系統(tǒng)中的有依賴關(guān)系的任務(wù)之間的任務(wù)調(diào)度方 法和流水化執(zhí)行方法。
【背景技術(shù)】
[0002] 云計算是當(dāng)前工業(yè)界和學(xué)術(shù)界關(guān)注的熱點(diǎn),它改變了傳統(tǒng)上由用戶提供和維護(hù)計 算資源的模式,改由云計算廠商集中化管理計算資源,用戶可以根據(jù)不同的應(yīng)用場景,按需 獲取相應(yīng)的資源。如何利用資源集中化帶來的并行性、容錯性等特性,高效的提供云計算服 務(wù),成為了云計算模式最重要的研究問題之一。
[0003] MapReduce分布式計算框架是Google公司提出的軟件架構(gòu),借鑒了函數(shù)式編程的 思想,高效地進(jìn)行大規(guī)模數(shù)據(jù)集的分布式計算。MapReduce框架以其優(yōu)異的容錯性、計算 的高效性和使用的便捷性,迅速成為云計算環(huán)境下應(yīng)用最廣泛的分布式計算架構(gòu)。尤其是 2005年Apache Software Foundation引入基于MapReduce框架開發(fā)的Hadoop開源系統(tǒng)以 來,MapReduce架構(gòu)得到了更大的發(fā)展,利用MapReduce思想構(gòu)建的分布式計算系統(tǒng)已經(jīng)被 Google、微軟、Facebook、Yahoo !以及國內(nèi)的騰訊、百度、阿里云等軟件公司和互聯(lián)網(wǎng)公司 在各自的私有云集群中深度采用,并且也成為了當(dāng)前部署云計算集群進(jìn)行分布式計算的首 選軟件架構(gòu),在科學(xué)計算、人工智能、數(shù)據(jù)挖掘、信息處理等各個領(lǐng)域都得到了廣泛的應(yīng)用。
[0004] 一個典型的MapReduce系統(tǒng)中有一個Master節(jié)點(diǎn)和多個Worker節(jié)點(diǎn)。Master節(jié) 點(diǎn)負(fù)責(zé)接收用戶提交的任務(wù),向Worker節(jié)點(diǎn)分發(fā)執(zhí)行任務(wù),并且管理所有的Worker節(jié)點(diǎn)。 Worker節(jié)點(diǎn)是負(fù)責(zé)執(zhí)行由Master下發(fā)的map和reduce任務(wù)。
[0005] MapReduce共分為三個階段,分別為Map階段、Shuffle階段和Reduce階段,其中, Map階段是負(fù)責(zé)將所有的輸入數(shù)據(jù)(鍵值對的形式)通過用戶的map函數(shù)轉(zhuǎn)化為中間結(jié)果 (也是鍵值對的形式),這個過程是分布式進(jìn)行的,由Master下發(fā)Map任務(wù),Worker節(jié)點(diǎn)負(fù) 責(zé)執(zhí)行具體的Map任務(wù)。Shuff Ie階段是在Map和Reduce中間的一個過程,因?yàn)閞educe的 處理的數(shù)據(jù)是按照鍵值分區(qū)的,所以需要shuffle階段對map產(chǎn)生的中間結(jié)果的數(shù)據(jù)按照 鍵值進(jìn)行排序。每一個reduce都知道自己要處理的鍵值的區(qū)間,所以每一個reduce任務(wù) 都會去每一個map任務(wù)處拉取屬于自己鍵值區(qū)間的數(shù)據(jù),這樣每個reduce任務(wù)就會有對應(yīng) map任務(wù)數(shù)量那么多的小的分區(qū)數(shù)據(jù),然后全部拉取到reduce任務(wù)本地后,再將它們進(jìn)行 合并。這個拉取數(shù)據(jù)和合并數(shù)據(jù)的過程就是shuffle過程。Reduce階段就是將map產(chǎn)生的 中間結(jié)果(鍵值對)轉(zhuǎn)化為最終的輸出數(shù)據(jù)(鍵值對)。具體的轉(zhuǎn)化方法是根據(jù)用戶寫的 reduce函數(shù)。Reduce任務(wù)也是由Master下發(fā)的,由Worker節(jié)點(diǎn)進(jìn)行分布式執(zhí)行的。
[0006] -個具體的任務(wù)執(zhí)行過程如下:
[0007] (一)用戶上傳數(shù)據(jù)到分布式文件系統(tǒng)中(一般是GFS,開源實(shí)現(xiàn)為HDFS),并且向 MapReduce系統(tǒng)提交一個Job。
[0008] (二)MapReduce的Client將輸入數(shù)據(jù)劃分成多個分片(split,每個split默認(rèn) 是64M大小),并生成分片的信息(包括存儲位置,開始位置,以及split的真實(shí)大小),然 后把任務(wù)和分片信息提交給Master節(jié)點(diǎn)。
[0009] (三)Master節(jié)點(diǎn)根據(jù)分片信息,產(chǎn)生多個Map任務(wù),并將這些Map任務(wù)調(diào)度到不 同的節(jié)點(diǎn)并行執(zhí)行。
[0010] (四)每個Map任務(wù)會根據(jù)用戶定義的map和combine函數(shù)將輸入的key-value 對轉(zhuǎn)換為中間結(jié)果的key-value對;然后根據(jù)用戶定義的分區(qū)函數(shù),將中間結(jié)果按照key劃 分成不同的分區(qū)。并將這些分區(qū)內(nèi)容存放到本地磁盤上。
[0011] (五)當(dāng)Map任務(wù)完成一定比例之后,Master節(jié)點(diǎn)會開始分發(fā)Reduce任務(wù)。
[0012] (六)每一個Reduce任務(wù)從每一個Map任務(wù)處拷貝自己的分區(qū)數(shù)據(jù),當(dāng)所有的Map 任務(wù)都完成之后,Reduce任務(wù)用多路歸并方法根據(jù)中間數(shù)據(jù)的key將多個Map取來的數(shù)據(jù) 合并成一個輸入數(shù)據(jù)流,然后根據(jù)用戶定義的reduce函數(shù),將中間結(jié)果表示的key-value 類型轉(zhuǎn)換成最終的key-value表示,最后將數(shù)據(jù)輸出到用戶指定的分布式文件系統(tǒng)的目錄 中。
[0013] 在上述的任務(wù)執(zhí)行過程中,Master沒有指定任務(wù)的執(zhí)行計劃,沒有任務(wù)調(diào)度,而 只是簡單的按照用戶提交的順序?qū)⑷蝿?wù)依次執(zhí)行,而任務(wù)提交的順序是由用戶來決定的。 另外,在MapReduce中,任務(wù)在開始執(zhí)行之前,其所需要的數(shù)據(jù)必須是準(zhǔn)備好任務(wù)才可以執(zhí) 行。這是因?yàn)槿蝿?wù)執(zhí)行之前必須知道輸入數(shù)據(jù)的split信息。當(dāng)遇到了有依賴關(guān)系的一系 列任務(wù)的時候(比如迭代式的機(jī)器學(xué)習(xí)庫、復(fù)雜的分布式數(shù)據(jù)庫查詢系統(tǒng)hive或pig等), 任務(wù)的執(zhí)行就只能是:一個任務(wù)在執(zhí)行之前就要等待與該任務(wù)有依賴關(guān)系的所有的其他任 務(wù)都已經(jīng)執(zhí)行完畢,該任務(wù)才可以執(zhí)行。因此,針對多任務(wù)的應(yīng)用,現(xiàn)有任務(wù)執(zhí)行過程不能 進(jìn)行任務(wù)調(diào)度,也無法提供流水化(pipeline)的任務(wù)執(zhí)行優(yōu)化,難以最大化有依賴的任務(wù) 之間的執(zhí)行重疊。
【發(fā)明內(nèi)容】
[0014] 為了克服上述現(xiàn)有技術(shù)的不足,本發(fā)明提供一種MapReduce系統(tǒng)中的有依賴關(guān) 系的任務(wù)之間的任務(wù)調(diào)度方法和流水化執(zhí)行方法,將有依賴關(guān)系的任務(wù)根據(jù)依賴關(guān)系 和優(yōu)先程度進(jìn)行任務(wù)調(diào)度,使得有依賴關(guān)系的任務(wù)之間的執(zhí)行重疊最大化,提供流水化 (pipeline)的任務(wù)執(zhí)行優(yōu)化。
[0015] 本發(fā)明的原理是:MapReduce框架中的任務(wù)依賴關(guān)系包括:第一種依賴關(guān)系是任 務(wù)B的輸入數(shù)據(jù)是任務(wù)A的輸出數(shù)據(jù);第二種是任務(wù)B在Map階段或者Reduce階段需要在 代碼中直接對A的輸出文件進(jìn)行讀取,本文定義第二種依賴關(guān)系為硬依賴關(guān)系。MapReduce 框架本身不維護(hù)任務(wù)之間的依賴關(guān)系,所以在所有的有依賴關(guān)系的任務(wù)之間,需要通過 輸出文件來進(jìn)行同步。本發(fā)明提供的任務(wù)調(diào)度方法采用DAG關(guān)系圖(Directed acyclic graph,有向無環(huán)圖)表示任務(wù)之間的依賴關(guān)系;MapReduce框架中的Master根據(jù)任務(wù)時間 預(yù)測方法預(yù)測得到任務(wù)的執(zhí)行時間;再根據(jù)DAG圖和關(guān)鍵路徑算法,獲得關(guān)鍵路徑和關(guān)鍵 任務(wù);根據(jù)優(yōu)先程度找到一個任務(wù)添加到當(dāng)前任務(wù)運(yùn)行隊列中,并更新該組任務(wù)的DAG關(guān) 系圖。為提供依賴任務(wù)的流水化執(zhí)行過程,需要了解一個任務(wù)在執(zhí)行完畢之前的輸出數(shù)據(jù) 在哪里和以哪種形式存在、決定該任務(wù)應(yīng)該將輸出數(shù)據(jù)流水給下游的哪個任務(wù),并使得下 游的任務(wù)在一個不斷增長的數(shù)據(jù)上進(jìn)行執(zhí)行過程,而保證下游任務(wù)執(zhí)行的正確性并提供容 錯性。MapReduce框架為了支持失敗任務(wù)的回滾,會將輸出數(shù)據(jù)輸出到HDFS的一個臨時文 件夾內(nèi),當(dāng)所有的任務(wù)都已經(jīng)執(zhí)行成功,再將這個臨時文件夾移動到最終的輸出位置。而 且,一旦有一個block產(chǎn)生,系統(tǒng)就會將其刷新到HDFS中。因此,只要是有一個輸出的block 產(chǎn)生,就可以馬上看到,由此獲得一個任務(wù)在執(zhí)行完畢之前的輸出數(shù)據(jù)在哪里和以哪種形 式存在的信息。然后,根據(jù)任務(wù)之間的第一種依賴關(guān)系,給所有的任務(wù)建立一個DAG圖,如 果兩個任務(wù)之間有依賴關(guān)系,就會有一條邊;因此,我們只需要在DAG圖中找到當(dāng)前任務(wù)的 下游任務(wù),將數(shù)據(jù)流水給下游任務(wù)即可。之后,為使得下游的任務(wù)在一個不斷增長的數(shù)據(jù) 上進(jìn)行執(zhí)行,當(dāng)該下游任務(wù)還不在可以執(zhí)行的隊列中(也就是它還存在依賴的任務(wù)還沒有 執(zhí)行完),則初始化它的map任務(wù)的數(shù)量為最大的整數(shù)值;因此reduce任務(wù)就會一直等待 在shuffle階段;當(dāng)檢測到上游任務(wù)有一個新的block產(chǎn)生的時候,就會通知所有的下游任 務(wù),下游任務(wù)會產(chǎn)生新的map任務(wù)進(jìn)行執(zhí)行;與MapReduce框架本身相比,本發(fā)明提供方法 可以在運(yùn)行過程中動態(tài)的添加分片信息;針對第一種依賴關(guān)系,下游任務(wù)對應(yīng)的上游任務(wù) 只要是進(jìn)入了 reduce階段,并且產(chǎn)生了至少一個block的輸出時,就可以將該下游任務(wù)加 入到可執(zhí)行隊列中進(jìn)行執(zhí)行了。若為硬依賴關(guān)系,則跟原來需要等待所有的任務(wù)執(zhí)行完畢 才可以執(zhí)行下游相同,只能按照系統(tǒng)原來的方式,等待其所有的上有任務(wù)執(zhí)行完畢才開始 執(zhí)行該任務(wù);當(dāng)該下游任務(wù)的所有上游任務(wù)都執(zhí)行完畢之后,就可以修改該任務(wù)的map的 數(shù)量為正確的數(shù)量,繼續(xù)reduce階段。
[0016] 本發(fā)明提供的技術(shù)方案是:
[0017] -種MapReduce系統(tǒng)中的任務(wù)調(diào)度方法,將有依賴關(guān)系的任務(wù)根據(jù)依賴關(guān)系和 優(yōu)先程度進(jìn)行任務(wù)調(diào)度,使得有依賴關(guān)系的任務(wù)之間的執(zhí)行重疊最大化,具體包括如下步 驟:
[0018] 1)用戶提交一組任務(wù)到MapReduce框架系統(tǒng)中;設(shè)定當(dāng)前任務(wù)運(yùn)行隊列為空;
[0019] 2)Master更新得到該組任務(wù)的DAG關(guān)系圖;DAG關(guān)系圖表示該組任務(wù)之間的依賴 關(guān)系;
[0020] 3)Master根據(jù)任務(wù)時間預(yù)測方法預(yù)測得到任務(wù)的執(zhí)行時間;
[0021] 4)當(dāng)當(dāng)前任務(wù)運(yùn)行隊列為空時,若DAG圖中不為空,根據(jù)DAG圖和關(guān)鍵路徑算法, 獲得關(guān)鍵路徑和關(guān)鍵任務(wù);根據(jù)優(yōu)先程度找到一個或多個任務(wù)添加到當(dāng)前任務(wù)運(yùn)行隊列 中,并更新該組任務(wù)的DAG關(guān)系圖(從DAG圖中將添加到當(dāng)前任務(wù)運(yùn)行隊列的這些任務(wù)刪 除),轉(zhuǎn)入執(zhí)行步驟5);若DAG圖中為空,則系統(tǒng)執(zhí)行完畢;
[0022] 5)執(zhí)行當(dāng)前任