gpt4 book ai didi

hadoop - Hadoop 中 map、shuffle、merge 和 reduce 时间的精确定义

转载 作者:可可西里 更新时间:2023-11-01 14:45:28 26 4
gpt4 key购买 nike

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

  • map 时间
  • 减少时间
  • 洗牌时间
  • 合并时间

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

  • map 时间是读取输入和应用 map 功能以及排序数据
  • 的时间
  • reduce 时间是应用reduce 函数并编写输出
  • 的时间
  • Shuffle time 是merge map 排序数据传输到reducer 的时间
  • 合并时间是 仅在 reduce 端合并 map 输出的时间

我不确定粗体部分。我的分析正确吗?

最佳答案

我决定研究 Hadoop 代码以获得更多见解。下图解释了我的发现。 Map reduce overview

我发现:

  • map 时间是 map task 所花费的时间。 Map任务负责读取输入、应用map函数、排序数据和合并数据。
  • Shuffle time 是将 map 输出数据复制到 reduce 任务的时间,这是 reduce 任务的一部分。
  • 合并时间是在 reduce 端合并 map 输出的时间,这是 reduce 任务的一部分。
  • 减少时间是应用减少功能并写入输出的时间。

这些发现得到以下代码的支持:

Shuffle类,由 ReduceTask 使用,我们看到“复制”阶段之后是“排序”阶段。

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 class我们看到shuffle时间对应的是copy,merge时间就是我们上面说的“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());
}
}

更多关于 reduce 和 map 任务如何工作的信息可能来自类 MapTaskReduceTask , 分别。

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

关于hadoop - Hadoop 中 map、shuffle、merge 和 reduce 时间的精确定义,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34175386/

26 4 0
文章推荐: c++ - 传递额外的 wParam/lParam 参数?
文章推荐: javascript - 如何检测子页面中打开的打印预览模式?
文章推荐: c++ - 将 UTF-8 格式的文件转换为 UTF-16
文章推荐: javascript - 单击按钮修改
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com