【问题标题】:Hadoop DistributedCache classpathHadoop DistributedCache 类路径
【发布时间】:2013-04-01 01:28:03
【问题描述】:

我有一个 Hadoop 0.20.2 集群。

我正在考虑使用DistributedCache 将作业代码分发到所有节点。我无法理解addFileToClassPath()addArchiveToClassPath() 之间的区别。从逻辑上讲,似乎前者用于单个类文件,后者用于 jars。但是在 javadocs 中,他们有这个示例代码:

DistributedCache.addFileToClassPath(new Path("/myapp/mylib.jar"), job);

【问题讨论】:

  • 你为什么要这样做?当您使用hadoop jar ... 提交作业时,它会自动将.jar 文件发送到任何地方。
  • @orangeoctopus - 在我们的例子中,这将是非常低效的。我依赖很多库,所以这个 jar 会很大。我不想在每次开始工作时通过网络将整个内容发送到每个从节点。
  • 分布式缓存也将这样做。它不会永久地将该文件推出,它是一个缓存,因此它会随着时间的推移而被刷新。通常,人们通过在所有节点上安装库并将它们添加到类路径中来做到这一点,而无需 Hadoop API 的帮助。在生产中,人们为此目的使用 Puppet 之类的东西。
  • 似乎仍然是与此相关的活动错误。 issues.apache.org/jira/browse/MAPREDUCE-752

标签: java hadoop


【解决方案1】:

这个question 可能会有所帮助

作为评论部分提到的用户之一,有一个与 addArchiveToClassPath() 相关的错误。学习和解决问题的最佳方法是将 Hadoop 更新到 1.0.0

From the apache website:

addArchiveToClassPath 将归档路径添加到当前的类路径条目集。它还将存档添加到缓存中。归档文件将被解压缩并在分发时添加到类路径中。

addFileToClassPath 将文件路径添加到当前的类路径条目集 它还将文件添加到缓存中。使用此方法添加的文件在添加到类路径时不会被解包。要将档案添加到类路径,请改用 addArchiveToClassPath(Path) 方法。

我意识到 Hadoop 文档是由不太懂英语语法的人编写的。我明白你为什么沮丧了。

【讨论】:

  • 有关系,我不知道它解释了为什么“文件”和“存档”版本不同。
  • @SeanOwen 编辑了问题以获得更多解释。感谢您通知我。
【解决方案2】:

更新 Hadoop 并不总是可行的 - 正如有人建议的那样,在这种情况下,将这个 jar 与 MR 作业的 jar 打包是有意义的,即使是大的 JAR 也不太可能显着影响性能。

另外,如果 jar 包含您要提交的作业的代码,则无需将其添加到 DistributedCache,将作业提交到 hadoop 意味着 Hadoop 作业运行器将负责将您的 jar 分发到所有运行映射器或减速器的节点。仅当您希望一些外部数据伴随您的工作时,才需要将文件添加到 DistributedCache。

【讨论】:

  • 同样,这一切都是正确的,但没有得到我最初感兴趣的“文件”与“存档”方法的区别。
【解决方案3】:

后来我发现了一些额外的信息,并查看了源代码,发现“文件”方法将一个本地文件复制到一个 HDFS 文件,但“存档”版本将压缩的本地存档解压缩到 HDFS。这就是区别。

在相关说明中,回答“为什么要打扰?” cmets -- 我有一个相对较大的 JAR 文件 (20MB) 和一个使用相同代码连续运行大约 20 个 M/R 作业的作业。它是迭代的。这节省了一次上传代码的大量数据传输。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-10-15
    • 2016-01-25
    • 1970-01-01
    • 1970-01-01
    • 2014-02-09
    • 1970-01-01
    相关资源
    最近更新 更多