在mapper中设置conf值 - 在run方法中获取它

时间:2015-01-09 07:04:17

标签: hadoop mapreduce

在Driver类的run方法中,我想获取一个String值(来自mapper函数)并想要将其写入文件。我使用了以下代码,但返回了null。请帮忙

映射

public void map(LongWritable key, Text value, Context context) 
       throws IOException, InterruptedException {
   context.getConfiguration().set("feedName", feedName);
}

驱动程序类

@Override

public int run(String[] args) throws Exception {

    String lineVal = conf.get("feedName")
}

2 个答案:

答案 0 :(得分:0)

使用配置你只能做反之亦然。 您可以在Driver class

中设置值
public int run(String[] args) throws Exception {

    conf.set("feedName",value);
}

并设置在Mapper类中获取

public void map(LongWritable key, Text value, Context context) throws IOException, InterruptedException {
         Configuration conf = context.getConfiguration();
         String lineVal = conf.get("feedName");
      }

<强>更新

您的问题的一个选项是将数据写入文件并将其存储在HDFS中,然后在Driver类中访问它们。这些文件可以视为“Intermediate Files”。

试试吧,看看。

答案 1 :(得分:0)

配置是一种方式。 如果要将非计数器类型的值传递回驱动程序,可以使用HDFS。

写入从作业中发出的主输出上下文(键和值)。 或者,如果您不想弄乱标准作业输出,请使用MultipleOutputs

例如,您可以将任何类型的属性写为来自映射器或缩减器的文本键和文本值。

一旦控制权回到驱动程序,只需从HDFS读取即可。例如,您可以将名称/值存储到Configuration对象中,以供序列中的下一个作业使用:

   public void load(Configuration targetConf, Path src, FileSystem fs) throws IOException {
        InputStream is = fs.open(src);
        try {
          Properties props = new Properties();
          props.load(new InputStreamReader(is, "UTF8"));
          for (Map.Entry prop : props.entrySet()) {
            String name = (String)prop.getKey();
            String value = (String)prop.getValue();
            targetConf.set(name, value);
          }
        } finally {
            is.close();
        }
    }

请注意,如果您在写入MultipleOutputs时有多个映射器或缩减器,则最终会有多个{name} -m - #####或{name} -r - #####文件。

在这种情况下,您需要从每个输出文件中读取或运行单个reducer作业以将输出合并为一个,然后只读取一个文件,如上所示。