複数のマッパー間で同じファイルにアクセスしたい仕事があります。最初に、各マッパーでファイルを開いてシークしようとしましたが、これは非常に遅いことがわかりました。
ファイルをrun()
メソッドで開き (私はjob.SetOutputPath
などのことを行う)、この開いているファイルをマッパーと共有して、何百ものマッパーが同じファイルを個別に開くという信じられないほどのオーバーヘッドがないようにすることは可能ですか?
はい、これは実際に可能です。分散キャッシュを設定し、ジョブの開始前にファイルをロードすると、自動的にマッパーに送信されます。
分散キャッシュの設定例:
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();
}
}
}
取得方法は、私が提供した例とは多少異なる可能性がありますが、分散キャッシュの使用方法を説明するのに役立ちます。詳細については、分散キャッシュを参照してください