2013-04-25 83 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