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 在MapReduce作业配置中设置参数_Hadoop_Mapreduce - Fatal编程技术网

Hadoop 在MapReduce作业配置中设置参数

Hadoop 在MapReduce作业配置中设置参数,hadoop,mapreduce,Hadoop,Mapreduce,是否有任何方法可以从Mapper设置作业配置中的参数,并且可以从Reducer访问该参数 我尝试了下面的代码 在映射器中:map(…):context.getConfiguration().set(“Sum”,“100”) 在reducer中:reduce(…):context.getConfiguration().get(“Sum”) 但在reducer中,值返回为null 有没有什么方法可以实现这一点或者我遗漏了什么?如果您使用的是新的API,那么您的代码应该可以理想地工作。您是否在创造就业

是否有任何方法可以从
Mapper
设置作业配置中的参数,并且可以从
Reducer
访问该参数

我尝试了下面的代码

在映射器中:
map(…)
context.getConfiguration().set(“Sum”,“100”)
在reducer中:
reduce(…)
context.getConfiguration().get(“Sum”)

但在reducer中,值返回为
null


有没有什么方法可以实现这一点或者我遗漏了什么?

如果您使用的是新的API,那么您的代码应该可以理想地工作。您是否在创造就业机会开始时创建了此“总和”属性?比如像这样

Configuration conf = new Configuration();
conf.set("Sum", "0");
Job job = new Job(conf);
如果不是,你最好使用

context.getConfiguration().setIfUnset("Sum","100");

在mapper类中修复此问题。这是我唯一能看到的东西。

据我所知,这是不可能的。作业配置在运行时由jobtracker序列化为XML,并复制到所有任务节点。对配置对象的任何更改只会影响该对象,该对象是特定任务JVM的本地对象;它不会在每个节点上更改XML


一般来说,您应该尽量避免任何“全局”状态。它与MapReduce范式背道而驰,通常会阻止并行性。如果绝对必须在映射和Reduce阶段之间传递信息,并且无法通过通常的无序排列/排序步骤进行传递,则可以尝试写入分布式缓存,或直接写入HDFS。

如果可能,将其写入本地文件,并在reducer的configure()或setup()中读取。这应该很简单。我可以知道configure()和setup()之间的区别吗?我知道configure()将在mapper类中调用一次,这样我就可以初始化其中的一些全局变量。setup()怎么样?谢谢谢谢乔提供的信息。我尝试了第二种方法,从减速器将o/p写入HDFS,然后下一个映射器从HDFS读取数据。设置后,我们可以使用context.getConfiguration().get(“Sum”)检索这些值