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工程架构要解决的问题
内容来源: 58沈剑 架构师之路
最新文章
- C# mysql 获取所有表名
- Hadoop中客户端和服务器端的方法调用过程
- Codeforce Round #225 Div2
- Git的status命令
- 蒙特卡洛法计算定积分—Importance Sampling
- EF异常:WebForm、Console、Winform层不引入EF报错
- 如何配置svn服务器
- Android布局详解之一:FrameLayout
- 用jQuery 处理XML-- jQuery与XML
- wifi配置常用命令总结
- (转载)[FFmpeg]使用ffmpeg从各种视频文件中直接截取视频图片
- Mac开机黑屏解决办法
- Eclipse中查找接口实现类快捷键
- STM32 定时器用于外部脉冲计数(转)
- Linux下httpd服务与Apache服务的查看和启动
- VUE父子组件传值问题
- C语言 左值、右值
- Win下Jenkins-2.138源码编译及填坑笔记
- js中字符替换函数String.replace()使用技巧
- idea 报错 :error:java:Compilation failed:internal java compiler error