0

我已经编写了一些代码来使用 Hadoop 执行自连接任务。为此,我使用 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 回答