《Hadoop-MapReduce源碼解析》之一: org.apache.hadoop.mapreduce.Job#waitForCompletion

  • Hadoop版本:2.10.2

1. org.apache.hadoop.mapreduce.Job#waitForCompletion

  /**
   * Submit the job to the cluster and wait for it to finish.
   * @param verbose print the progress to the user
   * @return true if the job succeeded
   * @throws IOException thrown if the communication with the 
   *         <code>JobTracker</code> is lost
   */
  public boolean waitForCompletion(boolean verbose
                                   ) throws IOException, InterruptedException,
                                            ClassNotFoundException {
    if (state == JobState.DEFINE) {
      // 如果Job.state是DEFINE星澳,就可以提交任務(wù)债朵。
      submit();  // 參見(jiàn):2. org.apache.hadoop.mapreduce.Job#submit
    }
    if (verbose) {
      // 在進(jìn)度和任務(wù)失敗時(shí)實(shí)時(shí)監(jiān)控作業(yè)和打印狀態(tài)。
      monitorAndPrintJob();
    } else {
      // get the completion poll interval from the client.
      // 獲取waitForCompletion() 應(yīng)檢查的時(shí)間間隔勺拣。
      int completionPollIntervalMillis = 
        Job.getCompletionPollInterval(cluster.getConf());
      while (!isComplete()) {
        try {
          // 任務(wù)未完成略就,則睡眠一會(huì)般卑。
          Thread.sleep(completionPollIntervalMillis);
        } catch (InterruptedException ie) {
        }
      }
    }
    // 檢查作業(yè)是否成功完成酿秸。
    return isSuccessful();
  }

2. org.apache.hadoop.mapreduce.Job#submit

  /**
   * Submit the job to the cluster and return immediately.
   * @throws IOException
   */
  public void submit() 
         throws IOException, InterruptedException, ClassNotFoundException {
    // 提交之前,確定Job.state是不是DEFINE嵌言,如果不是則拋出異常嗅回。
    // 因?yàn)?lt;設(shè)置參數(shù)>方法只能在作業(yè)提交之前起作用,之后它們將拋出IllegalStateException
    ensureState(JobState.DEFINE);
    // 默認(rèn)為新API摧茴,除非它們被顯式設(shè)置绵载,或者使用了舊的mapper或reduce屬性。
    // 做一些兼容性檢查苛白,避免沖突娃豹。
    // 新API:org.apache.hadoop.mapreduce及其子包
    // 老API:org.apache.hadoop.mapred及其子包
    setUseNewAPI();
    // 初始化org.apache.hadoop.mapreduce.Cluster對(duì)象,用于鏈接/訪問(wèn)map/reduce群集信息购裙。
    connect();
    // 初始化org.apache.hadoop.mapreduce.JobSubmitter對(duì)象懂版。
    // 本質(zhì)就是:new JobSubmitter(FileSystem submitFs, ClientProtocol submitClient)。
    // FileSystem :本地文件系統(tǒng)或者分布式文件系統(tǒng)
    // ClientProtocol :是JobClient和中央JobTracker用于通信的協(xié)議躏率。
    // JobClient可以使用這些方法提交作業(yè)以供執(zhí)行定续,并了解當(dāng)前系統(tǒng)狀態(tài)。
    final JobSubmitter submitter = 
        getJobSubmitter(cluster.getFileSystem(), cluster.getClient());
    // 包含用于向系統(tǒng)提交作業(yè)時(shí)的一些操作禾锤,并返回其最新的Job資料信息。
    // 參數(shù):job->要提交的配置摹察;cluster->cluster的句柄(用于鏈接/訪問(wèn)map/reduce群集信息)
    status = ugi.doAs(new PrivilegedExceptionAction<JobStatus>() {
      public JobStatus run() throws IOException, InterruptedException, 
      ClassNotFoundException {
        // 參見(jiàn):《MapReduce源碼解析》之二
        return submitter.submitJobInternal(Job.this, cluster);
      }
    });
    // 更改Job.state為RUNNING恩掷,此時(shí)不能再修改任何配置信息。
    state = JobState.RUNNING;
    LOG.info("The url to track the job: " + getTrackingURL());
   }

3. org.apache.hadoop.mapreduce.JobStatus

