Google MapReduce有啥巧妙优化?

简介: 搞架构的人,Google的架构论文是必看的,但好像大家都不愿意去啃英文论文。故把自己的读书笔记,加入自己的思考,分享给大家。

搞架构的人,Google的架构论文是必看的,但好像大家都不愿意去啃英文论文。故把自己的读书笔记,加入自己的思考,分享给大家。

《MapReduce到底解决什么问题?》做了简介,这是第二篇,Google MapReduce优化启示(中)。

什么是MapReduce?

MapReduce这个编程模型解决什么问题?

Google MapReduce是Google产出的一个编程模型,同时Google也给出架构实现。它能够解决“能用分治法解决的问题”。

同时,前文以“统计大量文档中单词出现的个数”为例,例举了如何“先分再合”的撰写map与reduce来解决实际问题。

画外音,强烈建议回顾一下前情提要:

《MapReduce到底解决什么问题?》。

MapReduce的核心思路是:

  • 并行
  • 先分再合

下图简述了MR计算“词频统计”的过程。

image.png

从左到右四个部分,分别是:

输入文件

分:M个并行的map计算实例

合:R个并行的reduce计算实例

输出结果

先看最后一步,reduce输出最终结果。

image.png

可以看到,R个reduce实例并发进行处理,直接输出最后的计数结果。

实例1输出:(a, 256)(able, 128)(emacs, 1)

实例2输出:(f*ck, 32768) (coding, 65535)

实例3输出:(vim,65535)(x, 16)(zero, 258)

画外音:这就是总结果,可以看到vim比emacs受欢迎很多。

需要理解的是,由于这是业务计算的最终结果,一个单词的计数不会出现在两个实例里。即:如果(a, 256)出现在了实例1的输出里,就一定不会出现在其他实例的输出里。

画外音:否则的话,还需要合并,就不是最终结果了。

再看中间步骤,map到reduce的过程。

image.png

可以看到,M个map实例的输出,会作为R个reduce实例的输入。

潜在问题一:每个map都有可能输出(a, 1),而最终结果(a, 256)必须由一个reduce输出,那如何保证每个map输出的同一个key,落到同一个reduce上去呢?

这就是“分区函数”的作用。

什么是分区函数?

分区函数,是使用MapReduce的用户需所实现的,决定map输出的每一个key应当落到哪个reduce上的函数。

画外音:如果用户没有实现,会使用默认分区函数。

以词频统计的应用为例,分区函数可能是:

(1) 以[a-g]开头的key落到第一个reduce实例;

(2) 以[h-n]开头的key落到第二个reduce实例;

(3) 以[o-z]开头的key落到第三个reduce实例;

画外音:有点像数据库水平切分的“范围法”。

分区函数实现要点是什么?

为了保证每一个reduce实例都能够差不多时间结束工作任务,分区函数的实现要点是:尽量负载均衡。

画外音:即数据均匀分摊。

上述词频统计的分区函数,就不是负载均衡的,有些reduce实例处理的单词多,有些reduce处理的单词少,这样就可能出现,所有reduce实例都处理结束,最后等待一个长尾reduce的情况。

对于词频统计,负载更为均衡的分区函数为:

hash(key) % 3

画外音:有点像数据库水平切分的“哈希法”。

潜在问题二:每个map都有可能输出多个(a, 1),这样无形中增大了网络带宽资源,以及reduce的计算资源,有没有办法进行优化呢?

这就是“合并函数”的作用。

什么是合并函数?

有时,map产生的中间key的重复数据比重很大,可以提供给用户一个自定义函数,在一个map实例完成工作后,本地就做一次合并,这样网络传输与reduce计算资源都能节省很多。

合并函数在每个map任务结束前都会执行一次,一般来说,合并函数与reduce函数是一样的,区别是:

合并函数执行map实例本地数据合并

reduce函数执行最终的合并,会收集多个map实例的数据

对于词频统计应用,合并函数可以将:

一个map实例的多个(a, 1)合并成一个(a, $count)输出。

最后看第一个个步骤,输入文件到map的过程。

image.png

潜在问题三:如何确定文件到map的输入呢?

随意即可,只要负载均衡,均匀切分输入文件大小就行,不用管分到哪个map实例。

画外音:无论分到那个map都能正确处理。

结论

Google MapReduce实施了一系列的优化。

分区函数:保证不同map输出的相同key,落到同一个reduce里

合并函数:在map结束时,对相同key的多个输出做本地合并,节省总体资源

