0

複数のマッパー間で同じファイルにアクセスしたい仕事があります。最初に、各マッパーでファイルを開いてシークしようとしましたが、これは非常に遅いことがわかりました。

ファイルをrun()メソッドで開き (私はjob.SetOutputPathなどのことを行う)、この開いているファイルをマッパーと共有して、何百ものマッパーが同じファイルを個別に開くという信じられないほどのオーバーヘッドがないようにすることは可能ですか?

4

1 に答える 1

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();
        }
    }
}

取得方法は、私が提供した例とは多少異なる可能性がありますが、分散キャッシュの使用方法を説明するのに役立ちます。詳細については、分散キャッシュを参照してください

于 2013-11-07T19:35:49.163 に答える