MapReduce中reduce函数输出形式存差异,二者是否本质相同?
MapReduce Reduce函数输出形式的差异解析
原始论文的抽象定义
Jeff Dean与Sanjay Ghemawat的原始论文(Section 2.2)中给出的Reduce函数签名:
reduce(k2, list(v2)) → list(v2)
这是核心思想层面的简化表达,论文重点聚焦MapReduce的“分治聚合”逻辑:将相同k2对应的v2集合做聚合处理,最终输出聚合后的v2列表。此时没有强制要求显式输出键,因为在论文的典型示例(如单词计数)中,输出的v2天然和输入的k2强绑定,键的存在是隐含的。
Hadoop的工程实现规范
而Hadoop教程及O'Reilly相关书籍中定义的Reduce输出为list(K3, V3),这是落地实现层面的具体要求:
- Hadoop作为可生产使用的分布式计算框架,需要明确的键值对结构来完成结果的持久化(如写入HDFS),或是支持多MapReduce作业的链式串联处理。
- 这里的
K3可以与输入的k2完全相同,也可以是经过转换生成的新键;V3可以是聚合后的v2,也可以是二次加工后的新值。本质是把论文中隐含的键显式化,让框架的处理逻辑更通用、可扩展。
二者的本质一致性
两种定义的核心逻辑完全一致:都是对相同键对应的value集合进行聚合处理后输出结果。论文的定义是抽象层面的简化,省略了显式键(因为部分场景下键的存在无需额外声明);Hadoop的定义则是工程实现的具体化,通过显式键值对输出适配分布式系统的实际需求。
举个直观的例子:
在单词计数场景中:
- 按论文定义:Reduce接收
("hello", [1,1,1]),输出[3],默认这个3对应的键是"hello"; - 按Hadoop定义:Reduce接收
("hello", [1,1,1]),输出("hello", 3),显式输出键值对,方便框架直接写入存储系统。
内容的提问来源于stack exchange,提问作者Evan G
相关产品推荐
相关产品推荐

