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”)检索这些值