我一直在学习 mapreduce 算法以及它如何可能扩展到数百万台机器,但我不明白映射阶段之后中间键的排序如何扩展,因为会有:
1,000,000 x 1,000,000
:潜在的机器相互通信中间结果的小键/值对?这不是瓶颈吗?
确实,Hadoop MapReduce 的瓶颈之一是集群上机器之间的网络带宽。但是,每个映射阶段的输出不会发送到集群中的每台机器。
map 和 reduce 函数的数量由您正在运行的作业定义。每个映射处理其输入数据,对其进行排序以对键进行分组并将其写入磁盘。该作业定义了您希望将多少个 reduce 函数应用于映射的输出。
每个reduce都需要查看给定键的所有数据。因此,如果您为该作业运行单个reduce,则每个映射的所有输出都需要发送到集群中运行该reduce 的节点。在 reduce 运行之前,来自每个映射的数据被合并以对所有键进行分组。
如果使用了多个 reducer,maps 会划分它们的输出,每个 reducer 创建一个。分区被发送到正确的reduce。这确保了给定键的所有数据都由单个 reduce 处理。
为了帮助减少需要通过网络发送的数据量,您可以将组合功能应用于地图的输出。这具有对映射的输出运行减少的效果。因此,您可以最大限度地减少需要传输到 reducer 的数据量,并加快整个作业的执行时间。