我正在将Hadoop1.0.4代码迁移到Hadoop2.3平台,并且遇到了DistributedCache的奇怪行为变化:
在Hadoop1中,如果我们想在/user/foo/file/bar/name.avro中缓存一个文件,DistributedCache会将该文件复制到本地缓存文件夹中,并相应地创建相同的子目录。因此,文件存储在/[ROOT_OF_TMP_CACHE_DIR]/user/foo/file/bar/name.avro中。
现在,Hadoop2中的相同代码将直接将文件放在根文件夹中,而不创建任何子目录。因此,现在缓存的文件存储在:/[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)发布于 2015-04-30 08:26:07
此错误是由于Hadoop1和2中DistributedCache的内部行为更改造成的。
在Hadoop1中,要缓存的文件将存储在本地tmp目录中,保留其以前的所有路径结构。例如,如果我们在Hadoop1中缓存hdfs:/foo/bar/file1,那么它将存储在/some临时路径/foo/bar/file1中。
在/some 2中,Hadoop2会剥离路径结构,存储hdfs:/foo/bar/file1,它会直接将其存储在hadoop2的临时路径/file1中。
另外,如果您使用symblink名称,Hadoop2会将文件重命名为链接名称,而Hadoop1不会。这会导致从Hadoop 1切换到Hadoop 2时出现一些兼容性冲突。
一个简单的解决方案是始终使用符号链接名称,然后通过该名称访问文件,以便即使它们以不同的方式存储,我们仍然可以以相同的方式访问它们。
https://stackoverflow.com/questions/26372763
复制相似问题