map-reduce 是如何工作的……我做对了吗?

Posted

技术标签:

【中文标题】map-reduce 是如何工作的……我做对了吗?【英文标题】:How does map-reduce work..Did i get it right? 【发布时间】:2018-03-06 14:33:28 【问题描述】:

我试图了解 map-reduce 的实际工作原理。请阅读我在下面写的内容,并告诉我这里是否有任何遗漏或不正确的东西。 谢谢你。

数据首先被分割成所谓的输入分割(这是一种逻辑类型的组,我们将其大小定义为记录处理的需要)。 然后,每个输入拆分都有一个 Mapper,它获取每个输入拆分并按键和值对其进行排序。 然后,有一个洗牌过程,它从映射器(键值)中获取所有数据并将所有相同的键与其值合并(输出它是所有键及其值列表)。洗牌过程的发生是为了给 reducer 输入一个 1 的键,用于每种类型的键及其总和值。 然后,Reducer 将所有键值合并到一个地方(可能是页面?),这是 MapReduce 过程的最终结果。 我们只需要确保定义 Map(它总是给出键值的输出)和 Reduce(最终结果 - 获取输入的键值,并且可以是 count、sum、avg 等)步骤代码。

【问题讨论】:

您愿意编辑您的问题以展示您的尝试吗? @Ryan Morton ,我实际上只是想理解这个概念。我看过一个关于计算单词的例子并阅读了一些文章,所以我想确保我得到的一切都是正确的。(我是大数据的新手,hadoop 等)。 【参考方案1】:

您的理解略有错误,特别是映射器的工作原理。 我got a very nice pictorial image简单解释一下

它类似于wordcount 程序,其中

每包巧克力都是InputSplit,由映射器处理。所以我们有 3 个捆绑包。 每一块巧克力都是一个词。一个或多个单词(造句)是单个映射器的记录输入。因此,在一个inputsplit 内,可能有多个records,每个record 都输入到单个mapper

mapper计数每个word(巧克力)的出现并吐出计数。请注意,每个映射器都只处理一个line(记录)。完成后,它会从inputsplit 中选择下一个record。 (图片中的第二阶段)

一旦map 阶段完成,sortingshuffling 就会发生bucket 相同的巧克力计数。 (图片中的第三阶段)

一个reducer得到一个bucket,键为name of the chocolate(或word)和一个list计数。因此,在整个输入文件中,reducer 的数量与不同的单词数量一样多。 reducer 遍历计数并将它们相加以产生最终计数并针对单词发出。

下图显示了wordcount 中的一个inputsplit 程序的工作原理:

【讨论】:

那么输入拆分只是要减少映射的数据的一部分吗?这意味着每次我对某些数据进行 map reduce 时,可能会有多个输入拆分?考虑到映射器只关心记录的数量,它对我有什么帮助有多个输入拆分.. 是的,在实际场景中;将有超过 1 个inputsplit。默认情况下,HDFS 将文件分成 256MB 的块(1 GB = 4 个块)。这一个block以inputsplit的形式输入到一个mapper(但这并不意味着block和inputsplit相同)。您需要了解blocksizeinputsplit 以及在mapreduce 中是如何处理的。 我想我现在明白了。我们使用这种称为输入拆分的逻辑大小来确定块的边界,因为块中可能有一半的记录。谢谢老哥! 是的,你没看错。如果有帮助,请为答案投票。 已经做到了。因为我是该网站的新手,所以它说没有显示赞成票,但它仍然算作赞成票。【参考方案2】:

类似的质量检查 - Simple explanation of MapReduce?

另外,这篇文章以非常简单的方式解释了 Hadoop - HDFS 和 Mapreduce https://content.pivotal.io/blog/demystifying-apache-hadoop-in-5-pictures

【讨论】:

以上是关于map-reduce 是如何工作的……我做对了吗?的主要内容,如果未能解决你的问题,请参考以下文章

REST API + hacks/REST + RPC 混合。我做对了吗?

django ModelForms - 我做对了吗?

Rails:has_many 通过关联 - 我做对了吗?

map-reduce 如何在 HDFS 与 S3 上工作?

三个月斩获阿里offer,我做对了哪些事情

毕业五年,年薪百万,只因我做对了这些事!!(建议收藏)