当前课程知识点:大数据系统基础 > 4. 处理框架 > 授课视频 > 4.7MapReduce总结
下面我们总结一下
刚才谈到的
MapReduce的一些内容
MapReduce的核心思想
是以下几个
一个是数据并行
这个数据是可以
切分成很多块的
块和块之间是无关的
它是或者叫独立的
independent
那么我们需要做的
就是针对每一块
调用Map或者Reduce
所以它可以并行
这叫数据并行
如果Map和Map之间
或者Reduce和Reduce之间需要通讯
那这种模型
它就不适于做MapReduce
这个大家要理解
MapReduce只能适用于
一系列的工作
那么就是数据和数据之间
是可以切分的
那什么东西是不可以切分的
比如后边我们会讲到
很多的机器学习的任务
那个数据它不是说
我单个的看数据
就能解决任何问题的
它可能要把很多的数据
放在一起看
而且这些数据
并没有一些的明显的
可以切分开的
就是所有的数据都搁在一起看
才能够得到一些结果
这样的算法在MapReduce上
就没有一个非常简单的事情
第二点操作必须是确定性的
就像刚才说的
如果它是里头有个随机数
那你除非你知道
这个随机数不会
对自己最后的结果产生影响
否则它是不适于MapReduce的
否则它可能结果会出问题
第三个操作必须是
Idempotent的或者叫幂等的
且是没有副作用的
如果你这操作
做完了之后
你改写了一个其它的文件
你这个磁盘不在
MapReduce控制的文件
那MapReduce系统帮不了你
但是MapReduce
如果你按照它的方法
来写这个Map和Reduce
因为它是一个函数式变程
函数式变程跟函数
是没有副作用的
还没有改一个
程序变量之类的事情
因此这种情况下
MapReduce系统可以保证
每一个操作都是幂等的
所以这样的话
它才能保证
它最大的运行的效率
第四个我们不要任何时间
都做很多小的通讯
我们一定要把通讯集中起来做
那么在MapReduce当中
它是shuffle的过程中
才有通讯
当然我们不算
它读文件系统的一些通讯
操作的所有的存储
都是在硬盘上的
MapReduce是一个
基于磁盘的计算
这次以最大限度地
保证MapReduce可以
在比较小的内存的机器上运行
能够充分地利用CPU的资源
而且它写那写磁盘的时候
它对磁盘的调度
是非常的好的
它只是在磁盘上顺序的写
它没有一些任何的随机的东西
包括它的排序什么的
都是紧啊
基于磁盘的排序
这些保证一个机器机身
内存即使不是那么大
也可以扩展到一个
比较大的数据的规模
那么MapReduce
被用来做什么
其实说实话
现在什么都是用MapReduce
MapReduce早期
在Google发明MapReduce的时候
主要是为了建立索引
因为Google要在
对世界上所有的网页
然后抓取下来建立
一个倒排表这个索引
它是用MapReduce来建立的
显然这个索引
不可能在一台机器来算
而且Google建立索引的速度
是要求越来越高
过去大家每个星期
大家新的网页增加进去的
就不错了
现在如果你不能够
在半天几个小时之内
增加进去那么你的
搜索引擎要落后了
所以现在对索引的
建立一个要求越来越高
对整个的处理的速度
总体的处理速度
要求越来越高
所以现在Google也慢慢的
在离开MapReduce架构
采取一些更加实时的架构来
更新这个索引
但是早期Google使用
MapReduce来建立索引的
对一些文章还以及工作
还是用它进行
一些文本的搜索
比如说一些文章的句类
一些统计性的信息翻译等等
这一系列文本的分析
这都是MapReduce来做的
yahoo测试
yahoo做MapReduce的原因
也是因为它需要建立索引
以及它需要对文本进行分析
比如说做垃圾邮件的过滤
yahoo的邮箱
是跟网易邮箱一样
它实际上是一个非常大的
一个邮箱的提供商
那么它每天收到邮件那么多
它到底哪些是垃圾邮件
这个需要一个庞大的
一个处理的框架
才能够处理出这个
当前垃圾邮件的模型来
那facebook也一样
数据挖掘 广告优化 垃圾检测
这一系列的东西
它实际上都是一系列的
后台运行的一些程序
这些程序并不是
一个交互式的或者实时的
但是它会分析一大堆的数据
然后来得到一个模型
这个模型可以被用来
做一些个实施和交互性的操作
那么MapReduce的优点是什么
首先它是对用户来说
它是完全是一个用户熟悉的写法
就写了一个Map方程
和一个Reduce的方程
着两个函数
你写单机的程序也是这样写
所以完全没有任何一点
你涉及到了分布式编程
你涉及到线程的同步
你涉及到了锁的问题
这些复杂的事情没有
所以一般的程序员
可以写MapReduce
当然它还是要写点程序的
这个事情我们后面再说
它有自动的容错性
不用考虑到分布式系统内
各种各样奇妙的这个失败的道理
这个程序
crush的这个集成crush
不用考虑这些
它有自动的容错
它有自动的规模放缩
你今天用两台机器
跑了个MapReduce
去实验一下
明天你需要跑2000台机器
你就改一个falsh的时候跑了
一共有多少台机器
一共切成多少个MAP
就在几千个机器上跑了
什么程序都不用改
这个非常的漂亮
以及最后是自动的负载均衡
包括慢的任务啊
包括有些任务块
但是由于你把Map切的足够小
你把沙子粒做的足够小
所以它还是在各个机器上
它还是能够放的很平的
所以这就是一种负载均衡的策略
你负载均衡了
那么集群的使用率也高了
集群使用率高了
那么你处理每一个back的数据
所花的钱也少了
所以这个也是一个经济型的体现
但是MapReduce也有它的
不可避免的一些问题
比如说第一个
就是它这个数据流的定义
是非常非常的狭窄的
就限制性非常的强
它必须是一个Map
跟着一个Reduce
那么甚至于这个
非常令人发指的事
你比如说你的Map什么都没有做
那么它专门MapReduce
一个库函数叫
indentmapreduce
那么就是你把
一个(00:05:44)输入进去
再直降输出出去
它还是一模一样的
但是它还是要在
整个磁盘里导一下
它是为了让它能够
直接进它那个架构来处理
那这个是非常的麻烦的
再一个大家想
做一次Map再做一次Reduce
实际上它真的处理不了
太多的信息
所以随便一个
比如说
Google建立一个索引的MapReduce
那都是无数多个MapReduce
照顾连接起来的
这种情况下
你写无数的多个MapReduce
正好配个东西
对一般的程序来讲
它也是搞不太清晰的
到底你从哪个数据集
变化成了哪个数据集
然后最后哪个数据集又变成
几个数据集合成起来变成一个
所以这种情况下
也是不容易实现的
而且这种情况会导致了很多
无用的操作
比如说一个数据集
像这个操作
比如说像split的这种操作
一个数据集竟输出两个结果
但显然一个Reduce
只能输出一个结果
所以最后就要考虑
两次MapReduce
那么你要扫描量两次这个数据集
你要考虑到大数据的
数据集是很大的
比如说这一个数据集
是一个(00:06:41)bait
那么就1000个T
那1000T你需要扫描很久
但是你需要非要扫描两次
只是为了输出两个不同的结果
所以像这种东西也不容易实现
像这种说我只需要Map
我需要多个Map
然后我再做一次Reduce
这个如果你只用MapReduce
实际上的话那你必须
要不然你就手工
把两个Map函数合并在一起
这个东西是一个不结构化的
就是你的copypastecode
一个Map函数
实际上是执行两件事
另外或者是你只能
再加一个Reduce
就像刚才说的
你做了MapReduce之后
它要写回到磁盘了
所以它又多写了一次磁盘
那万一要是一个
(00:07:16)bait数据
你就多写了很多很多数据
所以它整个的
这种数据流的表现形式
它是不容易实现的
这是第一个问题
第二个问题是
MapReduce定义的东西
有点太抽象了
就是一个Map
和一个Reduce
那个Map函数里头
可以包罗万象
用户写什么是什么
这个事情呢就有两个问题
一个就是说它麻烦
很多人做数据
它其实都是做几件事儿
比如说它做一个
求个和 求个平均值
比如说它去过滤一下
就是说我里头带许巍两个字的
就留着
不带许巍两个字的都删掉
这些操作其实到最后
你都必须得手写代码
你得手工实现这个
MapReduce这件事
那么在这种情况下
一个是用户麻烦
再一个系统也麻烦
系统它是不理解
Reduce里写的是啥的
对就是里写的是啥的
它就知道你运行了
一个用户定义的函数
这个函数系统没有任何办法
来帮你优化
为什么系统可以优化
再待会我们这些个后边会看到
系统是有很多的途径
来帮你优化这个的
但是由于它不理解
你到底具体做的是啥
所以它不敢帮你优化
它怕万一优化完了之后
反而优化错了就不对了
所以大家一直就希望
能不能首先定义这些个
个定的操作铁
我能够做一个
非常灵活的数据流
不一定非要先跑完Map
再跑Reduce呢
很多人也做了这样的工作
那么下边我们会介绍一个
另外的一个架构
在作为一个例子
来说这个灵活的数据流处理
是怎么样处理的
-授课视频
--什么是大数据
--大数据典型应用
--大数据的特点
--大数据技术体系
--大数据生态系统
--大数据技术挑战
--课程内容
-1. 绪论--Quiz 1
-授课视频
--2.2并行化理念
--2.9计算虚拟化
-2.云计算--Quiz 2
-授课视频
--Video
--Video
--Video
--Video
--Video
--Video
--Video
--Video
--Video
--Video
--Video
--Video
--Video
--Video
--Video
--Video
-3.文件存储--Quiz3
-授课视频
--4.13类似框架
--4.14章节总结
-4. 处理框架--Quiz4
-授课视频
-5.内存计算--Quiz5
-授课视频
--数据副本及一致性
--节点本地数据存储
-6. NoSQL--Quiz6
-授课视屏
--Video
--Video
--Video
--Video
--Video
--Video
--Video
--Video
--Video
--Video
-7. 流计算--Quiz7