Hadoop-2.4.1 自定义分区程序来平衡化简器



我们知道,在hadoop的随机阶段,每个化简器从所有映射器的输出(中间数据)中读取数据。

现在,我们也知道默认情况下哈希分区用于化简器。

我的问题是:我们如何实现算法,例如位置感知算法?

简而言之,你不应该这样做。

首先,您无法控制映射器和化简器

在集群上的执行位置,因此即使单个映射器的完整输出将转到单个化简器,它们也很有可能位于不同的主机上,并且数据将通过网络传输。

其次,要使化简器处理映射器

的全部输出,首先必须使化简器处理信息的正确部分,这意味着您必须通过对数据进行分区来预处理数据,然后为每个分区运行单个映射器和单个化简器,但是这种预处理本身会占用大量资源,因此它基本上毫无意义

最后,你为什么需要它?map-reduce 的主要概念是使用键值对进行操作,而化简器通常应该聚合映射器为相同键输出的值列表。以下是使用哈希分区的原因:在 K 个化简器之间分配 N 个密钥。使用不同类型的分区程序是非常罕见的情况。例如,如果您需要数据局部性,您可能更喜欢使用MPP数据库而不是Hadoop。

如果您确实需要自定义分区程序,下面是如何实现它的示例:http://hadooptutorial.wikispaces.com/Custom+partitioner。没什么特别的,只是根据传递的键和值以及化简器的数量返回化简器编号。使用主机名的哈希码除以 (%) 除以化简器的数量将使单个映射器的整个输出转到单个化简器。此外,您还可以使用过程 PID % 的化简器数量。但在这样做之前,你必须检查你是否真的需要这种行为。

相关内容

  • 没有找到相关文章

最新更新