hadoop - Hadoop-2.4.1自定义分区程序以平衡 reducer

标签 hadoop mapreduce shuffle reduce partition

众所周知,在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/

相关文章:

database - 如何通过Oozie工作流中的Hive Action删除Hive数据库?

hadoop - PigStorage多字节字段分隔符

node.js - 使用 Array 进行 MongoDB 正则表达式搜索

hadoop - 在映射器中创建和映射键值是不好的做法?

c++ - `std::shuffle` 是否保证不同 vector 上相同种子的相同顺序?

php - 在 foreach 中的第 3 个元素之后随机排列数组? PHP

python - 在 Pyspark-Cluster 模式下的工作节点上安装外部库

unix - 我该如何使其不互动?

hadoop - 如何以mapReduce方式建立Lucene索引?

python - 统一洗牌 5 GB 的 numpy 数据