2

我需要在我的 mapreduce 程序中使用全局变量,如何在下面的代码中设置它并在 reducer 中使用全局变量。

public class tfidf
{
  public static tfidfMap..............
  {
  }
  public static tfidfReduce.............
  {
  }
  public static void main(String args[])
  {
       Configuration conf=new Configuration();
       conf.set("","");
  } 

}

4

3 回答 3

6

模板代码可能看起来像这样(Reducer 未显示,但主体相同)

import java.io.IOException;

import org.apache.hadoop.conf.Configuration;
import org.apache.hadoop.conf.Configured;
import org.apache.hadoop.io.LongWritable;
import org.apache.hadoop.io.Text;
import org.apache.hadoop.mapreduce.Job;
import org.apache.hadoop.mapreduce.Mapper;
import org.apache.hadoop.mapreduce.Mapper.Context;
import org.apache.hadoop.util.Tool;
import org.apache.hadoop.util.ToolRunner;

public class ToolExample extends Configured implements Tool {

    @Override
    public int run(String[] args) throws Exception {
        Job job = new Job(getConf());
        Configuration conf = job.getConfiguration();

        conf.set("strProp", "value");
        conf.setInt("intProp", 123);
        conf.setBoolean("boolProp", true);

        // rest of your config here
        // ..

        return job.waitForCompletion(true) ? 0 : 1;
    }

    public static class MyMapper extends
            Mapper<LongWritable, Text, LongWritable, Text> {
        private String strProp;
        private int intProp;
        private boolean boolProp;

        @Override
        protected void setup(Context context) throws IOException,
                InterruptedException {
            Configuration conf = context.getConfiguration();

            strProp = conf.get("strProp");
            intProp = conf.getInt("intProp", -1);
            boolProp = conf.getBoolean("boolProp", false);
        }
    }

    public static void main(String args[]) throws Exception {
        System.exit(ToolRunner.run(new ToolExample(), args));
    }
}
于 2013-04-25T23:01:51.413 回答
4

在集群(本地除外)环境中,如果 map/reduce 程序是用 Java 编写的(其他语言的单独进程),则 MapReduce 程序将运行其自己的 JVM。有了这个,你就不能实现在一个类中声明一个静态变量和值,并在 MapReduce 流程中一路改变,并期望另一个 JVM 中的值。共享对象是您所需要的,以便 mapper/reduce 可以设置和获取值。

实现这一目标的方法很少。

  1. 正如 Chris 所提到的,使用 Configuration set()/get() 方法将值传递给 mapper 和/或 reducer。在这种情况下,您必须在创建作业之前将值设置为配置对象。

  2. 使用 HDFS 文件写入数据并从 mapper/reducer 中读取数据。记得清理上面创建的 HDFS 文件。

于 2013-04-26T01:20:54.790 回答
2

Hadoop 计数器(用户定义)是另一种全局变量。作业完成后可以查看这些值。例如:如果您想计算输入中错误/良好记录的数量(由各种映射器/减速器处理),您可以使用计数器。@Mo:您可以根据需要使用计数器

于 2014-12-29T13:01:19.057 回答