在我的MapReduce程序的Reducer
中,我希望读取JobCounter
和FileSystemCounter
。运行命令mapred job -status <job id>
时,我需要的计数器按其显示名称列出:
...
File System Counters
FILE: Number of bytes read=148874
FILE: Number of bytes written=22010065
FILE: Number of read operations=0
FILE: Number of large read operations=0
FILE: Number of write operations=0
HDFS: Number of bytes read=135823
HDFS: Number of bytes written=44423504133
HDFS: Number of read operations=2185
HDFS: Number of large read operations=0
HDFS: Number of write operations=1316
Job Counters
Launched map tasks=1
Launched reduce tasks=200
Rack-local map tasks=1
Total time spent by all maps in occupied slots (ms)=5293
Total time spent by all reduces in occupied slots (ms)=972893
Total time spent by all map tasks (ms)=5293
Total time spent by all reduce tasks (ms)=972893
Total vcore-seconds taken by all map tasks=5293
Total vcore-seconds taken by all reduce tasks=972893
Total megabyte-seconds taken by all map tasks=5420032
Total megabyte-seconds taken by all reduce tasks=996242432
...
如何在运行时从
Reducer
的代码中访问这些计数器?使用Google,我找不到任何有关如何访问这些计数器的有用信息。使用Context.getCounter(String groupName, String counterName)的直接尝试无法检索
Counter
实例,因此在调用NullPointerException
时抛出getValue()
:long bytes = context.getCounter(
FileSystemCounter.class.getName(),
FileSystemCounter.BYTES_WRITTEN.name()
).getValue();
long milliseconds = context.getCounter(
JobCounter.class.getName(),
JobCounter.MILLIS_REDUCES.name()
).getValue();
最佳答案
Counters counters = job.getCounters();
for (CounterGroup group : counters) {
System.out.println("* Counter Group: " + group.getDisplayName() + " (" + group.getName() + ")");
System.out.println(" number of counters in this group: " + group.size());
for (Counter counter : group) {
System.out.println(" - " + counter.getDisplayName() + ": " + counter.getName() + ": "+counter.getValue());
}
}
我认为这将有助于打印所有计数器及其值。
关于java - 如何在Hadoop 2.6中访问JobCounters和FileSystemCounters?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29449006/