从Hadoop

时间:2016-11-11 10:21:11

标签: java hadoop

我正在编写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应用程序中?

0 个答案:

没有答案