hadoop 如何做到map任務本地化

Hadoop繼承了Google的MapReduce的特性,具有map任務最大化本地化的能力,下面具體說下它是如何做到的。

在hadoop中,有很多taskScheduler,這裏以默認的JobQueueTaskScheduler爲例來說明。下面是assignTask的源代碼

 

這裏不想分析JobQueueTaskScheduler是具體如何工作的,主要想說的是它如何做到本地化。

它首先設置了一些和集羣有關的常量,然後獲取jobQueue。jobQueueJobInProgressListener是它對JobTracker註冊的jobInProgressListener。然後獲取還需要加載的map和reduce任務的數量。保存在int remainingReduceLoad 和

    int remainingMapLoad 中。 然後計算mapLoadFactor 和 reduceLoadFactor。以及是否要擴充slot等等。

。。。

從    int numLocalMaps = 0;

    int numNonLocalMaps = 0;

下面以後是真正分配任務的代碼段了,我們來看看

 

接着看到這

看到註釋,就會發現這裏試圖分配一個本地或者距離較近的一個MapTask

,於是我們找到了突破口,看看這個obtainNewLocalMapTask方法。不過在看之前,先看看getNumberOfUniqueHosts方法。這個方法很簡單,返回向jobtracker請求UniqueHosts的size,我們暫且不去care它,接着走進obtainNewLocalMapTask看看他具體的實現方法。

 

我們發現最重要的是這句

 int target = findNewMapTask(tts, clusterSize, numUniqueHosts, maxLevel, 

                                status.mapProgress());

它是來尋找target的,所以需要深入看看這個函數的實現。這個方法非常的長,因爲它是尋找map task的核心,需要耐心的研讀。

 

findNewMapTask有一個taskTrackerstatus的變量,這個變量是幹嘛的呢?

其實,assginTask是tasktracker每過10秒(默認)向jobtracker發送一次心跳,在這個過程中,他需要將它的狀態傳遞給jobtracker, 這個變量就是jobtracker需要知道的。好了,下面看看這個方法的具體實現。

獲取tip檢查是否可以跑或者高效的跑,否則返回-1。然後它會從最近的level中尋找task,一般順序爲local -> rack-local -> off-switch ->speculative,閱讀之後會發現 map任務的獲取是和提交任務時的Node相關的。因此,下面還需要閱讀提交作業的相關代碼。

至此,本地化過程的難點轉移到了提交任務那面了。

下面介於篇幅關係,我就不貼代碼了,直接口述。

在提交作業的時候,會建立一個新的JobInProgress,這段很容易找到不再多說,然後調度器會有一個線程去調用JobInProgress的initTasks方法,這個方法會去調用readSplitFile,這個SplitFile是怎麼生成的等到下篇在說。總之是一個分割任務的文件,然後會建立RawSplits數組調用crerateCache方法來建立nonRunningMapCache,首先將Splits[i].getlocations爲0的加入到nonLocationMaps。然後建立新的Node。它需要調用jobTracker的resolveAndAddToTopology方法,此方法調用dnsToSwitchMapping.resolve方法。dnsTo..由jobTrakcer在初始化的時候由反響映射建立了ScriptBasedMapping ,他的resolve方法首先會調用runResolveCommand方法,這個方法負責運行一個腳本,是從"topology.script.file.name"屬性中得到的。這個腳本用來返回一個IP地址對應的機架信息,這個完全由用戶自己手寫,所以一般這個機架感知功能是默認不用的。然後用返回信息的第一個參數作爲參數,傳入NodeBase.normalize。這裏沒腳本的話,返回的是NetworkTopology.DEFAULT_RACK,最後調用addHostToNodeMapping添加host,node到hostnameToNodeMap,再返回到createCache方法,它得到了機架信息以後,遞歸的將TaskInProgress添加到node中,到此,map tasks就初始化完成了,然後jobtrakcer.initJob將建立cleanip和setup的map和reduce任務的TIP,然後返回。

 

後面的敘述不知道大家能否看懂,總結一下就是在作業初始化的時候,文件信息和位置信息已經記錄下來,在調度作業的時候,直接給tasktracker最近的分片就行了,有什麼不懂的還是看代碼吧,其實上面把過程說的很詳細了。

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

發佈了24 篇原創文章 · 獲贊 2 · 訪問量 9萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章