常用屬性:
  /**
   * Current state of the job 
   */
  public static enum State {
    RUNNING(1),
    SUCCEEDED(2),
    FAILED(3),
    PREP(4),
    KILLED(5);
  };
  
  // JobID表示作業(yè)的不可變且唯一的標(biāo)識(shí)符供嚎。
  // JobID由兩部分組成黄娘。
  // 第一部分表示jobtracker標(biāo)識(shí)符,以便定義jobID到j(luò)obtracker的映射克滴。
  // 對(duì)于集群設(shè)置逼争,此字符串是jobtracker的開(kāi)始時(shí)間,對(duì)于本地設(shè)置劝赔,它是“l(fā)ocal”和一個(gè)隨機(jī)數(shù)誓焦。
  // 第二部分是作業(yè)編號(hào)。
  // 示例JobID:job_200707121733_0003着帽,
  // 它表示在始于200707121733的jobtracker上運(yùn)行的第三個(gè)作業(yè)杂伟。
  private JobID jobid;
  // map進(jìn)度
  private float mapProgress;
  // reduce進(jìn)度
  private float reduceProgress;
  // 清理進(jìn)度
  private float cleanupProgress;
  // 配置進(jìn)度
  private float setupProgress;
  // Job的當(dāng)前狀態(tài)
  private State runState;
  // Job的開(kāi)始時(shí)間
  private long startTime;
  // 提交這個(gè)Job的人的userid
  private String user;
  // 隊(duì)列名稱(chēng)(任務(wù)所屬隊(duì)列移层,隊(duì)列指明了任務(wù)的優(yōu)先級(jí))
  private String queue;
  // Job任務(wù)的優(yōu)先級(jí)(VERY_HIGH,HIGH,NORMAL,LOW,VERY_LOW,DEFAULT,UNDEFINED_PRIORITY;)
  private JobPriority priority;
  // Job的計(jì)劃信息
  private String schedulingInfo="NA";
  // Job的失敗信息
  private String failureInfo = "NA";

  // Job的權(quán)限控制信息,有2個(gè)內(nèi)置的枚舉對(duì)象:
  // org.apache.hadoop.mapreduce.JobACL#VIEW_JOB
  // org.apache.hadoop.mapreduce.JobACL#MODIFY_JOB
  private Map<JobACL, AccessControlList> jobACLs =
      new HashMap<JobACL, AccessControlList>();

  // Job名稱(chēng)
  private String jobName;
  // Job配置文件
  private String jobFile;
  // Job的完成時(shí)間
  private long finishTime;
  // 用于檢查作業(yè)狀態(tài)是否已經(jīng)被標(biāo)記為“retired”赫粥。
  // 在Hadoop中观话,當(dāng)作業(yè)完成或失敗時(shí),它可能會(huì)被標(biāo)記為“retired”越平,這意味著它不再是運(yùn)行作業(yè)列表中的活動(dòng)作業(yè)频蛔。
  private boolean isRetired;
  // 已完成作業(yè)的歷史文件。若作業(yè)未完成或歷史文件不可用秦叛,則為null晦溪。
  private String historyFile = "";
  // 鏈接到web用戶界面的url
  private String trackingUrl ="";
  // 已使用slot數(shù)量
  //  slot不是CPU的Core,也不是memory chip书闸,它是一個(gè)邏輯概念.
  // 一個(gè)節(jié)點(diǎn)的slot的數(shù)量用來(lái)表示某個(gè)節(jié)點(diǎn)的資源的容量或者說(shuō)是能力的大小尼变,因而slot是Hadoop的資源單位。
  private int numUsedSlots;
  // 剩余slot數(shù)量
  private int numReservedSlots;
  // 已使用內(nèi)存
  private int usedMem;
  // 保留內(nèi)存
  private int reservedMem;
  // 所需內(nèi)存
  private int neededMem;
  // Job是否運(yùn)行在Uber模式中
  // uber模式是 `2.x` 開(kāi)始引入的浆劲;
  // 以 `Uber` 模式運(yùn)行 MR 作業(yè)嫌术,所有的 `Map Tasks` 和 `Reduce Tasks` 將會(huì)在 `ApplicationMaster` 所在的容器(`container`)中運(yùn)行;
  // 即:整個(gè) MR 作業(yè)運(yùn)行的過(guò)程 只會(huì) 啟動(dòng) `AM container`牌借,所有子task 與 ApplicationMaster 在同一個(gè)JVM中執(zhí)行度气,達(dá)到JVM重用的目的;
  // 因?yàn)椴恍枰獑?dòng) `mapper containers` 和 `reducer containers`膨报,所以 AM 不需要 和遠(yuǎn)程 containers 通信磷籍,整個(gè)過(guò)程簡(jiǎn)單,執(zhí)行速度快现柠;
  // 如果 MR 作業(yè) 輸入的數(shù)據(jù)量 非常小院领,啟動(dòng) `Map container` 或 `Reduce container` 的時(shí)間都 比處理數(shù)據(jù)要長(zhǎng),那么這個(gè)作業(yè)就可以考慮啟用 `Uber` 模式運(yùn)行够吩;
  // 一般情況下比然,對(duì)小作業(yè)啟用 Uber 模式運(yùn)行會(huì)得到 `2-3`倍 的性能提升。
  private boolean isUber;

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末周循,一起剝皮案震驚了整個(gè)濱河市强法,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌湾笛,老刑警劉巖饮怯,帶你破解...
    沈念sama閱讀 212,454評(píng)論 6 493
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場(chǎng)離奇詭異嚎研,居然都是意外死亡蓖墅,警方通過(guò)查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,553評(píng)論 3 385
  • 文/潘曉璐 我一進(jìn)店門(mén),熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)置媳,“玉大人于樟,你說(shuō)我怎么就攤上這事∧茨遥” “怎么了迂曲?”我有些...
    開(kāi)封第一講書(shū)人閱讀 157,921評(píng)論 0 348
  • 文/不壞的土叔 我叫張陵,是天一觀的道長(zhǎng)寥袭。 經(jīng)常有香客問(wèn)我路捧,道長(zhǎng),這世上最難降的妖魔是什么传黄? 我笑而不...
    開(kāi)封第一講書(shū)人閱讀 56,648評(píng)論 1 284
  • 正文 為了忘掉前任杰扫,我火速辦了婚禮,結(jié)果婚禮上膘掰,老公的妹妹穿的比我還像新娘章姓。我一直安慰自己,他們只是感情好识埋,可當(dāng)我...
    茶點(diǎn)故事閱讀 65,770評(píng)論 6 386
  • 文/花漫 我一把揭開(kāi)白布凡伊。 她就那樣靜靜地躺著,像睡著了一般窒舟。 火紅的嫁衣襯著肌膚如雪系忙。 梳的紋絲不亂的頭發(fā)上,一...
    開(kāi)封第一講書(shū)人閱讀 49,950評(píng)論 1 291
  • 那天惠豺,我揣著相機(jī)與錄音银还,去河邊找鬼。 笑死洁墙,一個(gè)胖子當(dāng)著我的面吹牛蛹疯,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播热监,決...
    沈念sama閱讀 39,090評(píng)論 3 410
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼捺弦,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼!你這毒婦竟也來(lái)了狼纬?” 一聲冷哼從身側(cè)響起,我...
    開(kāi)封第一講書(shū)人閱讀 37,817評(píng)論 0 268
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤骂际,失蹤者是張志新(化名)和其女友劉穎疗琉,沒(méi)想到半個(gè)月后,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體歉铝,經(jīng)...
    沈念sama閱讀 44,275評(píng)論 1 303
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡盈简,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,592評(píng)論 2 327
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片柠贤。...
    茶點(diǎn)故事閱讀 38,724評(píng)論 1 341
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡香浩,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出臼勉,到底是詐尸還是另有隱情邻吭,我是刑警寧澤,帶...
    沈念sama閱讀 34,409評(píng)論 4 333
  • 正文 年R本政府宣布宴霸,位于F島的核電站囱晴,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏瓢谢。R本人自食惡果不足惜畸写,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 40,052評(píng)論 3 316
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望氓扛。 院中可真熱鬧枯芬,春花似錦、人聲如沸采郎。這莊子的主人今日做“春日...
    開(kāi)封第一講書(shū)人閱讀 30,815評(píng)論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)尉剩。三九已至真慢,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間理茎,已是汗流浹背黑界。 一陣腳步聲響...
    開(kāi)封第一講書(shū)人閱讀 32,043評(píng)論 1 266
  • 我被黑心中介騙來(lái)泰國(guó)打工, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留皂林,地道東北人朗鸠。 一個(gè)月前我還...
    沈念sama閱讀 46,503評(píng)論 2 361
  • 正文 我出身青樓,卻偏偏與公主長(zhǎng)得像础倍,于是被迫代替她去往敵國(guó)和親烛占。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 43,627評(píng)論 2 350

推薦閱讀更多精彩內(nèi)容