如何在mapper和reducer类中共享变量?

eaf3rand  于 2021-06-03  发布在  Hadoop
关注(0)|答案(2)|浏览(322)

我有一个要求,就像我想在mapper和reducer类之间共享一个变量。情况如下follows:-
假设我的输入记录是类型a、b和c。我正在处理这些记录,并相应地为map函数中的output.collect生成键和值。但同时我还在mapper类中声明了3个静态int变量,以保持记录类型a、b和c的计数。现在这些变量将由不同的map线程更新。当所有的Map任务完成后,我想传递这三个值来减少函数。
如何做到这一点?我尝试重写close()方法,但它会在每个map函数执行后调用,而不是在所有map函数执行完毕时调用。或者有没有其他方法来共享变量。我希望输出每种类型的记录的总计数以及我正在显示的任何经过处理的输出。

kknvjkwl

kknvjkwl1#

计数器的存在有一个特定的原因,即为了保持某些特定状态的计数,例如“number\u of \u records \u 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获取消息/变量:必须在mapper和reducer类中实现configure(),然后可以将值分配给类成员,以便在map()或reduce()中使用。

...
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");
ymzxtsji

ymzxtsji2#

找到解决办法了。
用过的计数器。它可以由mapper和reducer中的reporter类访问。

相关问题