Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/hadoop/6.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Hadoop 如何在Mapper和Reducer类中共享变量?_Hadoop_Mapreduce - Fatal编程技术网

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

Hadoop 如何在Mapper和Reducer类中共享变量?,hadoop,mapreduce,Hadoop,Mapreduce,我需要在mapper和reducer类之间共享一个变量。 情况如下:- 假设我的输入记录是类型A、B和C。我正在处理这些记录,并相应地为映射函数中的output.collect生成键和值。但同时,我还在mapper类中声明了3个静态int变量,以保持记录A、B和C类型的计数。 现在,这些变量将由各种映射线程更新。当所有的映射任务完成后,我想传递这三个值来减少函数 如何做到这一点?我尝试重写close方法,但它将在每个map函数执行后调用,而不是在所有map函数执行完毕时调用。或者是否有其他方式共

我需要在mapper和reducer类之间共享一个变量。 情况如下:-

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

如何做到这一点?我尝试重写close方法,但它将在每个map函数执行后调用,而不是在所有map函数执行完毕时调用。或者是否有其他方式共享变量。我希望输出每种类型记录的总计数以及我正在显示的任何已处理的输出。

得到了解决方案

用过的柜台。Mapper和Reducer中的reporter类都可以访问它。

得到了解决方案


用过的柜台。在Mapper和Reducer中,reporter类都可以访问它。

计数器的存在有一个特定的原因,即为了保持某些特定状态的计数,例如,丢弃的记录数。我相信只能递增这些计数器,而不能设置为任何任意值。我在这里可能出错。当然,它们可以用作消息传递者,但有一种更好的方法,那就是使用作业配置无缝地设置变量。但这只能用于将自定义消息传递给mapper或reducer,并且mapper中的更改在reducer中不可用

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

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

使用Mapper和Reducer中的旧API获取消息/变量: 配置必须在Mapper和Reducer类中实现,然后可以将值分配给类成员,以便在map或reduce中使用

然后,变量awesomeMessage可以与map和reduce函数一起使用

使用Mapper和Reducer中的新API获取消息/变量: 类似的事情需要在这里进行设置


计数器的存在有一个特定的原因,即保持某些特定状态的计数,例如,丢弃的记录数。我相信只能增加这些计数器,而不能设置为任何任意值。我可能在这里出错。当然,它们可以用作消息传递者,但有一种更好的方法,那就是使用作业配置无缝地设置变量。但这只能用于将自定义消息传递给mapper或reducer,并且mapper中的更改在reducer中不可用

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

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

使用Mapper和Reducer中的旧API获取消息/变量: 配置必须在Mapper和Reducer类中实现,然后可以将值分配给类成员,以便在map或reduce中使用

然后,变量awesomeMessage可以与map和reduce函数一起使用

使用Mapper和Reducer中的新API获取消息/变量: 类似的事情需要在这里进行设置


我很确定,您无法将映射器中设置的配置状态传递给还原器-每个映射/还原任务的作业配置都会被复制和更新,并且在每个任务结束时,配置不会被“解析”,并保存回作业跟踪器以备日后使用。因此,虽然您可以在作业提交时设置配置,但无法全局更新或保留map/reduce task中的新值,因为我使用的是org.apache.hadoop.mapred.Mapper,其map函数没有上下文;但记者反对。是的,谢谢你指出这一点,克里斯。你完全正确。我的回答不好。相应地编辑了答案,但现在没有多大帮助。我很确定您无法将映射器中设置的配置状态传递给还原器-每个映射/还原任务的作业配置都会被复制和更新,并且在每个任务结束时,配置不会被“解析”,并保存回作业跟踪器供以后使用。因此,虽然您可以在作业提交时设置配置,但无法全局更新或保留map/reduce task中的新值,因为我使用的是org.apache.hadoop.mapred.Mapper,其map函数没有上下文;但记者反对。是的,谢谢你指出这一点,克里斯。你完全正确。我的错。相应地编辑了答案,虽然现在没有多大帮助。
JobConf job = (JobConf) getConf();
job.set("messageToBePassed-OR-anyValue", "123-awesome-value :P");
Configuration conf = new Configuration();
conf.set("messageToBePassed-OR-anyValue", "123-awesome-value :P");
Job job = new Job(conf);
...
private String awesomeMessage;
public void configure(JobConf job) {
    awesomeMessage = Long.parseLong(job.get("messageToBePassed-OR-anyValue"));
}
...
Configuration conf = context.getConfiguration();
String param = conf.get("messageToBePassed-OR-anyValue");