2013-04-25 85 views
2

我需要在我的mapreduce程序中使用全局变量,如何在以下代码中设置它并在缩减器中使用全局变量。在reudcer类中使用全局变量

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

}

回答

6

模板代码可能是这个样子(减速未示出,但相同的原理)

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)); 
    } 
} 
+0

conf.getInt(“intProp”,-1)中的-1是什么?它表示什么? – 2016-05-23 03:33:36

4

在(比当地其他)环境中的集群,MapReduce程序被运行它自己的JVM(如果map/reduce程序是用Java编写的)(用其他语言分开的进程)。有了这个,你无法在类中声明一个静态变量和值,并在MapReduce流程中一路改变,并期望在另一个JVM中获得值。共享对象是您需要的,以便mapper/reduce可以设置并获取值。

有几种方法可以实现这一点。

  1. 正如克里斯提到,使用配置集()/ get()方法的方法将值传递给映射器和/或减速机。在这种情况下,您必须在创建作业之前将这些值设置为“配置”对象。

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

+0

嗨, 我想要类似的东西,但我想在作业完成后查看值的视图。任何想法我可能会这样做? – 2014-07-16 17:26:07

+0

@ Mo.-写下你的问题并发布 - 这样,有问题的人可以稍后再找到它! – 2014-12-29 17:13:58

2

Hadoop计数器(User-defined)是另一种全局变量。这些值可以在作业完成后查看。 例如:如果你想统计输入错误/好记录的数量(由各种映射器/缩减器处理),你可以去计数器。你可以根据你的需求使用计数器

+0

很好用的计数器共享变量:) – Azim 2016-08-31 18:56:43