Hadoop DistributedCache分散式快取的使用

Liu Yan的部落格發表於2014-10-29

做專案的時候遇到一個問題,在Mapper和Reducer方法中處理目標資料時,先要去檢索和匹配一個已存在的標籤庫,再對所處理的欄位打標籤。因為標籤庫不是很大,沒必要用HBase。我的實現方法是把標籤庫儲存成HDFS上的檔案,用分散式快取儲存,這樣讓每個slave都能讀取到這個檔案。

main方法中的配置:

//分散式快取要儲存的檔案路徑
String cachePath[] = {
                "hdfs://10.105.32.57:8020/user/ad-data/tag/tag-set.csv",
                "hdfs://10.105.32.57:8020/user/ad-data/tag/TagedUrl.csv"
        };
//向分散式快取中新增檔案
        job.addCacheFile(new Path(cachePath[0]).toUri());
        job.addCacheFile(new Path(cachePath[1]).toUri());

參考上面程式碼即可向分散式快取中新增檔案。

在Mapper和Reducer方法中讀取分散式快取檔案:

/*
 * 重寫Mapper的setup方法,獲取分散式快取中的檔案
 */
    @Override
    protected void setup(Mapper<LongWritable, Text, Text, Text>.Context context)
                   throws IOException, InterruptedException {
        // TODO Auto-generated method stub
        super.setup(context);
        URI[] cacheFile = context.getCacheFiles();
        Path tagSetPath = new Path(cacheFile[0]);
        Path tagedUrlPath = new Path(cacheFile[1]);
        檔案操作(如把內容讀到set或map中);
    }

@Override
public void map(LongWritable key, Text value, Context context)
            throws IOException, InterruptedException {
            在map()中使用讀取出的資料;
      }

同樣,如果在Reducer中也要讀取分散式快取檔案,示例如下:

/*
 * 重寫Reducer的setup方法,獲取分散式快取中的檔案
 */
    @Override
    protected void setup(Context context) 
                   throws IOException, InterruptedException {
        super.setup(context);
        mos = new MultipleOutputs<Text, Text>(context);

        URI[] cacheFile = context.getCacheFiles();
        Path tagSetPath = new Path(cacheFile[0]);
        Path tagSetPath = new Path(cacheFile[1]);
        檔案讀取操作;
    }

 @Override
  public void reduce(Text key, Iterable<Text> values, Context context)
              throws IOException, InterruptedException {
      while(values.iterator().hasNext()){
          使用讀取出的資料;
      }
       context.write(key, new Text(sb.toString()));
      }

相關文章