我正在将 hadoop 1.0.4 代码迁移到 Hadoop 2.3 平台中,并遇到了 DistributedCache 的奇怪行为变化:
在hadoop 1中,如果我们想缓存一个文件/user/foo/file/bar/name.avro
,分布式缓存会将该文件复制到本地缓存文件夹中,并相应地创建相同的子目录。所以文件存储在/[ROOT_OF_TMP_CACHE_DIR]/user/foo/file/bar/name.avro
.
现在 Hadoop 2 中的相同代码会将文件直接放在根文件夹中,而无需创建任何子目录。所以现在缓存的文件存储在:/[ROOT_OF_TMP_CACHE_DIR]/name.avro
.
如果我们缓存多个文件,尤其是当文件名为part-r-00000.avro
.
当然,应用链接并将缓存文件重命名为唯一名称可能是解决此问题的一种方法;但更一般地说,在许多情况下创建唯一名称似乎是微不足道的,尤其是当需要保证不同映射器/减速器之间的唯一名称时。我想知道是否有任何其他方法可以更改此行为,例如在 tmp 目录中创建一个文件夹或调整 mapreduce 配置参数?
我尝试的一种方法是尝试将 URI 设置为“path#path”,因此我们链接到自己,但似乎得到以下异常:
14-10-2014 16:05:41 PDT admm_train INFO - Caused by: java.lang.IllegalArgumentException: Resource name must be relative
14-10-2014 16:05:41 PDT admm_train INFO - at org.apache.hadoop.mapreduce.v2.util.MRApps.parseDistributedCacheArtifacts(MRApps.java:489)
14-10-2014 16:05:41 PDT admm_train INFO - at org.apache.hadoop.mapreduce.v2.util.MRApps.setupDistributedCache(MRApps.java:430)
14-10-2014 16:05:41 PDT admm_train INFO - at org.apache.hadoop.mapred.YARNRunner.createApplicationSubmissionContext(YARNRunner.java:455)
14-10-2014 16:05:41 PDT admm_train INFO - at org.apache.hadoop.mapred.YARNRunner.submitJob(YARNRunner.java:283)
14-10-2014 16:05:41 PDT admm_train INFO - at org.apache.hadoop.mapreduce.JobSubmitter.submitJobInternal(JobSubmitter.java:432)