【发布时间】:2014-12-24 05:40:28
【问题描述】:
假设我有一份工作,它有许多映射器和多个 reduce 任务。映射器输出的键类型是 WritableComparable。即,对于字数统计示例,假设我有字符串:
"foo foo bar foo bletch quux bar"
当使用单词作为键时,“foo”是否总是分配给同一个reduce,还是有可能不止一个reducer 接收到“foo”?
【问题讨论】:
假设我有一份工作,它有许多映射器和多个 reduce 任务。映射器输出的键类型是 WritableComparable。即,对于字数统计示例,假设我有字符串:
"foo foo bar foo bletch quux bar"
当使用单词作为键时,“foo”是否总是分配给同一个reduce,还是有可能不止一个reducer 接收到“foo”?
【问题讨论】:
MapReduce 总是将键值对传递给reducer,这样与同一个键关联的所有值都会传递给同一个reducer。这是由 MapReduce 期间的partitioner 阶段完成的。
因此,与foo 关联的所有值都将转到同一个reducer。
【讨论】:
Hadoop 对所有 map 任务的输出进行排序,然后将具有相同键的所有 mapper 输出传输到同一个 reducer 任务。这称为“洗牌”。因此,一个reducer 任务可能正在处理所有“foo”映射器结果,而另一个正在处理所有“bar”映射器结果。如果 "foo" 或 "bar" 是映射器发出的键,那么多个 reducer 将永远不会收到 "foo"。
【讨论】:
正如其他答案中所提到的,MapReduce 总是将键值对传递给减速器,这样与同一键关联的所有值都会转到同一个减速器。
实际发生的情况是,在分区阶段,对键应用哈希函数,因此使用哈希将它们发送到减速器。因此,所有相似的键最终都会进入同一个 reducer。
【讨论】: