Hadoop

时间:2015-12-09 09:41:07

标签: hadoop

在Hadoop中,作业执行后会提供以下指标:

  • 地图时间
  • 减少时间
  • 随机播放时间
  • 合并时间

我无法找到这些时间的确切定义,因为所有来源都不清楚如何准确计算这些时间。这就是我的看法:

  • 地图时间是阅读输入并应用地图功能和对数据进行排序
  • 的时间
  • 缩短时间是应用缩减功能并写入输出
  • 的时间
  • 随机时间是合并地图排序数据转移到reducer的时间
  • 合并时间是仅在缩小方面合并地图输出的时间

我不确定大胆的事情。我的分析是否正确?

1 个答案:

答案 0 :(得分:4)

我决定调查Hadoop代码以获得更多洞察力。下图解释了我的发现。 Map reduce overview

我发现:

  • 地图时间是地图任务所用的时间。 Map任务负责读取输入,应用map函数,排序数据和合并数据。
  • 随机播放时间是将地图输出数据复制到reduce任务的时间,这是reduce任务的一部分。
  • 合并时间是在缩小方面合并地图输出的时间,这是减少任务的一部分。
  • 缩短时间是应用reduce函数并写入输出的时间。

以下代码代码支持以下代码:

Shuffle使用的ReduceTask类中,我们看到" copy"阶段之后是"排序"相。

copyPhase.complete(); // copy is already complete
taskStatus.setPhase(TaskStatus.Phase.SORT);
reduceTask.statusUpdate(umbilical);

// Finish the on-going merges...
RawKeyValueIterator kvIter = null;
try {
  kvIter = merger.close();
} catch (Throwable e) {
  throw new ShuffleError("Error while doing final merge " , e);
}

TaskStatus课程中,我们看到shuffletime是排序阶段之前的时间,排序时间是shuffle和reduce阶段之间的时间。

public void setPhase(Phase phase){
  TaskStatus.Phase oldPhase = getPhase();
  if (oldPhase != phase){
    // sort phase started
    if (phase == TaskStatus.Phase.SORT){
      if (oldPhase == TaskStatus.Phase.MAP) {
        setMapFinishTime(System.currentTimeMillis());
      }
      else {
        setShuffleFinishTime(System.currentTimeMillis());
      }
    }else if (phase == TaskStatus.Phase.REDUCE){
      setSortFinishTime(System.currentTimeMillis());
    }
    this.phase = phase;
  }
  ...

JobInfo类中,我们看到shuffle time对应于复制,并且合并时间是" sort"我们上面提到的时间。

switch (task.getType()) {
    case MAP:
      successfulMapAttempts += successful;
      failedMapAttempts += failed;
      killedMapAttempts += killed;
      if (attempt.getState() == TaskAttemptState.SUCCEEDED) {
        numMaps++;
        avgMapTime += (attempt.getFinishTime() - attempt.getLaunchTime());
      }
      break;
    case REDUCE:
      successfulReduceAttempts += successful;
      failedReduceAttempts += failed;
      killedReduceAttempts += killed;
      if (attempt.getState() == TaskAttemptState.SUCCEEDED) {
        numReduces++;
        avgShuffleTime += (attempt.getShuffleFinishTime() - attempt
            .getLaunchTime());
        avgMergeTime += attempt.getSortFinishTime()
            - attempt.getShuffleFinishTime();
        avgReduceTime += (attempt.getFinishTime() - attempt
            .getSortFinishTime());
      }
}

有关如何分别从类MapTaskReduceTask派生缩减和地图任务的更多信息。

最后,我想指出,我在链接中引用的源代码大多对应于Hadoop 2.7.1代码。