Google MapReduce到底解决什么问题?
搞架构的人,Google的架构论文是必看的,但好像大家都不愿意去啃英文论文。故把自己的读书笔记,加入自己的思考,分享给大家。
第二篇,Google MapReduce架构启示(上)。
很多时候,定义清楚问题比解决问题更难。
什么是MapReduce?
它不是一个产品,而是一种解决问题的思路,它有多个工程实现,Google在论文中也给出了它自己的工程架构实现。
MapReduce这个编程模型解决什么问题?
能够用分治法解决的问题,例如:
● 索引倒排
● 查询请求汇总
● …
画外音:能够发现,现实中有许多基于分治的应用需求。
为什么是Google,发明了这个模型?
Google网页抓取,分析,倒排的多个应用场景,当时的技术体系,解决不了Google大数据量高并发量的需求,Google被迫进行技术创新,思考出了这个模型。
画外音:谁痛谁想办法。
为什么MapReduce对“能够用分治法解决的问题”特别有效?
分治法,是将一个大规模的问题,分解成多个小规模的问题(分),多个小规模问题解决,再统筹小问题的解(合),就能够解决大规模的问题。
画外音:分治法详见《分治法与减治法》。
Google MapReduce为什么能够成功?
Google为了方便用户使用系统,提供给了用户很少的接口,去解决复杂的问题。
(1) Map函数接口:处理一个基于key/value(后简称kv)的成对(pair)数据集合,同时也输出基于kv的数据集合;
(2) Reduce函数接口:用来合并Map输出的kv数据集合;
画外音:MapReduce系统架构,能在大规模普通PC集群上实现并行处理,和GFS等典型的互联网架构类似。
用户仅仅关注少量接口,不用关心并行、容错、数据分布、负载均衡等细节,又能够解决很多实际的问题,还有这等好事!
能不能举一个例子,说明下MapReduce的Map函数与Reduce函数是如何解决实际问题的?
举例:假设要统计大量文档中单词出现的个数。
Map
输入KV:pair(文档名称,文档内容)
输出KV:pair(单词,1)
画外音:一个单词出现一次,就输出一个1。
Reduce
输入KV:pair(单词,1)
输入KV:pair(单词,总计数)
以下是一段伪代码,
Map(list<pair($doc_name, $doc_content)>){
foreach(pair in list)
foreach($word in $doc_content)
echo pair($word, 1); // 输出list<k,v>
}
画外音:如果有多个Map进程,输入可以是一个pair,不是一个list。
Reduce(list<pair($word, $count)>){// 大量(单词,1)
map<string,int> result;
foreach(pair in list)
result[$word] += $count;
foreach($keyin result)
echo pair($key, result[$key]); // 输出list<k,v>
}
画外音:即使有多个Reduce进程,输入也是list<pair>,因为它的输入是Map的输出。
最早在单机的体系下计算,输入数据量巨大的时候,处理很慢。如何能够在短时间内完成处理,很容易想到的思路是,将这些计算分布在成百上千的主机上,但此时,会遇到各种复杂的问题,例如:
● 并行计算● 数据分发
● 错误处理
● 集群通讯
● …
这些综合到一起,就成为了一个困难的问题,这也是Google MapReduce工程架构要解决的问题,也就是下一章将要分享的问题,敬请期待。
思路比结论更重要。
原文发布时间为:2018-11-29
本文作者: 58沈剑
关注公众号
低调大师中文资讯倾力打造互联网数据资讯、行业资源、电子商务、移动互联网、网络营销平台。
持续更新报道IT业界、互联网、市场资讯、驱动更新,是最及时权威的产业资讯及硬件资讯报道平台。
转载内容版权归作者及来源网站所有,本站原创内容转载请注明来源。
-
上一篇
Spark基本的RDD算子之groupBy,groupByKey,mapValues
1.groupby def groupBy[K: ClassTag](f: T => K): RDD[(K, Iterable[T])] def groupBy[K: ClassTag](f: T => K, numPartitions: Int): RDD[(K, Iterable[T])] def groupBy[K: ClassTag](f: T => K, p: Partitioner): RDD[(K, Iterable[T])] groupBy算子接收一个函数,这个函数返回的值作为key,然后通过这个key来对里面的元素进行分组。 val a = sc.parallelize(1 to 9, 3) a.groupBy(x => { if (x % 2 == 0) "even" else "odd" }).collect //返回的even或者odd字符串作为key来group RDD里面的值, res42: Array[(String, Seq[Int])] = Array((even,ArrayBuffer(2, 4, 6, 8)), (odd,A...
-
下一篇
求职 | 一份理想的数据科学家简历中要包括哪些技能?
如果你是一名数据科学方面的求职者,你肯定想知道在简历上写些什么才能获得面试的机会;如果你想进入这个领域,你一定想知道具备哪些技术才能成为一名有竞争力的求职者。 在本文中,我们对美国求职网站 Indeed 中一千份数据科学相关的招聘信息进行了分析,主要针对数据工程师、数据科学家和机器学习工程师这三个职位,希望能解答你的疑问。 首先,让我们来看看不同职位的技能要求。 一、必备语言 1. Python 是数据科学家的首选语言 关于数据科学中的首选语言究竟是Python还是R曾有过争论。显然,根据市场需求,如今处于主导地位是Python。同样值得注意的是,从语言需求的排名来看,R语言可能还排在SAS之后。因此,如果你打算进入数据科学领域,不妨把学习重点放在Python上。作为数据库语言,SQL是数据科学家第二重要的语言。由于数据科学家职业的广泛性,其他语言也扮演着重要角色。 数据科学家必备语言排名为:Python、SQL、Scala、Lua、Java、SAS、R、C ++和Matlab。 2. 机器学习工程师使用的语言更加多样化 Python是机器学习工程师的首选语言,这并不令人惊讶。机器学习...
相关文章
文章评论
共有0条评论来说两句吧...

微信收款码
支付宝收款码