我正在编写Hadoop调度程序。我的日程安排需要查找每个Map/Reduce任务占用的CPU时间。
我知道:
-
TaskInProgress类维护execStartTime和execFinishTime值,这两个值是进程开始和结束时的墙上时钟时间,但它们不能准确指示任务消耗的CPU时间。
-
每个任务都在一个新的JVM中执行,我可以使用OperatingSystemMXBean.getProcessCpuTime()方法,但方法的描述告诉我:"返回Java虚拟机运行的进程使用的CPU时间(以纳秒为单位)"。我不完全清楚这是否是我想要的。
我使用的库记录资源指标,如CPU使用率/IIDLE时间、交换使用率和内存使用率。
http://code.google.com/p/hadoop-toolkit/
您必须提取一个补丁并将其应用于20.2标记版本。
I am not entirely clear if this is what I want.
我确信这个方法也会返回挂钟的时间。
为了子孙后代,我在572 行对src/mapred.org/apache/hadop/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/*
从而使脚本工作。