一種基于預調(diào)度的任務分配方法
【專利摘要】一種基于預調(diào)度的任務分配方法,首先在主節(jié)點接收到子節(jié)點的心跳信息時,對該節(jié)點的負載進行判斷,如果負載較輕則進行任務的預分配。子節(jié)點在接收到主節(jié)點返回的心跳指令后,如果發(fā)現(xiàn)預調(diào)度指令則啟動預調(diào)度線程,并在后臺循環(huán)判斷預調(diào)度條件是否滿足。如果條件滿足則將之前心跳信息中的預調(diào)度任務加入待調(diào)度任務池,并啟動該任務。當該預調(diào)度任務執(zhí)行完成后,關閉該線程。該發(fā)明能夠減少原h(huán)adoop系統(tǒng)的心跳-分配任務模式中兩次心跳之間對資源的浪費。
【專利說明】一種基于預調(diào)度的任務分配方法
【技術領域】
[0001]本發(fā)明屬于計算機【技術領域】,具體涉及一種云計算環(huán)境下Hadoop在運行過程中的基于預調(diào)度的任務分配方法。
【背景技術】
[0002]Hadoop是由Apache開源組織開發(fā)的一個高可靠性和高可擴展性的存儲與分布式并行計算平臺,最早是作為開源搜索引擎項目Nutch的基礎平臺而開發(fā)的,之后從Nutch項目中獨立出來,成為典型的開源云計算平臺之一,其核心實現(xiàn)了用于分布式計算的MapReduce計算框架和用于分布式存儲的HDFS(Hadoop Distributed File System)文件系統(tǒng)。
[0003]Map Reduce計算框架的實現(xiàn)主要包括兩部分:Jobtracker和Task Tracker。Jobtracker作為中心節(jié)點對子節(jié)點Task Tracker進行任務分配,默認情況下每臺計算機包含一個Task Tracker進程。Jobtracker和Task Tracker之間通過心跳方式進行通信。Task Tracker會進入一種循環(huán)運行狀態(tài),向Jobtracker定期發(fā)送心跳報告。Job Tracker根據(jù)Task Tracker當前的負載和資源情況,對其分配任務并通過心跳信息返回。每一個Task Tracker都有固定數(shù)量的資源(slot),用以執(zhí)行任務。Task Tracker在接收到Jobtracker中的任務指令后,會將待調(diào)度任務加入Task Launcher的待執(zhí)行任務隊列,由Task Launcher按照時間順序依次執(zhí)行隊列中的任務。
[0004]從上述流程可以看出,在現(xiàn)有的Hadoop中,Tasktracker需要周期性的通過心跳向Jobtracker索要任務(task)。在這種模式下,即使Tasktracker上出現(xiàn)了空閑資源(slot)時,依然要等這個周期結(jié)束時才能通過心跳通知Jobtracker。最壞情況下Tasktracker甚至可能要等待一個心跳周期。而在hadoop的默認設定中,當集群節(jié)點數(shù)量不超過300時,心跳默認為3秒。當集群數(shù)目超過300時,每增加一百臺節(jié)點,心跳增加I秒。可見,原h(huán)adoop系統(tǒng)的心跳-分配任務的模式對資源的浪費是比較嚴重的。
【發(fā)明內(nèi)容】
[0005]本發(fā)明的目的在于解決由于周期性的心跳通信模式產(chǎn)生的延時,使得子節(jié)點上兩次心跳間產(chǎn)生的資源無法被及時利用的問題,提出了基于預調(diào)度的任務分配方法,通過為子節(jié)點預先分配任務以防止其出現(xiàn)資源閑置,從而提高了集群整體的資源利用率和性能。
[0006]為達到上述目的,本發(fā)明采用的技術方案如下:
[0007]I)啟動主節(jié)點Job Tracker,開始主循環(huán)并啟動IPC Handler監(jiān)聽和處理子節(jié)點的心跳信息;
[0008]2) IPC Handler循環(huán)判斷是否有子節(jié)點發(fā)來心跳信息,若沒有則返回步驟I);
[0009]若有心跳信息到來則判斷該子節(jié)點之前是否執(zhí)行了預調(diào)度任務,若沒有執(zhí)行預調(diào)度任務則轉(zhuǎn)步驟3),若執(zhí)行了預調(diào)度任務則查看前次預調(diào)度任務是否成功,若失敗則記錄該失敗任務的子節(jié)點編號,成功則從預調(diào)度任務隊列和待調(diào)度任務隊列刪除已完成的任務;[0010]3)判斷該子節(jié)點的負載是否較輕,若該子節(jié)點負載較輕,則為其在待調(diào)度任務隊列中尋找符合下列條件的預調(diào)度任務,即當一個任務滿足:
[0011]①該任務處于可運行的狀態(tài);
[0012]②該任務未在此子節(jié)點上失敗過;
[0013]③該任務滿足數(shù)據(jù)本地性;
[0014]這三個條件時,選中該任務并將其加入預調(diào)度任務列表,Job Tracker將預調(diào)度任務和其他待執(zhí)行任務一起加入心跳信息中,否則,按普通任務指令進行;
[0015]否則,返回步驟I);
[0016]4) Job Tracker將心跳信息返回子節(jié)點。
[0017]所述的判斷該子節(jié)點的負載是否較輕,是根據(jù)預先分配任務即其數(shù)量占總體任務的比例由用戶自行配置,默認是5%,同時在當前尚未運行的任務集合中去掉該任務的信息,將其加入預分配任務列表。
[0018]所述的子節(jié)點(Task Tracker)端與主節(jié)點(Job Tracker)端相關的部件包括以下幾個部分:
[0019]I)主節(jié)點(Job Tracker)端相關的部件為IPC Handler,用于處理子節(jié)點的心跳請求和任務預分配流程;
[0020]2)子節(jié)點(Task Tracker)端的部件為:
[0021]①Task Launcher:即任務執(zhí)行部件,其從待執(zhí)行任務隊列(Task Queue)中取出待執(zhí)行任務,放入相應的資源槽(slot)中執(zhí)行該任務;
[0022]②Task Pre Scheduler:即預調(diào)度線程,負責在滿足預調(diào)度的條件下,將預先存儲在預調(diào)度任務隊列(Task Pre Schedule Queue)中的任務取出,放入待執(zhí)行隊列,執(zhí)行預調(diào)度。
[0023]所述的子節(jié)點(Task Tracker)從主節(jié)點(Job Tracker)接收到心跳信號后,將其中的任務指令存入待執(zhí)行任務隊列(Task Queue)并通知消費者(Task Launcher)。TaskLauncher則按照時間順序依次執(zhí)行Task Queue隊列中的任務;
[0024]如果出現(xiàn)了 Task Queue隊列為空且此時離下一次心跳周期還有較長時間,系統(tǒng)中又有空閑資源的情況下,會啟動預調(diào)度線程Task Pre Scheduler,將先前預分配的任務放入Task Queue隊列并通知Task Launcher線程開始工作。
[0025]所述的子節(jié)點Task Tracker接收預分配的任務后按下列步驟進行:
[0026]I) Task Tracker啟動后開始主循環(huán),同時啟動任務的執(zhí)行線程Task Launcher ;
[0027]2)Task Tracker的主循環(huán)接收到主節(jié)點返回的心跳信息,該返回的心跳信息中包含著分配的任務指令,如果心跳信息中包含預調(diào)度指令則保存該預調(diào)度任務,啟動預調(diào)度線程Task Pre Scheduler,并對Task Pre Scheduler進行計時,如果超時,將預調(diào)度失敗結(jié)果存入心跳信息后執(zhí)行步驟5),否則繼續(xù)執(zhí)行步驟3);
[0028]3) Task Pre Scheduler會持續(xù)的判斷當前是否滿足如下條件:
[0029]①Task Launcher的待執(zhí)行任務池是否為空;
[0030]②此時距離下一次心跳開始的時間是否足夠長;
[0031]③當前是否有空閑資源;
[0032]如果條件均滿足則Task Pre Scheduler就會將先前保存的預調(diào)度任務加入TaskLauncher的待執(zhí)行任務池中并通知Task Launcher開始執(zhí)行;
[0033]否則返回Task Tracker主循環(huán);
[0034]4)當該任務完成后,Task Tracker銷毀Task Pre Scheduler線程,保存任務的執(zhí)行結(jié)果;
[0035]5) Task Tracker通過心跳信息通知Job Tracker,預調(diào)度流程結(jié)束。
[0036]主節(jié)點(Job Tracker)接收到子節(jié)點(Task Tracker)發(fā)出的心跳信息(心跳信息中包含子節(jié)點的負載等信息)后,對負載較輕的子節(jié)點,預先分配任務(其數(shù)量占總體任務的比例可由用戶自行配置,默認是5%),同時在當前尚未運行的任務集合中去掉該任務的信息,將其加入預分配任務列表。
[0037]子節(jié)點(Task Tracker)收到主節(jié)點返回的心跳信息(返回的心跳信息中包含著分配的任務指令)后,將其存入任務池,而后為每個預先分配的任務尋找合適的時機進行執(zhí)行并將結(jié)果返回主節(jié)點。如果在限定時間內(nèi)還未執(zhí)行,則該任務的預調(diào)度過程失敗,并通過心跳將結(jié)果返回主節(jié)點。
[0038]Job Tracker收到心跳后,如果是已完成預調(diào)度,則在預調(diào)度任務隊列中刪除該任務,否則重新尋找適合預調(diào)度的節(jié)點和任務。
[0039]本發(fā)明的有益效果是:
[0040]針對Hadoop原模型中心跳周期使得兩次心跳間資源無法及時利用的問題,通過提前給子節(jié)點分配任務,使得子節(jié)點在當前任務已經(jīng)運行完畢時,可以從預分配的任務池中獲取任務執(zhí)行,無需等待下一次心跳到來。這種方法不僅能夠提高系統(tǒng)的資源利用率,而且改進了系統(tǒng)的性能。
【專利附圖】
【附圖說明】
[0041]圖1是主節(jié)點Job Tracker的任務預分配流程圖;
[0042]圖2是預調(diào)度流程中,子節(jié)點(Task Tracker)端與主節(jié)點(Job Tracker)端相關的部件結(jié)構圖;
[0043]圖3是子節(jié)點Task Tracker接收預分配的任務后的處理流程圖;
【具體實施方式】
[0044]下面結(jié)合附圖對本發(fā)明作詳細描述。
[0045]基于預調(diào)度的任務分配策略,其具體實現(xiàn)步驟如下:
[0046]圖1給出了主節(jié)點(Job Tracker)端預調(diào)度的流程。
[0047](I)主節(jié)點(Job Tracker)啟動,開始主循環(huán)并啟動IPC Handler監(jiān)聽和處理子節(jié)點的心跳信息。
[0048]2) IPC Handler循環(huán)判斷是否有子節(jié)點發(fā)來心跳信息,若沒有則返回步驟I);
[0049]若有心跳信息到來則判斷該子節(jié)點之前是否執(zhí)行了預調(diào)度任務,若沒有執(zhí)行預調(diào)度任務則轉(zhuǎn)步驟3),若執(zhí)行了預調(diào)度任務則查看前次預調(diào)度任務是否成功,若失敗則記錄該任務失敗的子節(jié)點編號,成功則從預調(diào)度任務隊列和待調(diào)度任務隊列刪除該任務;
[0050]3)判斷該子節(jié)點的負載是否較輕,若該子節(jié)點負載較輕(根據(jù)預先分配任務即其數(shù)量占總體任務的比例由用戶自行配置,默認是5%,同時在當前尚未運行的任務集合中去掉該任務的信息,將其加入預分配任務列表)則為其在待調(diào)度任務隊列中尋找符合下列條件的預調(diào)度任務,即當一個任務滿足:
[0051]①該任務處于可運行的狀態(tài);
[0052]②該任務未在此子節(jié)點上失敗過;
[0053]③該任務滿足數(shù)據(jù)本地性;
[0054]這兩個條件時,選中該任務并將其加入預調(diào)度任務列表,Job Tracker將預調(diào)度任務和其他待執(zhí)行任務一起加入心跳信息中,否則,按普通任務指令進行;
[0055]否則,返回步驟I);
[0056]4) Job Tracker將心跳信息返回子節(jié)點。
[0057]圖2給出了預調(diào)度流程中,子節(jié)點(Task Tracker)端與主節(jié)點(Job Tracker)端相關的部件結(jié)構。主要包括以下幾個部分:
[0058](I)主節(jié)點(Job Tracker)端相關的部件主要為IPC Handler,用于處理子節(jié)點的心跳請求和圖1中的任務預分配流程。
[0059](2)子節(jié)點(Task Tracker)端的主要部件為:
[0060]①Task Launcher:即任務執(zhí)行部件,其從待執(zhí)行任務隊列(Task Queue)中取出待執(zhí)行任務,放入相應的資源槽(slot)中執(zhí)行該任務。
[0061]②Task Pre Scheduler:即預調(diào)度線程,負責在滿足預調(diào)度的條件下,將預先存儲在預調(diào)度任務隊列(Task Pre Schedule Queue)中的任務取出,放入待執(zhí)行隊列,執(zhí)行預調(diào)度功能。
[0062]原子節(jié)點的任務啟動的模式是“生產(chǎn)者-消費者”模式。即子節(jié)點(Task Tracker)從主節(jié)點(Job Tracker)接收到心跳信號后,將其中的任務指令存入待執(zhí)行任務隊列(TaskQueue)并通知消費者(Task Launcher)。Task Launcher則按照時間順序依次執(zhí)行TaskQueue隊列中的任務。這里本發(fā)明所做的工作是類似增加了一個倉庫的功能,用以存儲少量備用任務,如果出現(xiàn)了 Task Queue隊列為空且此時離下一次心跳周期還有較長時間,系統(tǒng)中又有空閑資源的情況下,會啟動預調(diào)度線程Task Pre Scheduler,將先前預分配的任務放入Task Queue隊列并通知Task Launcher線程開始工作。
[0063]圖3給出了 Task Tracker端的預調(diào)度流程圖,描述如下:
[0064]I) Task Tracker啟動后開始主循環(huán),同時啟動任務的執(zhí)行線程Task Launcher ;
[0065]2)Task Tracker的主循環(huán)接收到主節(jié)點返回的心跳信息,該返回的心跳信息中包含著分配的任務指令,如果心跳信息中包含預調(diào)度指令則保存該預調(diào)度任務,啟動預調(diào)度線程Task Pre Scheduler,并對Task Pre Scheduler進行計時,如果超時,將預調(diào)度失敗結(jié)果存入心跳信息后執(zhí)行步驟5),否則繼續(xù)執(zhí)行步驟3);
[0066]3) Task Pre Scheduler會持續(xù)的判斷當前是否滿足如下條件:
[0067]①Task Launcher的待執(zhí)行任務池是否為空;
[0068]②此時距離下一次心跳開始的時間是否足夠長;
[0069]③當前是否有空閑資源;
[0070]如果條件均滿足則Task Pre Scheduler就會將先前保存的預調(diào)度任務加入TaskLauncher的待執(zhí)行任務池中并通知Task Launcher開始執(zhí)行;
[0071]否則返回Task Tracker主循環(huán);[0072]4)當該任務完成后,Task Tracker銷毀Task Pre Scheduler線程,保存任務的執(zhí)行結(jié)果;
[0073]5) Task Tracker通過心跳信息通知Job Tracker,預調(diào)度流程結(jié)束。
【權利要求】
1.一種基于預調(diào)度的任務分配方法,其特征包括以下步驟: 1)啟動主節(jié)點JobTracker,開始主循環(huán)并啟動IPC Handler監(jiān)聽和處理子節(jié)點的心跳息; 2)IPC Handler循環(huán)判斷是否有子節(jié)點發(fā)來心跳信息,若沒有則返回步驟I); 若有心跳信息到來則判斷該子節(jié)點之前是否執(zhí)行了預調(diào)度任務,若沒有執(zhí)行預調(diào)度任務則轉(zhuǎn)步驟3),若執(zhí)行了預調(diào)度任務則查看前次預調(diào)度任務是否成功,若失敗則記錄該失敗任務的子節(jié)點編號,成功則從預調(diào)度任務隊列和待調(diào)度任務隊列刪除已完成的任務; 3)判斷該子節(jié)點的負載是否較輕,若該子節(jié)點負載較輕,則為其在待調(diào)度任務隊列中尋找符合下列條件的預調(diào)度任務,即當一個任務滿足: ①該任務處于可運行的狀態(tài); ②該任務未在此子節(jié)點上失敗過; ③該任務滿足數(shù)據(jù)本地性; 這三個條件時,選中該任務并將其加入預調(diào)度任務列表,Job Tracker將預調(diào)度任務和其他待執(zhí)行任務一起加入心跳信息中,否則,按普通任務指令進行; 否則,返回步驟I); 4)Job Tracker將心跳信息返回子節(jié)點。
2.根據(jù)權利要求1所述的基 于預調(diào)度的任務分配方法,其特征在于:所述的判斷該子節(jié)點的負載是否較輕,是根據(jù)預先分配任務即其數(shù)量占總體任務的比例由用戶自行配置,默認是5%,同時在當前尚未運行的任務集合中去掉該任務的信息,將其加入預分配任務列表。
3.根據(jù)權利要求1所述的基于預調(diào)度的任務分配方法,其特征在于:所述的子節(jié)點(Task Tracker)端與主節(jié)點(Job Tracker)端相關的部件包括以下幾個部分: 1)主節(jié)點(JobTracker)端相關的部件為IPC Handler,用于處理子節(jié)點的心跳請求和任務預分配流程; 2)子節(jié)點(TaskTracker)端的部件為: ①TaskLauncher:即任務執(zhí)行部件,其從待執(zhí)行任務隊列(Task Queue)中取出待執(zhí)行任務,放入相應的資源槽(slot)中執(zhí)行該任務; ②TaskPre Scheduler:即預調(diào)度線程,負責在滿足預調(diào)度的條件下,將預先存儲在預調(diào)度任務隊列(Task Pre Schedule Queue)中的任務取出,放入待執(zhí)行隊列,執(zhí)行預調(diào)度。
4.根據(jù)權利要求3所述的基于預調(diào)度的任務分配方法,其特征在于:所述的子節(jié)點(Task Tracker)從主節(jié)點(Job Tracker)接收到心跳信號后,將其中的任務指令存入待執(zhí)行任務隊列(Task Queue)并通知消費者(Task Launcher), Task Launcher則按照時間順序依次執(zhí)行Task Queue隊列中的任務; 如果出現(xiàn)了 Task Queue隊列為空且此時離下一次心跳周期還有較長時間,系統(tǒng)中又有空閑資源的情況下,會啟動預調(diào)度線程Task Pre Scheduler,將先前預分配的任務放入Task Queue隊列并通知Task Launcher線程開始工作。
5.根據(jù)權利要求1所述的基于預調(diào)度的任務分配方法,其特征在于:所述的子節(jié)點Task Tracker接收預分配的任務后按下列步驟進行: I)Task Tracker啟動后開始主循環(huán),同時啟動任務的執(zhí)行線程Task Launcher ;2)TaskTracker的主循環(huán)接收到主節(jié)點返回的心跳信息,該返回的心跳信息中包含著分配的任務指令,如果心跳信息中包含預調(diào)度指令則保存該預調(diào)度任務,啟動預調(diào)度線程Task Pre Scheduler,并對Task Pre Scheduler進行計時,如果超時,將預調(diào)度失敗結(jié)果存入心跳信息后執(zhí)行步驟5),否則繼續(xù)執(zhí)行步驟3); 3)Task Pre Scheduler會持續(xù)的判斷當前是否滿足如下條件: ①TaskLauncher的待執(zhí)行任務池是否為空; ②此時距離下一次心跳開始的時間是否足夠長; ③當前是否有空閑資源; 如果條件均滿足則Task Pre Scheduler就會將先前保存的預調(diào)度任務加入TaskLauncher的待執(zhí)行任務池中并通知Task Launcher開始執(zhí)行; 否則返回Task Tracker主循環(huán); 4)當該任務完成后,TaskTracker銷毀Task Pre Scheduler線程,保存任務的執(zhí)行結(jié)果; 5)Task Tracker通過心跳信息通知Job Tracker,預調(diào)度流程結(jié)束。
【文檔編號】G06F9/46GK103500119SQ201310403754
【公開日】2014年1月8日 申請日期:2013年9月6日 優(yōu)先權日:2013年9月6日
【發(fā)明者】董小社, 劉強, 朱正東, 陳衡 申請人:西安交通大學