Hadoop如何跨多个数据节点分发数据和mapreduce任务

How Hadoop distribute data and mapreduce task across multiple data nodes

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

可能这个问题是愚蠢的或不寻常的,如果是这样的话,那就太抱歉了。 我的问题是,假设我在 hadoop 中为一个大小为 1 GB 的文件创建了一个字数统计程序,其中 map 函数将每一行作为输入和输出作为键值对,reduce 函数将接受输入 作为键值对并简单地迭代列表并计算单词在该文件中出现的总次数。

现在我的问题是,因为这个文件存储在跨多个数据节点的块中,并且 map-reduce 在每个数据节点上并行执行。假设我的文件存储在两个数据节点上,第一个数据节点上的文件包含单词 "hadoop" 5 次,第二个数据节点上的文件基本上包含单词 "hadoop" 7 times.So 整个 map reduce 过程的输出将是:

hadoop:7

hadoop:5

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

那么我将如何实现这一点,或者我是否遗漏了一些概念 here.Please 帮助我严重坚持这个概念,如果我无法让您理解我想问的问题,我感到非常抱歉。

我认为您完全忽略了 reducer 的概念,因为这正是它的功能,reducer 输入将是一个键(在本例中为 hadoop)和与该键关联的值列表(7 和 5),所以你的减速器程序将迭代值列表并进行求和,然后 hadoop,13.

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

基本上它所做的是,它打乱来自所有映射器的数据,并将具有相同键的行按排序顺序发送到相同的 reducer。因此,在您的情况下,hadoop 7hadoop 5 都将使用相同的减速器,将其缩减为 hadoop 12(不是 13!)

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