正如我们所知道的,在hadoop的洗牌阶段,每个还原器都从映射器的所有输出(中间媒体数据)中读取数据。
现在,我们还知道,在默认情况下,哈希分区用于还原器。
我的问题是:我们如何实现一个算法,例如,位置感知?
发布于 2014-11-18 10:13:45
总之,你不应该这么做。
首先,您无法控制映射器和减法器在集群上的执行位置,因此,即使单个映射器的全部输出将转到单个减法器上,它们在不同主机上的可能性也很大,并且数据将通过网络传输。
第二,要使还原程序处理映射器的整个输出,首先必须使映射程序处理信息的正确部分,这意味着您必须通过对数据进行分区预处理,然后为每个分区运行一个映射程序和一个还原程序,但是这个预处理本身将占用大量的资源,因此它基本上是没有意义的。
最后,你为什么需要它?映射约简的主要概念是使用键值对进行操作,还原器一般应该聚合映射器为相同键输出的值的列表。下面是使用哈希分区的原因:在K减缩器之间分配N键。使用不同类型的除法器是非常罕见的情况。例如,如果您需要数据局部性,您可能更喜欢使用MPP数据库而不是Hadoop。
如果您确实需要一个自定义分区器,下面是如何实现它的一个示例:http://hadooptutorial.wikispaces.com/Custom+partitioner。没有什么特别之处,只需返回减速机编号根据键和值传递和减速器的数量。使用主机名的散列代码除以减法器的数量(%)将使单个映射器的全部输出转到单个减法器上。此外,您还可以使用进程PID %的减速器数量。但在做这件事之前,你必须检查一下,你是否真的需要这样的行为。
https://stackoverflow.com/questions/26987284
复制相似问题