GenericOptionsParser
の-files
フラグを使用して、実行中のジョブに小さなファイルを渡そうとしています。
$ hadoop jar MyJob.jar -conf /path/to/cluster-conf.xml -files /path/to/local-file.csv data/input data/output
これにより、ジョブがクラスターに送信され、必要に応じてマッパー/リデューサーで使用できるようにlocal-file.csvが添付されます。これを疑似分散モードで実行するとうまく機能しましたが、クラスターでジョブを起動すると、ファイルが見つからないようです。私は次のsetup
ようにマッパーのメソッドでファイルを読んでいます:
public static class TheMapper extends Mapper<LongWritable, Text, Text, Text> {
@Override
public void setup(Context context) throws IOException, InterruptedException {
URI[] uriList = DistributedCache.getCacheFiles( context.getConfiguration() );
CsvReader csv = new CsvReader(uriList[0].getPath());
// work with csv file..
}
// ..
}
ジョブの実行中に、次の例外が発生します。
java.io.FileNotFoundException: File /hdfs/tmp/mapred/staging/hduser/.staging/job_201205112311_011/files/local-file.csv does not exist.
at com.csvreader.CsvReader.<init>(Unknown Source)
at com.csvreader.CsvReader.<init>(Unknown Source)
at com.csvreader.CsvReader.<init>(Unknown Source)
at MyJob$TheMapper.setup(MyJob.java:167)
at org.apache.hadoop.mapreduce.Mapper.run(Mapper.java:142)
...
私が間違っていることについて何か考えはありますか?ありがとう。