我已经编写了一些代码来使用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和返回2的DistributedCache.getLocalCacheFiles(conf)
但我不知道发生这种情况的原因。谁能告诉我我没有得到什么?
PS:我忘了提到我使用的是Hadoop-1.0.4
PS2:问题在于DistributedCache.getLocalCacheFiles(conf)
看到真实的输入文件以及与输入文件相同的临时文件,并临时存储在/ tmp文件夹中。当我在本地运行它时会发生这种情况(不会抛出任何异常)。我想当我从hdfs运行它时会发生类似情况但是它会抛出异常。有什么想法我怎么能解决这个问题?
答案 0 :(得分:0)
可能正在发生,因为您提供文件的本地路径,而不是将文件移动到HDFS,然后提供HDFS路径。另外我相信你是在本地尝试并以伪分布式模式运行hadoop。
为了将文件移动到hdfs,您可以执行以下操作:
$ hadoop fs -put <your-file-path> <someHDFSfoldername/filename>
然后在分布式缓存中添加someHDFSfoldername/filename
。
编辑: 查看代码here,当源文件和目标文件的数量不匹配时会发生这种情况。来自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);
}
如果您向我们提供有关如何添加缓存文件以及如何访问缓存文件的更多信息,这将有所帮助。