在Mappers之间共享FSDataInputStream?

时间:2013-11-07 18:49:45

标签: java database hadoop mapreduce hdfs

我有一份工作,我希望跨多个Mappers访问同一个文件。最初我尝试在每个映射器中打开并搜索文件,但事实证明这非常慢。

是否可以用run()方法打开文件(我在job.SetOutputPath之类的地方执行此操作),然后与Mappers共享此打开文件,这样我就不会有令人难以置信的100s开销Mappers分别打开同一个文件?

1 个答案:

答案 0 :(得分:2)

是的,这实际上是可能的。如果在作业开始之前设置分布式缓存并将文件加载到它,它将自动发送给映射器。

分布式缓存设置示例:

String fileLocation;//set this to file absolute location
Configuration conf; //job Configuration

DistributedCache.addLocalFiles(conf,fileLocation);
conf.set("fileLocation",fileLocation);

以Mapper设置方法检索:

Configuration mapConf = context.getConfiguration();

URI[] cacheURIArray = DistributedCache.getCacheFiles();

String file2Location = mapConf.get("file2Location");

List<String> fileWords = new ArrayList<String>(); //set this as a clas variable so it can be accessed outside of the setup method of the mapper

for(URI uri: cacheURIArray){
    if( uri.toString().matches(".*"+fileLocation)){
        BufferedReader br = new BufferedReader(new InputStream(cacheFileSystem.open(new Path(uri.toString()))));
        String line = "";
        line = br.readLine();
        while(line != null){
            fileWords.add(line);
            line = br.readLine();
        }
    }
}

您的检索方法可能与我提供的示例有所不同,但它用于说明如何使用分布式缓存。有关详细信息,请查看Distributed Cache