06 | MapReduce(一):源起Unix的设计思想
徐文浩
你好,我是徐文浩。
在解读完 GFS 的论文之后,相信你现在对“分布式系统”已经有了初步的了解。本质上,GFS 是对上千台服务器、上万块硬盘的硬件做了一个封装,让 GFS 的使用者可以把 GFS 当成一块硬盘来使用。
通过 GFS 客户端,无论你是要读还是写海量的数据,你都不需要去操心这些数据最终要存储到哪一台服务器或者哪一块硬盘上。你也不需要担心哪一台服务器的网线可能松了,哪一块硬盘可能坏了,这些问题都由 GFS 这个“分布式系统”去考虑解决了。
不过,GFS 仅仅是解决了数据存储和读写的问题。要知道,只是把数据读出来和写回去,只能做做数据备份,这可解决不了什么具体、有意义的问题。所幸,在 GFS 这个分布式文件系统之上,谷歌又在 2004 年发表了 MapReduce 的论文,也就是一个分布式计算的框架。
那么,我们今天就一起来看看,MapReduce 到底是要解决什么样的问题。而要解决这些问题的系统,又应该要怎么设计。
当你仔细了解 MapReduce 的框架之后,你会发现 MapReduce 的设计哲学和 Unix 是一样的,叫做“Do one thing, and do it well”,也就是每个模块只做一件事情,但是把这件事情彻底做好。
在学完这两讲之后,你不仅应该了解什么是 MapReduce,MapReduce 是怎么设计的。更重要的是理解如何对系统进行抽象并做出合理的设计。在未来你自己进行系统设计的时候,为各个模块划分好职责和边界,把“Do one thing, and do it well”落到实处。
公开
同步至部落
取消
完成
0/2000
荧光笔
直线
曲线
笔记
复制
AI
- 深入了解
- 翻译
- 解释
- 总结
MapReduce是一个分布式计算框架,旨在解决海量数据处理问题。文章首先介绍了GFS和MapReduce的关系,指出GFS解决了数据存储和读写的问题,而MapReduce则是在GFS之上提供了分布式计算的能力。作者强调了MapReduce的设计理念与Unix相似,都是“Do one thing, and do it well”,即每个模块只做一件事情,但是把这件事情彻底做好。其次,文章强调了分布式系统的首要目标是让开发人员不需要了解分布式知识,只需专注于业务逻辑代码的编写。MapReduce的设计理念围绕着这一核心点展开,包括计算模型和应用场景、实现方式以及性能优化。MapReduce的编程模型非常简单,开发者只需实现Map和Reduce函数,而整个数据处理流程由MapReduce框架自动完成。文章通过对Map和Reduce函数的解释,以及与设计模式的对比,展示了MapReduce框架的简洁性和高效性。文章总结了MapReduce的核心思想和设计原则,为读者提供了对分布式计算框架的深入了解。MapReduce的应用场景包括分布式grep、统计URL的访问频次等,展示了其在实际应用中的灵活性和强大功能。整体而言,MapReduce框架以其简单、高效的设计理念和丰富的应用场景,为海量数据处理提供了一种可靠的解决方案。
仅可试看部分内容,如需阅读全部内容,请付费购买文章所属专栏
《大数据经典论文解读》,新⼈⾸单¥59
《大数据经典论文解读》,新⼈⾸单¥59
立即购买
© 版权归极客邦科技所有,未经许可不得传播售卖。 页面已增加防盗追踪,如有侵权极客邦将依法追究其法律责任。
登录 后留言
全部留言(12)
- 最新
- 精选
- 在路上徐老师好,晚上试着读了下MapReduce的论文,比GFS的论文要简单很多。 问题一,如何按照域名统计访问频率?只需要把原来Map函数的输出从List<URL, “”>,变成List<domainName(URL), “”>。 问题二,如何按照访问人数对统计结构排序?假如还是统计URL的访问情况,Map函数的输出为List<URL, USER_ID>,Reduce函数对USER_ID去重,获得每个URL的访问人数。Reduce程序存在k个,不同的URL通过哈希取模的方式,也就是hash(URL) % k,分配给不同的Reduce排序。通常我们不是关心所有数据的排行情况,而是前N名的排行情况,假设N等于10000。所以每个Reduce函数只排前10000名,然后通过另一个MapReduce程序,将k个Reduce的排行结果汇总,得到全局的前10000名排行结果。
作者回复: 第一个问题没有问题。但是第二个问题有一个挑战,就是在 “Reduce” 函数去重这里,具体怎么去重呢? 因为如果用户数量足够多,我们会遇到一种情况就是Reduce用内存来进行去重内存可能不够用,再想想。
2021-10-024 - 那时刻第二个问题,URL 访问统计结果要按访问的人数多少从高到底排序。为了减少Reduce 函数去重的时候,用户数据量比较大的问题。可以通过两次map reduce操作来减少这个数据量。 1. map以(URL+UserId, 1) 作为输出,表示某个url被某个user访问过一次,reduce输出则是 (URL+UserId, 1),通过这个过程来去重用户量过大的问题。 2. 输入是过程1的结果,map的输出是(URL,1),reduce的输出则是(URL,sum())表示该url被访问的人数。按照访问的人数多少从高到底排序,输出URL即可。 如果数据量少的话,bash也可以,`cat $input | awk '{print $1" "$2}' | sort | uniq -c | awk '{print $1}' | sort | uniq -c `2021-10-03110
- webmin看到MapReduce我就会不自主的映射为递归,Map是递的过程,一路向下进行切分,Reduce是归触底向上一路进行收集。 思考题: 第二个问题与网上流传的在单机上2GB内存排序10GB大小文件的题目类似,需要通过分桶缩小每次处理的大小,按Count数划分区间,每个区间一个文件,然后再对每一个区间进行排序,最后把文件按区间顺序连在一起。这种处理过程好似快排算法,用快排来划分区间每次把数据落地进文件。2021-10-036
- Helios请问老师,如果所有map出来数据依然很大,在清洗的过程中的排序是磁盘操作么,是map输出到gfs然后清洗进程从gfs拷贝到磁盘么?如果数据过于大,是不是清洗也需要多台机器呢,他们之间如何沟通呢2021-10-2722
- 陈迪尝试回答下思考题: 1. 按域名统计:partition函数嵌一个获取domain的方法,论文中有描述 2. 统计结果排序:看上去写两个MapReduce Job比较清楚。第一个就是统计数量,第二个专门做排序。主要是利用shuffle之后,reduce任务会对本机的全局<key, lists>按key排序。2021-10-062
- qinsi想到个有些复杂的方法: 第一轮:map输出<URL+USER_ID, ''>,reduce时对value计数,可以得出每个url被每个用户访问了多少次<URL+USER_ID, visitsByUser> 第二轮:map的时候只取key中的URL部分,输出<URL, visitsByUser>,reduce时对value计数得到访问人数,把value相加得到访问频次,输出<URL, [visits, totalVisits]> 第三轮:map的时候把访问人数visits作为key,输出<visits, [URL, totalVisits]>。如果shuffle是按照key的大小shuffle的话,reduce原样输出应该就是排好序的结果了。2021-10-0222
- Geek_980dedMapReduce过程可以理解成一群人统计选票的过程,假设有候选人A和候选人B,首先从选票箱里拿出所有的选票,分给所有初统人员,每个初统人员拿其中一摞,只要统计这一小部分中A的选票数是多少,B的选票数多少,然后把这个结果交给汇总人员。两个汇总人员分别负责合计A和B的选票。2023-06-18归属地:上海
- Pluto第二个问题: 第一轮: map的输出是 <url + user, ''>, reduce去重得到 <url + user, ''> 第二轮: map不做处理, 输出 <url, user>, reduced得到 <url, sum> (sum 就是把 的value 相加即可) 第三轮: map输入 <url, sum>, 输出 <sum, url>,(数目应该是大大降低了,边界是所有url都被访问一次),key 如果是排序的,用单一的Reduce即可2022-08-23归属地:浙江
- Chloe对课后思考题,我的第一感觉是要把问题划分为小的模块,然后逐个解决。正好翻出了Design Pattern的书,看看5.10节,再回来讲感想。2022-06-04
- 核桃现在很多人说hadoop已经快凉了~2021-11-19
收起评论