0

Hadoop を使用して selfjoin タスクを実行するコードをいくつか書きました。この目的のために、DistributedCache クラスを使用します。コードを Netbeans でローカルに実行すると、ジョブは正しく実行されますが、hdfs にデータをアップロードした後に単一ノード クラスタで実行しようとすると、次の例外が発生します。

Error initializing attempt_201301021509_0002_m_000002_0:
java.io.IOException: Distributed cache entry arrays have different lengths: 1, 2, 1, 1
    at org.apache.hadoop.mapred.JobLocalizer.downloadPrivateCacheObjects(JobLocalizer.java:316)
    at org.apache.hadoop.mapred.JobLocalizer.downloadPrivateCache(JobLocalizer.java:343)
    at org.apache.hadoop.mapred.JobLocalizer.localizeJobFiles(JobLocalizer.java:388)
    at org.apache.hadoop.mapred.JobLocalizer.localizeJobFiles(JobLocalizer.java:367)
    at org.apache.hadoop.mapred.DefaultTaskController.initializeJob(DefaultTaskController.java:202)
    at org.apache.hadoop.mapred.TaskTracker$4.run(TaskTracker.java:1228)
    at java.security.AccessController.doPrivileged(Native Method)
    at javax.security.auth.Subject.doAs(Subject.java:416)
    at org.apache.hadoop.security.UserGroupInformation.doAs(UserGroupInformation.java:1121)
    at org.apache.hadoop.mapred.TaskTracker.initializeJob(TaskTracker.java:1203)
    at org.apache.hadoop.mapred.TaskTracker.localizeJob(TaskTracker.java:1118)
    at org.apache.hadoop.mapred.TaskTracker$5.run(TaskTracker.java:2430)
    at java.lang.Thread.run(Thread.java:679)

問題が JobLocalizer.java にあり、DistributedCache.getLocalCacheFiles(conf)それが 2 を返すことは理解していますが、これが発生する理由はわかりません。私が得られないものを誰か教えてもらえますか?

PS: Hadoop-1.0.4 を使用していることを忘れていました。

PS2: 問題はDistributedCache.getLocalCacheFiles(conf)、実際の入力ファイルと、入力ファイルと同じ一時ファイルが表示され、/tmp フォルダーに一時的に保存されることです。これは、ローカルで実行すると発生します (例外はスローされません)。hdfsから実行すると同様のことが起こると思いますが、例外がスローされます。どうすればこれを修正できますか?

4

1 に答える 1

0

ファイルをHDFSに移動してからHDFSパスを提供するのではなく、ファイルへのローカルパスを提供しているため、おそらく発生しています。また、ローカルで試して、疑似分散モードで Hadoop を実行していると思います。

ファイルを hdfs に移動するには、次のようにします。

$ hadoop fs -put <your-file-path> <someHDFSfoldername/filename>

someHDFSfoldername/filename次に、分散キャッシュを追加します。

編集:ここのコードを見ると、ソース ファイルと宛先ファイルの数が一致しない場合に発生します。JobLocalizer.javaの次のコード セグメントでエラーが発生します。

if (sources.length != dests.length ||
        sources.length != times.length ||
        sources.length != isPublic.length) {
      throw new IOException("Distributed cache entry arrays have different " +
                            "lengths: " + sources.length + ", " + dests.length +
                            ", " + times.length + ", " + isPublic.length);
    }

キャッシュ ファイルをどのように追加し、それらにどのようにアクセスしているかについて、さらに詳しい情報を入手していただければ助かります。

于 2013-01-02T18:40:34.380 に答える