如何在Mapper和Reducer类中共享变量?

时间:2013-01-07 12:35:54

标签: hadoop mapreduce

我有一个要求,就像我想在mapper和reducer类之间共享一个变量。 情景如下: -

假设我的输入记录是A,B和C类型的。我正在处理这些记录,并相应地在map函数中为output.collect生成键和值。但与此同时,我还在mapper类中声明了3个静态int变量,以保持记录A,B和C类型的计数。 现在,这些变量将由各种地图线程更新。完成所有地图任务后,我想将这三个值传递给Reduce函数。

如何实现这一目标?我尝试重写close()方法,但是在执行每个map函数之后都会调用它,而不是在所有map函数都执行完之后。或者是否有其他方式来共享变量。我希望输出每种类型记录的总数以及我正在显示的处理输出。

2 个答案:

答案 0 :(得分:3)

计数器有特定原因,即。保持一些特定状态的计数,例如“NUMBER_OF_RECORDS_DISCARDED”。我相信只能递增这些计数器而不设置为任意值(我可能在这里错了)。但确定它们可以用作消息传递者,但有一种更好的方法,那就是使用作业配置来无缝地设置变量。但是这只能用于将自定义消息传递给mapper或reducer,并且mapper中的更改将不会在reducer中提供。

使用旧的 mapred API设置消息/变量

JobConf job = (JobConf) getConf();
job.set("messageToBePassed-OR-anyValue", "123-awesome-value :P");

使用新的 mapreduce API设置消息/变量:

Configuration conf = new Configuration();
conf.set("messageToBePassed-OR-anyValue", "123-awesome-value :P");
Job job = new Job(conf);

使用Mapper和Reducer中的旧API获取消息/变量: configure()必须在Mapper和Reducer类中实现,然后可以将值分配给类成员,以便在 map()或<内使用EM>减少()

...
private String awesomeMessage;
public void configure(JobConf job) {
    awesomeMessage = Long.parseLong(job.get("messageToBePassed-OR-anyValue"));
}
...

变量awesomeMessage可以与map和reduce函数一起使用。

使用Mapper和Reducer中的新API获取消息/变量: 类似的事情需要在 setup()中完成。

Configuration conf = context.getConfiguration();
String param = conf.get("messageToBePassed-OR-anyValue");

答案 1 :(得分:1)

得到了解决方案。

二手专柜。 Mapper和Reducer中的记者类都可以访问。