0

我正在将 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)
4

1 回答 1

1

此错误是由于 Hadoop 1 和 2 中 DistributedCache 的内部行为发生了变化。

在 Hadoop 1 中,要缓存的文件将存储在本地 tmp 目录中,保留其所有先前的路径结构。例如,如果我们在 Hadoop1 中缓存 hdfs:///foo/bar/file1,它将存储在 /[some tmp path]/foo/bar/file1。

在Hadoop 2中,DistributeCache会剥离路径结构,存放hdfs:///foo/bar/file1,直接存放在/[some tmp path]/file1。

此外,如果您使用符号链接名称,Hadoop 2 会将文件重命名为链接名称,而 Hadoop 1 不会。这会在从 Hadoop 1 切换到 Hadoop 2 时导致一些兼容性冲突。

一个简单的解决方案是始终使用符号链接名称,然后通过名称访问文件,这样即使它们的存储方式不同,我们仍然可以以相同的方式访问它们。

于 2015-04-30T00:26:06.623 回答