java - Hadoop如何在多个数据节点之间分配数据和Mapreduce任务

标签 java hadoop mapreduce hdfs

我是hadoop的新手,并且阅读了很多页面的hadoop mapreduce和hdfs,但仍然无法清除一个概念。

如果是这样的话,那么这个问题可能是愚蠢的或毫无用处的。
我的问题是,假设我已经在hadoop中为文件大小为1 GB的文件创建了一个单词计数程序,其中map函数将每一行作为输入并输出为键值对,而reduce函数将接受输入
作为键值对,并简单地迭代列表并计算单词进入该文件的总次数。

现在我的问题是,由于此文件存储在多个数据节点中的块中,并且map-reduce在每个数据节点上并行执行。说我的文件存储在两个数据节点上,第一个数据节点上的文件包含单词“hadoop” 5次,第二个数据节点上的文件包含单词“hadoop” 7次。
整个 map 缩小过程的输出为:

Hadoop:7

Hadoop:5

因为在2个不同的数据节点上并行执行2个map-reduce函数,
但是输出应该是两个文件上“hadoop”字数的总和,即:
Hadoop:13

因此,我将如何实现这一目标,或者我是否在这里缺少一些概念。请帮助我,我对这个概念一无所知,如果无法让您理解我要问的问题,我深感抱歉。

最佳答案

您可能已经阅读了Hadoop Mapreduce和HDFS的许多页面,但是您似乎错过了包含Map之后和Reduce之前的阶段(即Shuffle和Sort)的页面。

基本上,它是从所有映射器中清除数据,然后将具有相同键的行按排序顺序发送到相同的reducer。因此,在您的情况下,hadoop 7hadoop 5都将使用相同的reducer,这会将其缩减为hadoop 12(不是13!)

您可以在网络上轻松获得有关随机播放和排序的更多信息。您可以阅读questions like this too

关于java - Hadoop如何在多个数据节点之间分配数据和Mapreduce任务,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45664548/

相关文章:

java - 接受并返回相同类型的通用函数接口(interface)

hadoop - 在 Hive 中执行任何查询时,有什么方法可以获取列名和输出吗?

hadoop - Reducer 不选择 mapper 输出文件

hadoop - 有关 map 减少的概念性问题

hadoop - Hadoop 上的 MRJob 和 mapreduce 任务分区

java - 数据写入错误

java - 如何在java中使用CommandLineJobRunner构建多个集成测试用例

hadoop - 配置单元未通过 “where”子句运行Map Reduce

java - 如何从命令行将 VM 参数传递给 gradle?

hadoop - 启动新安装的 Hive/Hadoop 时出错