使用 mapred 或 mapreduce 包创建 Hadoop 作业哪个更好?
Posted
技术标签:
【中文标题】使用 mapred 或 mapreduce 包创建 Hadoop 作业哪个更好?【英文标题】:Is it better to use the mapred or the mapreduce package to create a Hadoop Job? 【发布时间】:2011-11-27 17:52:40 【问题描述】:要创建 MapReduce 作业,您可以使用旧的 org.apache.hadoop.mapred
包或更新的 org.apache.hadoop.mapreduce
包用于 Mappers 和 Reducers,作业...第一个已被标记为已弃用,但同时又恢复了。现在我想知道使用旧的mapred包还是新的mapreduce包创建作业更好,为什么。还是仅仅取决于您是否需要像 MultipleTextOutputFormat 这样的东西,它只在旧的 mapred 包中可用?
【问题讨论】:
but this got reverted meanwhile
你确定吗?
例如r0.21.0 中 org.apache.hadoop.mapred.lib 包中的接口映射器未标记为已弃用,而在 r0.20.2 中标记为已弃用。
【参考方案1】:
在功能方面,旧的 (o.a.h.mapred
) 和新的 (o.a.h.mapreduce
) API 之间没有太大区别。唯一显着的区别是记录被推送到旧 API 中的映射器/归约器。而新的 API 同时支持拉/推机制。您可以获取更多关于拉取机制的信息here。
此外,从 0.21 开始,旧 API 一直是 un-deprecated。您可以找到有关新 API here 的更多信息。
正如您提到的,一些类(如 MultipleTextOutputFormat)尚未迁移到新 API,由于这个和上述原因,最好坚持使用旧 API(尽管翻译通常很简单)。
【讨论】:
javadocs 没有提到这些有什么原因吗? Hadoop - The Definitive Guide 拥有新 API 中的大部分代码。 附带说明 - MRUnit 使用新的 API,.mapreduce。因此,如果您在代码中使用 .mapred,它会引发错误。你不会快乐的。 作为对当前 Hadoop 版本(2.1.0 beta)的一个小更新,旧 API 被宣布为稳定并且没有被弃用:hadoop.apache.org/docs/current/api/index.html?org/apache/hadoop/…也许我们可以把它变成一个社区维基@ PraveenSripati 由于缺少@deprecated
注释,我已经使用旧 API 2 年了,甚至不知道存在新 API(我开始时已经 2 岁了:我应该一直在用)。我昨天才发现,因为我想使用的 OutputFormat
是为新 API 编写的,现在我必须更改所有内容。我已经习惯了编译器告诉我某些东西是否已被弃用,而不是社区民间传说。【参考方案2】:
新旧 API 都很好。新的 API 更简洁。尽可能使用新 API,并在需要新 API 中不存在的特定类的地方使用旧 API(例如 MultipleTextOutputFormat
)
但请注意不要在同一个 Mapreduce 作业中混合使用新旧 API。这会导致奇怪的问题。
【讨论】:
【参考方案3】:旧 API(mapred)
存在于包 org.apache.hadoop.mapred
提供 map/reduce 作业配置。
根据迭代器减少给定键的值 包Summary新 API(mapreduce)
存在于包 org.apache.hadoop.mapreduce 中
作业配置由单独的类完成,称为 JobConf,它是 Configuration 的扩展 类
根据 Iterable 减少给定键的值
Package Summary
【讨论】:
org.apache.hadoop.mapred 是旧的 API,而 org.apache.hadoop.mapreduce 是新的。你可能想改变你的答案 另外,JobConf 是 mapred API 的一部分,而不是 mapreduce API以上是关于使用 mapred 或 mapreduce 包创建 Hadoop 作业哪个更好?的主要内容,如果未能解决你的问题,请参考以下文章
解决 mapreduce.Cluster 无法使用 org.apache.hadoop.mapred.YarnClientProtocolProvider 由于实例化 YarnClient 错误
Hadoop MapReduce 新旧 mapred 与 mapreduce API
Apache Hadoop YARN 中的“mapreduce.map.memory.mb”和“mapred.map.child.java.opts”之间有啥关系?