7

恐怕我不明白 Map-Reduce 作业的计时结果。例如,我正在运行的作业从作业跟踪器中为我提供了以下结果。

完成时间:1 分 39 秒

花费的 CPU 时间(毫秒) 150,460 152,030 302,490

CPU 时间 (ms) 中的条目分别用于 Map、Reduce 和 Total。但是,那么如何衡量“花费的 CPU 时间”以及它意味着什么?这是分配给作业的每个映射器和缩减器所花费的总累积时间吗?是否可以从框架中测量其他时间,例如随机播放、排序、分区等时间?如果是这样,怎么做?

困扰我的第二个问题。我在这里看到了一些帖子(Link1Link2),建议在驱动程序类中使用 getTime() :

long start = new Date().getTime();
boolean status = job.waitForCompletion(true);
long end = new Date().getTime();
System.out.println("Job took "+(end-start) + "milliseconds");

这不是在做 Job Tracker 输出中的第一个条目提供的内容吗?这是必要的吗?为 hadoop 作业计时的最佳方法是什么,尤其是当我想计时 IO 时间、计算每个节点/每个阶段的时间时?

4

1 回答 1

16

映射阶段包括:记录读取器、映射、组合器和分区器。

reduce阶段包括:shuffle、sort、reduce、output。

您看到的 CPU 时间是整个 map 阶段和整个 reduce 阶段......不仅仅是函数本身。这是一种令人困惑的术语,因为您拥有 map 函数和 reduce 函数,它们只是 map阶段和 reduce阶段的一部分。这是集群中所有节点的总 CPU 时间。

CPU时间与实时有很大不同。CPU时间是在CPU上花费的时间,而实时是你我作为人类所经历的。想一想:假设您有相同的作业在相同的数据上运行,但在一个 20 节点集群上,然后是 200 节点集群。总体而言,两个集群将使用相同数量的 CPU 时间,但 200 节点集群的实时运行速度将提高 10 倍。当您有一个共享系统同时在其上运行大量作业时,CPU 时间是一个有用的指标。

我不知道您将如何深入研究以获取每个阶段的 CPU 时间。不过,使用日期计时器可能不是您想要的。

于 2012-07-31T06:25:42.597 回答