hadoop distributedcache导致ioexception

unguejic  于 2021-06-03  发布在  Hadoop
关注(0)|答案(1)|浏览(417)

我已经编写了一些代码来使用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
问题是 DistributedCache.getLocalCacheFiles(conf) 查看实际的输入文件,以及与输入文件相同的临时文件,临时存储在/tmp文件夹中。当我在本地运行它时就会发生这种情况(这不会引发任何异常)。我猜当我从hdfs运行它时会发生类似的事情,但是它抛出了异常。有什么办法可以解决这个问题吗?

vulvrdjw

vulvrdjw1#

当您提供文件的本地路径而不是将文件移动到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);
    }

如果你能给我们提供更多关于如何添加缓存文件以及如何访问它们的信息,那会很有帮助。

相关问题