3

由于不推荐使用getLocalCacheFiles(),因此我正在尝试寻找替代方法。getCacheFiles()似乎是一个,但我怀疑它们是否相同。

当您调用addCacheFile()时,HDFS 中的文件将被下载到每个节点,使用getLocalCacheFiles()您可以获得本地化的文件路径,您可以从本地文件系统中读取它。但是,getCacheFiles()返回的是 HDFS 中文件的 URI。如果您通过此 URI 读取文件,我怀疑您仍然从 HDFS 而不是本地文件系统读取。

以上是我的理解,不知道对不对。如果是这样,有什么替代方法getLocalCacheFiles()?为什么 Hadoop 一开始就弃用它?

4

1 回答 1

6

它是开源的。你总能找到引入@Deprectated: commit 735b50e8bd23f7fbeff3a08cf8f3fff8cbff7449的 git blame ,它是针对MAPREDUCE-4493 的。在 JIRA 的尾部,你会发现这个讨论:

Omkar Vinit Joshi 添加了评论 - 13/Jul/13 00:18
Robert Joseph Evans 如果我们在 jobContext() 中弃用 getLocalCacheFiles 和 getCacheFiles 那么用户将如何在地图任务中获取本地缓存文件?YARN-916 是相关问题。谢谢。

Robert Joseph Evans 添加了评论 - 19/Jul/13 15:27
Omkar Vinit Joshi通过打开当前工作目录中的符号链接. 在 YARN 之前,默认行为是不在当前工作目录中创建指向分布式缓存中项目的符号链接。如果您想要链接,您必须专门打开该选项并提供您想要的符号链接的名称。获取没有符号链接的文件的唯一方法是调用 getLocalCacheFiles 和 getCacheFiles。在 YARN 中,所有文件都将创建一个符号链接。文件/目录的名称将是符号链接的名称。但是,在我想要 hdfs://foo/bar.zip 和 hdfs://bar/bar.zip 的地方可能会发生名称冲突。在 1.0 中,这两个都可以通过已弃用的 API 下载和访问,但在 YARN 中会输出警告,并且只会下载其中一个。此外,由于这些 API 的编写方式,映射器代码可能不知道只下载了其中一个,因此无法找到丢失的 API 并崩溃。这就是为什么我不赞成使用它们,而是鼓励人们总是使用符号链接,这样行为总是一致的。

Omkar Vinit Joshi 添加了一条评论 - 19/Jul/13 16:56
Robert Joseph Evans 听起来不错.. 但是我们将根据文件名进行限制..但考虑到这将阻止潜在的错误,这听起来很合理地图代码和用户绝对可以对它们进行版本以避免它......谢谢......

所以你应该只打开文件,它就会在那里。没有专用的 API。

于 2014-10-21T18:17:11.527 回答