MapReduce任務提交源碼分析

  爲了測試MapReduce提交的詳細流程。須要在提交這一步打上斷點:測試

 

 

   F7進入方法:spa

 

 

   進入submit方法:3d

 

 

   注意這個connect方法,它在鏈接誰呢?咱們知道,Driver是做爲客戶端存在的,那麼客戶端鏈接的應該就是Yarn集羣,可是在這個簡單的WordCount案例中,並無將任務提交到Yarn集羣,而是在本機中執行的。座椅這裏鏈接的天然就是本機。xml

  進入這個connect方法,而後在裏面的Cluster方法上打上斷點:對象

 

 

 

 

 

   很明顯,這是一個構造器,他把集羣抽象成了一個對象。進入此方法:blog

 

 

   初始化了一個客戶端協議,進入這個create方法,看看他是如何初始化客戶端協議的:get

 

 

   注意這個mapreduce.framework.name,他就是mapred-site.xml文件中的mapreduce.framework.name項的值,因爲我並無提交到集羣上,而是在本機,因此他會加載本機的mapred-site.xml文件,可是我本機下的該文件並無像集羣上那樣配置了mapred-site.xml文件,只有一份mapred-site.xml.template文件,更沒有mapreduce.framework.name這一項,因此上面代碼中的值就默認爲local了。it

  本機上的配置:集羣

 

 

   集羣上的配置:配置

 

 

 

  create方法最終反回了一個LocalJobRunner對象,若是上面的值是yarn,返回的則是YarnJobRunner。繼續往下:

 

 

   會發現這個LocalJobRunner就是客戶端。而後一直往下,直到完成connect方法,會發現整個過程當中在connect方法中建立了一個Cluster對象,而後在Cluster對象裏面獲取到了客戶端。

  緊接着,因爲connect方法初始化了cluster對象,因此接下來建立了submitter對象,用於提交任務。進入submitJobInternal方法打上斷點

 

 

 

 

  這個checkSpecs方法就是用來檢查路徑的,當輸入路徑不存在或輸出路徑已存在時會報錯。進入此方法後再進入內部方法就一目瞭然了:

 

 

 

 

 

   繼續往下執行,完成checkSpecs方法後完初始化一個路徑:

 

 

   打開此路徑,此時仍是空的文件夾:

 

 

 

 

  繼續往下,隨後作了一些獲取IP和往配置文件中設置IP和hostname的操做:

 

 

   繼續往下,隨後又在上面的路徑下隨機建立了一個目錄:

 

 

   繼續往下,見到copyAndConfigureFiles時,進入此方法,而後在進入內部方法uploadFiles():

 

 

   在uploadFiles方法中有,執行後的效果:

 

 

 

 

 

   這個文件夾暫時不知道幹嗎的,只知道copyAndConfigureFiles方法建立了這個路徑。此方法執行完後,執行到writeSplits進入此方法:

 

 

 這個方法是重點:切片是怎麼切的呢?

 

 

 maps是int型,這表示這啓動的maptask的數量也該和切片的數量保持一致。而具體切成多少片呢?

上面的方法多態調用到子類的方法writeNewSplits,而後調用getSplits方法:

 

 

 

getSplits方法中有這樣一段:

 

 也就是說:當剩餘長度比切片尺寸大於1.1時,就會產生新的切片,好比說文件65m,splitSize爲32m,第一片切到32m,剩餘33m,因爲33/32<1.1,因此就再也不切片,65m被切成兩片,0~3二、32~65,而不是0~32 、 32~64 、 64~65三片。

   當執行完writeSplits方法後,會在上面建立的目錄下生成幾個文件:

 

 

 上面生成的文件中保存了「切片的規劃信息」。繼續往下,當執行到writeConf方法後,會繼續在上面的目錄下生成與此Job相關的配置文件:

 

 

 

 

 

   繼續執行,當執行完submitJob方法後,job自己(即WordCount程序自己會被打成jar包被提交)就被提交了:

  可是因爲我是直接在本地執行的,直接從main方法進來執行的,不必再打成jar包再從main方法進入,因此並不用提交,可是若是是是在yarn 上執行的時候,會把程序打成jar包放在上面的目錄下。

 

 

   當任務執行完畢後,上面的目錄會被清空:

 

 

   至此,整個任務的提交執行完成,試想一下,若是這個任務在Yarn上執行是什麼樣子呢?期待嗎邏輯不會變:

  首先,仍是執行connect方法,初始化到Cluster對象,而後建立JobRunner,不過在Yarn上執行的JobRunner就不是LocalJobRunner了,而是YarnJobRunner。執行完connect方法後會在HDFS文件系統建立一個路徑,其做用與上面建立的路徑相同,用於保存切片方案信息和配置文件信息,同時會將任務自己的jar包放入其中,最後任務執行完,這些內容又將被銷燬。

相關文章
相關標籤/搜索