1

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)
...

私が間違っていることについて何か考えはありますか?ありがとう。

4

1 に答える 1

7

これはよくある問題です。この-filesオプションは DistributedCache とは別に機能します。

を使用する-filesと、GenericOptionsParser は という名前のジョブ プロパティを構成tmpfilesし、DistributedCache は という名前のプロパティを使用しますmapred.cache.files

また、分散キャッシュは、ファイルが既に HDFS にあると想定し、それらをタスク ノードにコピーします。一方、as -files は、ジョブの送信時にファイルを HDFS にコピーしてから、それらを各タスク ノードにコピーします。

あなたの場合、コードを機能させるには、Fileオブジェクトを作成し、渡したファイルに名前を付けるだけです (明らかに、これにはローカル ファイルのファイル名を知って、それをマッパー コードにハード コードする必要があります)。ファイルは現在の作業ディレクトリにあります。

@Override
public void setup(Context context) throws IOException, InterruptedException {
  CsvReader csv = new CsvReader(new File("local-file.csv"));

  // work with csv file..

}

于 2012-05-13T14:08:13.363 に答える