JobTracker節點後臺線程之CompleteJobStatusStore

       上一篇博文講了JobTracker節點會在內存中緩存一部分已完成Jobs狀態信息,其實JobTracker節點還可以持久化地保存這些已完成Jobs信息,即將每一個Job的狀態信息保存在一個單獨的文件中,這個文件可以屬於本地文件系統,也可以屬於分佈式文件系統,如:HDFS。所以,JobTracker節點設計了一個組件——CompleteJobStatusStore,來負責讀/寫和管理這些作業狀態文件。對於任何一個作業,無論它最後是成功完成,還是失敗,也不管它是否中途被JobTracke節點終止,JobTracker節點都會使用CompleteJobStatusStore來將這個已完成的Job狀態信息保存到一個單獨文件中。JobTracker節點之所以要持久化地保存這些Job的狀態信息,一是因爲這樣做可以爲用戶提供查詢Job的歷史狀態信息;二是因爲內存有限,不可能緩存所有的Job狀態信息。同時,出於系統資源的限制,JobTracker不可能永遠的持久化保存一個Job的狀態信息,以至於每一個已完成Job狀態信息的持久化保存有一個生命週期,即JobTracker節點會定時的檢測有哪些已完成Job持久化狀態信息過期了,對於過期的,它會清除它們對應的文件。而這個工作也是交由它的後臺線程CompleteJobStatusStore來完成的。

         這裏所說的Job的狀態信息主要包括:JobStatus、JobProfile、Counters、TaskCompletionEvent,這些信息在文件中的組織形式如下:


1.JobStatus(作業的基本狀態信息)

private JobID jobid;//作業ID
private float mapProgress;//map任務的最後執行進度
private float reduceProgress;//reduce任務的最後執行進度
private float cleanupProgress;//cleanup任務的最後執行進度
private float setupProgress;//setup任務的最後執行進度
private int runState;//作業最後結束時的狀態
private long startTime;//作業的開始時間
private String user;//作業的提交者
private JobPriority priority;//作業調度的優先級
private String schedulingInfo="NA";//作業的調度信息

2.JobProfile(作業的基本配置信息)

String user;//提交作業的用戶名
final JobID jobid;//作業的ID
String jobFile;//作業的配置文件job.xml的路徑
String url;//作業詳細信息的http地址
String name;//用戶定義的作業名
String queueName;//作業所屬的隊列

3.Counters(作業的過程統計器)


4.TaskCompletionEvents(作業的任務完成事件)

private int eventId; //事件Id
private String taskTrackerHttp;//運行該任務的TaskTracker節點的http服務地址
private int taskRunTime; // 任務運行時間
private TaskAttemptID taskId;//任務實例Id
Status status; //任務結束狀態
boolean isMap = false;//任務類型
private int idWithinJob;//任務在作業內部的Id


      前面說過CompleteJobStatusStore不僅負責Job狀態信息的讀/寫,還負責對這些文件進行管理,這個管理主要集中在每隔SLEEP_TIME ms就開始檢查一次,對於持久化保存時間超過retainTimeh已完成Job狀態信息保存文件要立即刪除,這裏的SLEEP_TIME值爲24*60*60*1000,而retainTime的值可以通過配置文件來設置,對應的配置項爲:mapred.job.tracker.persist.jobstatus.hours。另外,還有一個問題就是這些文件應該統一存放在那個目錄下呢?關於這個存儲目錄,默認的是/jobtracker/JobsInfo目錄,不過也可通過配置文件來設置,對應的配置項爲:mapred.job.tracker.persist.jobstatus.dir

       CompleteJobStatusStore是否真的持久化地保存一個Job的狀態信息,主要取決於它的兩個參數retainTimeactive,也就是隻有當retainTime>0 && active=true 時纔會保存這裏的active起到了對進行開關的作用,是否開啓CompleteJobStatusStore服務可以通過配置參數mapred.job.tracker.persist.jobstatus.active來設置,但默認是關閉的。

        貼出這個循環檢測的源代碼:

 public void run() {
    if (retainTime > 0) {
      while (true) {
        deleteJobStatusDirs();
        try {
          Thread.sleep(SLEEP_TIME);
        }
        catch (InterruptedException ex) {
          break;
        }
      }
    }
  }

  private void deleteJobStatusDirs() {
    try {
      long currentTime = System.currentTimeMillis();
      FileStatus[] jobInfoFiles = fs.listStatus(new Path[]{new Path(jobInfoDir)});

      //noinspection ForLoopReplaceableByForEach
      for (FileStatus jobInfo : jobInfoFiles) {
        try {
          if ((currentTime - jobInfo.getModificationTime()) > retainTime) {
            fs.delete(jobInfo.getPath(), true);
          }
        }
        catch (IOException ie) {
          LOG.warn("Could not do housekeeping for [ " + jobInfo.getPath() + "] job info : " + ie.getMessage(), ie);
        }
      }
    }
    catch (IOException ie) {
      LOG.warn("Could not obtain job info files : " + ie.getMessage(), ie);
    }
  }



發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章