我有一个要求,就像我想在mapper和reducer类之间共享一个变量。 情景如下: -
假设我的输入记录是A,B和C类型的。我正在处理这些记录,并相应地在map函数中为output.collect生成键和值。但与此同时,我还在mapper类中声明了3个静态int变量,以保持记录A,B和C类型的计数。 现在,这些变量将由各种地图线程更新。完成所有地图任务后,我想将这三个值传递给Reduce函数。
如何实现这一目标?我尝试重写close()方法,但是在执行每个map函数之后都会调用它,而不是在所有map函数都执行完之后。或者是否有其他方式来共享变量。我希望输出每种类型记录的总数以及我正在显示的处理输出。
答案 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中的记者类都可以访问。