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