恐怕我不理解Map-Reduce工作的时间结果。例如,我正在运行的作业从作业跟踪器中获得以下结果。
完成:1分钟,39秒
花费的CPU时间(毫秒)150,460 152,030 302,490
CPU花费的时间(ms)中的条目分别用于Map,Reduce和Total。但是,那么如何测量“CPU花费的时间”以及它意味着什么?这是分配给该工作的每个映射器和减速器所花费的总累计时间吗?是否有可能从框架中测量其他时间,例如洗牌,排序,分区等时间?如果是这样,怎么样?
困扰我的第二个问题。我在这里看到了一些帖子(Link1,Link2),建议在驱动程序类中使用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时间,计算每个节点/每个阶段的时间时?
答案 0 :(得分:14)
地图阶段包括:记录阅读器,地图,组合器和分区器。
reduce阶段包括:shuffle,sort,reduce,output。
您看到的CPU时间是整个地图阶段和整个缩减阶段......而不仅仅是函数本身。这是一种令人困惑的术语,因为你有map函数和reduce函数,它们只是map phase 和reduce phase 的一部分。这是群集中所有节点的总CPU时间。
CPU时间与实时非常不同。 CPU时间是指花在CPU上的时间,而实时是您和我作为人类所经历的。想一想:假设您在相同的数据上运行相同的作业,但是在一个20节点集群上运行,然后是200节点集群。总的来说,两个集群将使用相同数量的CPU时间,但200节点集群的实时运行速度将提高10倍。当您的共享系统同时在其上运行大量作业时,CPU时间是一个有用的指标。
我不知道你会如何深入挖掘每个阶段的CPU时间。使用日期计时器可能不是你想要的。