2012-05-13 6 views
1

私はGenericOptionsParserさん-filesフラグを使用して実行しているジョブに小さなファイルを渡すためにしようとしている:Hadoop Map/ReduceジョブでDistributedCacheにアクセスするにはどうすればよいですか?

$ hadoop jar MyJob.jar -conf /path/to/cluster-conf.xml -files /path/to/local-file.csv data/input data/output 

これは私のクラスタにジョブを送信し、ローカルファイルを添付することになっています。 csvを必要に応じてMapper/Reducerで利用できるようにします。これを擬似分散モードで実行したときにうまくいったのですが、クラスタでジョブを起動するとファイルが見つからないようです。私はそうのように私のマッパーの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) 
... 

任意のアイデアを私が間違ってやっていますか?ありがとう。

答えて

7

これは一般的な問題です。-filesオプションは、DistributedCacheの脇にあります。

あなたが-filesを使用する場合DistributedCacheはmapred.cache.filesというプロパティを使用しながら、GenericOptionsParserは、tmpfilesと呼ばれるジョブプロパティを設定します。

また、分散キャッシュでは、ファイルがすでにHDFSに存在することが予想され、タスクノードにコピーされます。ここで、-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.. 

}

+0

は素晴らしい仕事 - 感謝を! – sa125

関連する問題