hadoop-2.4.1自定义分区器到平衡还原器

watbbzwu  于 2021-05-30  发布在  Hadoop
关注(0)|答案(1)|浏览(404)

我们知道,在hadoop的shuffle阶段,每个reducer从Map器的所有输出(intermedia data)读取数据。
现在,我们还知道默认情况下,哈希分区用于reducer。
我的问题是:我们如何实现一个算法,例如,位置感知?

zed5wv10

zed5wv101#

总之,你不应该这样做。
首先,您无法控制Map器和reducer在集群上的执行位置,因此即使单个Map器的完整输出将转到单个reducer,它们也极有可能位于不同的主机上,并且数据将通过网络传输
第二,要使reducer处理Map器的整个输出,首先必须使Map器处理正确的部分信息,这意味着您必须通过分区对数据进行预处理,然后为每个分区运行单个Map器和单个reducer,但这种预处理本身会占用大量资源,因此基本上没有意义
最后,你为什么需要它?map-reduce的主要概念是使用键-值对进行操作,并且reducer通常应该聚合Map器为相同键输出的值列表。使用哈希分区的原因是:在k个缩减器之间分配n个键。使用不同类型的分区器是非常罕见的情况。例如,如果您需要数据局部性,您可能更喜欢使用mpp数据库而不是hadoop。
如果您真的需要自定义分区器,下面是一个如何实现它的示例:http://hadooptutorial.wikispaces.com/custom+partitioner. 没什么特别的,只是根据传递的键和值以及减速器的数量返回减速器的编号。使用主机名除以缩减器数量(%)的哈希代码将使单个Map器的整个输出转到单个缩减器。此外,还可以使用进程pid%的减速机数量。但在做这件事之前,你必须检查一下,你是否真的需要这种行为。

相关问题