hadoop - MapReduce 中的 map worker 如何分区文件与中间值?

标签 hadoop mapreduce partitioning partitioner

我正在尝试理解 MapReduce 模型,我需要建议,因为我不确定如何使用 map 函数的中间结果对文件进行排序和分区。我从 MapReduce papers of Jeffrey Dean & Sanjay Ghemawat 获得的关于 MapReduce 的最多知识并来自 Hadoop:权威指南。

具有map函数中间结果的文件是小型排序和分区文件的组合。这些小文件被划分为对应于reduce worker的partition。然后将小文件合并为一个文件。我需要知道小文件的分区是如何完成的。首先,我认为每个分区都有一定范围的键。

例如:如果我们在 <1;100> 范围内将键作为整数,并且文件分为三个分区,那么第一个分区可以由键在 <1,33> 范围内的值组成,第二个分区可以由键在 <1,33> 范围内的值组成34;66> 和第三分区 <67;100>。合并文件中也有相同的分区。

但我不确定。每个分区都被发送到相应的reduce worker。在我们的示例中,如果我们有两个 reduce 工作人员,则可以将具有前两个键范围(<1,33> 和 <34;66>)的分区发送给第一个工作人员,将最后一个分区发送给第三个工作人员。但是,如果我错了并且文件以另一种方式划分(我的意思是分区没有自己的可能键范围),那么每个 reduce 工作人员都可以得到相同键的结果。所以我需要以某种方式合并这些减少 worker 的结果,对吗?我可以将这些结果发送到主节点并在那里合并吗?

简而言之:我需要解释 map 阶段的文件是如何划分的(如果我的描述是错误的),并解释我如何以及在哪里可以处理 reduce 工作人员的结果。

我希望我描述了我的问题足以理解。当然,我可以解释更多。

非常感谢你的回答。

最佳答案

有一个 Partitioner 类可以做到这一点。中间文件中的每个键/值对与归约器(分区)的总数一起传递给分区器,分区器返回应该处理该特定键/值对的分区号。

有一个默认的分区程序可以很好地完成分区工作,但是如果您想要更好的控制或者如果您有一个特殊格式化(例如复杂)的 key ,那么您可以并且应该编写自己的分区程序。

关于hadoop - MapReduce 中的 map worker 如何分区文件与中间值?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12786376/

相关文章:

javascript - CouchDB 有向无环图 (DAG)

java - 用于 hadoop mapreduce 的 jar

hadoop - 如何删除 Hive 中每个节点的分区限制?

hive - Hive 中的偏斜与分区

java - 在Spark Java API中联接行数据集

hadoop - 运行 yarn jar 命令时更改 tmp 目录

javascript - mongodb获取最古老的动物map/reduce

r - 如何在R中根据网格索引坐标数据?

hadoop - 用于多个文件相关性的Oozie协调器配置

hadoop - 避免以编程方式使用创建的上下文启动 HiveThriftServer2