4

次のコードを使用して、分散キャッシュにファイルを追加しています。

Configuration conf2 = new Configuration();      
job = new Job(conf2);
job.setJobName("Join with Cache");
DistributedCache.addCacheFile(new URI("hdfs://server:port/FilePath/part-r-00000"), conf2);

次に、ファイルをマッパーに読み込みます。

protected void setup(Context context)throws IOException,InterruptedException{
Configuration conf = context.getConfiguration();

URI[] cacheFile = DistributedCache.getCacheFiles(conf);
FSDataInputStream in = FileSystem.get(conf).open(new Path(cacheFile[0].getPath()));
BufferedReader joinReader = new BufferedReader(new InputStreamReader(in));

String line;
        try {
              while ((line = joinReader.readLine()) != null) {
              s = line.toString().split("\t");
                  do stuff to s
                } finally {
                   joinReader.close();
                }

問題は、1 行しか読み取っていないことです。これは、キャッシュに入れていたファイルではありません。むしろ、cm9vdA==、または base64 のルートです。

他の誰かがこの問題を抱えていましたか、または私がどのように分散キャッシュを間違って使用しているかを確認しましたか? Hadoop 0.20.2 を完全に分散して使用しています。

4

1 に答える 1

14

ジョブ構成でよくある間違い:

Configuration conf2 = new Configuration();      
job = new Job(conf2);
job.setJobName("Join with Cache");
DistributedCache.addCacheFile(new URI("hdfs://server:port/FilePath/part-r-00000"), conf2);

Job オブジェクトを作成したら、Job がそのコピーを作成するため、Configuration オブジェクトをプルバックする必要があります。ジョブの作成後に conf2 で値を構成しても、ジョブ自体には影響しません。これを試して:

job = new Job(new Configuration());
Configuration conf2 = job.getConfiguration();
job.setJobName("Join with Cache");
DistributedCache.addCacheFile(new URI("hdfs://server:port/FilePath/part-r-00000"), conf2);

分散キャッシュ内のファイルの数も確認する必要があります。おそらく複数あり、見ている値を提供しているランダムなファイルを開いています。

ファイルをローカルの作業ディレクトリで使用できるようにするシンボリックリンクを使用することをお勧めします。

DistributedCache.createSymlink(conf2);
DistributedCache.addCacheFile(new URI("hdfs://server:port/FilePath/part-r-00000#myfile"), conf2);

// then in your mapper setup:
BufferedReader joinReader = new BufferedReader(new FileInputStream("myfile"));
于 2012-10-04T00:09:29.600 に答える