输入文件到map如何切分:随意,切分均匀就行

希望大家对MapReduce的优化思路有一个了解,思路比结论更重要。

image.png
架构师之路-分享可落地的技术文章

目录
相关文章
|
4月前
|
缓存 分布式计算 算法
优化Hadoop MapReduce性能的最佳实践
【8月更文第28天】Hadoop MapReduce是一个用于处理大规模数据集的软件框架,适用于分布式计算环境。虽然MapReduce框架本身具有很好的可扩展性和容错性,但在某些情况下,任务执行可能会因为各种原因导致性能瓶颈。本文将探讨如何通过调整配置参数和优化算法逻辑来提高MapReduce任务的效率。
638 0
|
7月前
|
机器学习/深度学习 分布式计算 监控
面经:MapReduce编程模型与优化策略详解
【4月更文挑战第10天】本文是关于MapReduce在大数据处理中的关键作用的博客摘要。作者分享了面试经验,强调了MapReduce的基本原理、Hadoop API、优化策略和应用场景。MapReduce包含Map和Reduce两个主要阶段,Map阶段处理输入数据生成中间键值对,Reduce阶段进行聚合计算。面试重点包括理解MapReduce工作流程、使用Hadoop API编写Map/Reduce函数、选择优化策略(如分区、Combiner和序列化)以及应用场景,如日志分析和机器学习。
157 2
|
数据采集 搜索推荐 安全
如何做好英文Google优化?
答案是:做足够多的GPB外链+足够多的优质内容。 理解目标受众 为了成功地进行英文Google优化,首先要深入了解您的目标受众。 这包括他们的搜索习惯、使用的关键词,以及他们在搜索结果中期待看到的内容。 选择合适的关键词 在Google优化中,关键词研究至关重要。 确保选择的关键词与您的内容高度相关,并具有适当的搜索量。 利用专业的关键词工具来为您的英文内容找到最佳关键词。
104 0
如何做好英文Google优化?
|
7月前
|
分布式计算
MapReduce【数据倾斜的优化】
MapReduce【数据倾斜的优化】
|
7月前
|
存储 分布式计算 自然语言处理
MapReduce【小文件的优化-Sequence文件】
MapReduce【小文件的优化-Sequence文件】
|
分布式计算 Java Hadoop
39 MAPREDUCE参数优化
39 MAPREDUCE参数优化
76 0
|
数据采集 安全 搜索推荐
如何选择优质的Google优化关键词?
答案是:选择竞争难度低且有一定流量的关键词。 在当下数字化市场竞争尤为激烈的背景下,选择合适的Google优化关键词无疑是提高网站排名和吸引流量的重中之重。 正确的关键词可以将你的目标用户精准地引导至你的网站,从而实现更高的转化率。 为此,以下提供了选择Google优化关键词的步骤和技巧。 了解你的目标受众 确定受众兴趣 首先,你需要明确你的目标受众,并了解他们在进行搜索时会使用哪些词汇。 这样,你可以找到与他们需求和兴趣相对应的关键词。
98 0
如何选择优质的Google优化关键词?
|
数据采集 搜索推荐 安全
英文网站该如何做站内Google优化?
答案是:英文SEO可以持续建设GPB外链+优质内容可提升排名。 优化内容质量 编写原创和高质量的内容 Google优化中,内容是王道。 确保您的网站内容是原创的,有价值的,并且是针对目标受众的。 优秀的内容不仅可以提升用户体验,也会被搜索引擎更好的认可。 使用适当的标题和子标题 标题和子标题不仅可以使内容更易读,还有助于Google更好的理解您的内容。 确保每个页面都有一个独特且相关的标题,子标题也要能准确反映内容的主题。
83 0
英文网站该如何做站内Google优化?
|
数据采集 搜索推荐 UED
外贸做Google优化效果明显吗?
答案是:肯定的!效果非常明显! Google优化的概念和重要性 什么是Google优化 Google优化是一种通过优化网站和提升其在线可见性来提升其在Google搜索引擎结果中的排名。 这包括了关键词研究、网站设计的优化、内容的优化以及链接建设等活动。 为什么Google优化是重要的 Google优化对于提升网站的搜索引擎排名、增加网站流量、提高品牌的知名度和信誉度以及提升转化率都具有重要的作用。
106 0
外贸做Google优化效果明显吗?
|
缓存 分布式计算 调度
MapReduce 优化经验
MapReduce 优化经验
135 0
下一篇
DataWorks