我正在编写Java应用程序以在Hadoop上运行MapReduce作业。我在mapper / reducer类中设置了一些局部变量,但是我无法将信息返回给主Java应用程序。例如,如果我在Mapper类中设置变量:
private static int nErrors = 0;
每次我从输入文件处理一行时,如果数据格式不正确,我会增加错误计数。最后,我为错误定义了一个get函数,并在我的工作完成后调用它:
public static int GetErrors()
{
return nErrors;
}
但是当我在最后打印出错误时:
System.out.println("Errors = " + UPMapper.GetErrors());
这总是会返回" 0"不管我做什么!如果我从nErrors = 12;
开始,则最终值为12
。是否可以从MapReduce函数中获取信息?
根据Binary Nerd
的建议,我实施了一些Hadoop计数器:
// Define this enumeration in your main class
public static enum MyStats
{
MAP_GOOD_RECORD,
MAP_BAD_RECORD
}
然后在mapper中:
if (SomeCheckOnTheInputLine())
{
// This record is good
context.getCounter(MyStats.MAP_GOOD_RECORD).increment(1);
}
else
{
// This record has failed in some way...
context.getCounter(MyStats.MAP_BAD_RECORD).increment(1);
}
然后在Hadoop的输出流中,我看到:
MAP_BAD_RECORD=11557
MAP_GOOD_RECORD=8676
大!但问题仍然存在,我如何将这些计数器值返回到主Java应用程序中?