【发布时间】:2015-01-15 05:25:56
【问题描述】:
我们知道,在 hadoop 的 shuffle 阶段,每个 reducer 从所有 mapper 的输出(中间数据)中读取数据。
现在,我们也知道默认情况下 Hash-Partitioning 用于 reducer。
我的问题是:我们如何实现算法,例如位置感知?
【问题讨论】:
标签: hadoop mapreduce shuffle reduce partition
我们知道,在 hadoop 的 shuffle 阶段,每个 reducer 从所有 mapper 的输出(中间数据)中读取数据。
现在,我们也知道默认情况下 Hash-Partitioning 用于 reducer。
我的问题是:我们如何实现算法,例如位置感知?
【问题讨论】:
标签: hadoop mapreduce shuffle reduce partition
简而言之,你不应该这样做。
首先,您无法控制 mapper 和 reducer 在集群上的执行位置,因此即使单个 mapper 的完整输出将转到单个 reducer,它们也很有可能位于不同的主机上,并且数据将通过网络传输
其次,要让reducer处理mapper的全部输出,你首先要让mapper处理正确的部分信息,这意味着你必须对数据进行分区预处理,然后运行单个mapper和一个每个分区都有一个 reducer,但是这种预处理本身会占用大量资源,因此几乎没有意义
最后,你为什么需要它? map-reduce 的主要概念是使用键值对进行操作,并且 reducer 通常应该聚合映射器为相同键输出的值列表。这就是使用哈希分区的原因:在 K 个 reducer 之间分配 N 个键。使用不同类型的分区器非常少见。例如,如果您需要数据本地化,您可能更喜欢使用 MPP 数据库而不是 Hadoop。
如果您真的需要自定义分区器,这里有一个如何实现它的示例:http://hadooptutorial.wikispaces.com/Custom+partitioner。没什么特别的,只是根据传递的 key 和 value 以及 reducer 的数量返回 reducer 的数量。使用主机名的哈希码(%)除以 reducer 的数量将使单个 mapper 的整个输出转到单个 reducer。您也可以使用进程 PID % number of reducer。但在这样做之前,您必须检查您是否真的需要这种行为。
【讨论】: