众所周知,在hadoop的混洗阶段,每个化简器都会从所有映射器的输出中读取数据(中间数据)。
现在,我们也知道默认情况下,哈希分区用于 reducer 。
我的问题是:我们如何实现算法,例如位置感知?
最佳答案
简而言之,您不应该这样做。
首先,您无法控制在群集上执行映射器和简化器的位置,因此,即使单个映射器的完整输出将传递给单个简化器,也很有可能它们将位于不同的主机上,并且数据通过网络传输
其次,要使reducer处理整个mapper的输出,首先必须使mapper处理信息的正确部分,这意味着您必须通过对数据进行分区来对其进行预处理,然后针对该信息运行单个mapper和单个reducer每个分区,但是这种预处理本身会占用大量资源,因此几乎没有任何意义
最后,您为什么需要它? map-reduce的主要概念是使用键-值对进行操作,而reducer通常应汇总由映射器针对相同键输出的值列表。这就是使用哈希分区的原因:在 K 缩减器之间分配 N 键。很少使用其他类型的分区程序。例如,如果需要数据局部性,则可能更喜欢使用MPP数据库而不是Hadoop。
如果您确实需要自定义分区程序,请参见以下示例如何实现它:http://hadooptutorial.wikispaces.com/Custom+partitioner。没什么特别的,只是根据传递的键和值以及 reducer 的数量返回 reducer 的数量。使用主机名的哈希码除以(%)精简程序的数量,将使单个映射程序的整个输出进入单个精简程序。您也可以使用过程PID的 reducer 百分比。但是在执行此操作之前,您必须检查是否确实需要此行为。
关于hadoop - Hadoop-2.4.1自定义分区程序以平衡 reducer ,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26987284/