我正在编写Hadoop调度程序。我的调度需要查找每个Map / Reduce任务所花费的CPU时间。
我知道:
TaskInProgress类维护execStartTime和execFinishTime值,这些值是进程启动和结束时的挂钟时间,但它们并不能准确指示任务消耗的CPU时间。
每个任务都在新的JVM中执行,我可以使用OperatingSystemMXBean。getProcessCpuTime()方法,但是方法的描述再次告诉我:“返回进程使用的CPU时间Java虚拟机以纳秒为单位运行“。如果这就是我想要的,我不完全清楚。
答案 0 :(得分:0)
我正在使用一个库来记录资源指标,如CPU使用率/ IDLE时间,交换使用情况和内存使用情况。
http://code.google.com/p/hadoop-toolkit/
您必须提取补丁并将其应用于20.2标记版本。
I am not entirely clear if this is what I want.
我很确定此方法也会返回挂钟时间。
答案 1 :(得分:0)
为了后人,我通过在第572行更改了src / mapred / org / apache / hadoop / mapred / TaskLog.java(Hadoop 0.20.203)来解决了这个问题
mergedCmd.append("exec setsid 'time' "); // add 'time'
CPU时间将写入:logs / userlogs / JOBID / TASKID / stderr。我还写了一个脚本来获得累积的CPU时间:https://gist.github.com/1984365 在运行作业之前,您需要确保执行以下操作:
rm -rf logs/userlogs/*
以便脚本有效。