当前课程知识点:大数据系统基础 > 4. 处理框架 > 授课视频 > 4.1大数据的处理框架
大家好 我是清华大学的徐葳
从这节课开始
我们开始讨论
大数据处理的框架
这些框架提供了一些
更高层次的抽象
能够帮助应用程序的开发者
更方便的开发他们的应用程序
而不用去关注系统里的
复杂的细节
这节课我们介绍两个
经典的框架
一个叫MapReduce
一个叫Pig Latin
MapReduce框架
是经典里的经典
这节课里头我们主要介绍
它的编程模式 它的实现方法
以及
它可以性能可以调优的地方
Pig Latin提供了比MapReduce
更高层次的抽象
它的语言使用起来更方便
我们介绍这种编程语言
介绍如何利用它
来撰写大数据的程序
贯穿这节课的主要的思想
是数据并行
数据并行这个概念
我们在介绍云计算的时候
已经介绍过
但是在这节课中
会反复出现
从这节课开始
我们开始介绍一系列的
大数据分析的工具
这大数据分析的工具
其实有很多种
按照是不是它是批处理的类型
从这节课开始我们先介绍
一系列的大数据的处理的工具
按照类型来看
大数据处理工具有若干种
有一类分类方法是说
我有一类批处理工具
比如说像Hadoop
今天介绍的Hadoop
像Pig Latin
基本上都是属于这一类的
批处理工具
还有一类是更加实时的处理工具
比如像之后的几讲会讲到的
流式数据处理
以及基于内存的数据库等等
这只是为了更加快捷的处理数据
更加实时的处理数据
那么当然数据有很多种
我们也讲到大数据有两种
一种是结构化数据
一种是非结构化数据
所以我们从这个维度上来看
我们可以有
非常结构化数据的分析工具
以及非结构化数据分析的工具
我们今天讲的
主要是在这个角落里头
就是 是批处理的
而且是非结构化的
因为这一类的处理工具
在大数据里的发展也比较早
比较成熟
而且他通过分析这些工具
我们能够揭示一系列的
在做大数据分析工具的情况下
同学们会遇到的各种问题
我们先来回顾一下
我们上一节课讲到过的
数据并行的概念
在上一节课里
我们讲Google文件系统的时候
这节课有几个重要的观点
这个重要的观点也适用于
这节课以及以后的
很多课程里
讲的大数据处理方法
首先 第一个观点是
数据存储于
很多很多的服务器里头
所以它本身是可以并行的
这个在数据多了的情况下
这个元数据的管理
Batch对它的管理
变得非常的重要
如果你()太多的话
本身(02:56)的管理
就变得非常的困难
也消耗大量的资源
所以如何来减少元数据的开销
那么Google文件系统
采用的方法是
使用非常大的块
这样一个大文件 可以分成
为数不是特别多的一些块
所以这样大大减少了
元数据的开销
这三个观点是
因为大数据特别大
它价值密度又低
所以我们要避免使用
非常昂贵的硬件
但是便宜的硬件又容易坏
所以硬件坏了 软件出问题了
都是不可避免的
我们尽量买便宜的硬件
但是所有的东西
容错都通过软件来进行
那软件怎么容错
那么就通过很多的冗余来进行
最后一点就是说 大数据处理
我们讲到这数据
我们是怎么用的
我们是怎么读取的 怎么写的
不需要更改的地方
我们就不要让它更改
因为一旦更改
大家想 就有两个问题
一个是在同一个时间
只有一个人能改 否则就改乱了
所以大家互相等
这个叫做互相锁的问题
在google系统文件里
怎么解决这个问题
它就不让大家改数据
你写第一次就写完了
你只能往后边添加数据
你不能够回去改这个数据
这样大大减少了
这种同步的问题
而且也把整个的一致性
这种模型变得非常的简单
让这个系统变得非常简单
简单的系统才会变得更加可靠
我们之前在讲云计算的时候
我们提到过数据并行化的概念
并行化是很重要的
数据并行化是一个
并行化里比较简单的一种方法
这种方法基本上
我们大数据里
经常用到的一种数并行化就是说
硬盘上有大量的数据
我们可以并行的操作这些数据
并行的读取这些数据
并行的分析这些数据
这个事情大家听起来
是非常的简单的
非常的直观的
因为数据跟数据之间无关嘛
我一个人分析第一块数据
一个人分析第二块数据
那么当然它就可以并行化了
这也是为什么这种并行化
在并行计算里头 被叫做
Embarrassingly Parallel
这个Embarrassingly这个词
就是很不好意思的意思
那这个意思 就是说
你说我这种东西是并行算法
那么你都不好意思跟人说
你这是并行算法
因为它实在是太简单了
这数据本身就是无关的
你一人拿一块处理
这是最最简单 最最朴实的想法
但是这种朴实的想法
在系统实现上 其实确实是
里头有很多很多小的问题
导致它不容易被系统实现
这就是为什么
直到google实现了MapReduce
大家才突然觉得这种算法
其实是处理大数据的一种
非常非常高效
而且非常经济实用的一种方法
那介绍一下
为什么这种方法是比较难实现的
那我们举这么一个例子
这是词频统计 我们假设有一段
非常非常长的文章
这里头包含了很多的词
比方说dog 有cat 有is 这些词
那我想数数到底有多少是dog
多少是cat 多少是is
那这件事应该怎样做
那么我可以一直数下去
但是如果这文章巨长
那么你一个人在那儿数
那要数很久很久
那么最最朴实的想法就是什么
我记着 我搁一个全局的大表
然后我把它 分成好几个人数
那么我一个人从这个地方开始数
一个人从这个地方开始数
一个人从这个地方开始数
那么这时候 那么我有三个人
我是不是快了三倍
每个人数一个数
我就往这儿记一下
dog我数一个
然后又数了一个dog
这个人也数了一个
三个人都往这里头记
它是不是就变得更快
这个当然是一个非常好的想法
这也是一个
就像我说的
Embarrassingly Parallel
是数学变形的这样一个算法
那么GFS
已经给你解决了什么问题
GFS已经给你解决了
这么一个大的文件
它不是存在一块硬板硬盘上
它是存在若干块硬盘上的
大家知道读硬盘是比较慢的
但是我可以从多块硬盘上读
每个硬盘读的慢 没关系
那我们很多很多块硬盘一起读
所以我整个变化
还是很快的
所以这数据本身就是分块存储的
但是这里头还有其他的问题
那么一个问题
可能大家已经看到了
就是说他是一个共享状态
这个共享状态
谁来拿着这个共享状态
谁来管理这个共享状态
那么你有很多很多人并发的
你每个人都跟他说
我在这上加一个
我在那上加一个
那么这个管理共享状态的人
他就好累
所以它是有一个吞吐量的问题
就说它自己每秒钟
能够吸收掉多少个massage
大家告诉它说 我要改这个状态
这是一个它的吞吐量的问题
那更重要的问题就是说
还是回到刚才提到的
好多人同步写的问题
因为它是有几个计数器
每个计数器 都相当于一个状态
你有好多人
一起改这个计数器的话
那大家就会要互相等
所以实际上
你可能等的时间
比你真正改这个计数器的时间
还要长 所以这个共享的状态
有这两个原因
导致它不能够变得更大的规模
再一个就是因为
大家每数一个 就要通讯一次
这个通讯和计算
其实数一个单词是很快的
但是你通讯一次
通讯一次是很慢的
所以这种小粒度的通讯
导致整个的计算
和通讯之间的变形的程度
就非常的低
而且它会让元数据管理
就是这个共享状态的管理
会变得非常的复杂
那么人们就想到一个说
那这个东西
我不要做小粒度通讯
咱们做一个批量的通讯
那怎么做
那我数的时候
我自个儿在自个儿的这个局部
自个儿记着多少个
那我自个儿偷偷数着
数完了之后
我说我自个儿保持一个小点
我说我这儿有多少个dog
我这儿有多少个is
我这儿有多少个cat
那么我数好了之后
我在一次到这个全局状态行不行
这样的话
就避免了一种小的通讯
而且避免了
我频繁的更新这个全局状态
这解决了它的全局的状态的
我还解决了全局状态的
这个锁的问题
但是这也有它自己的问题
那么就这两个问题
如果我有一个机器出问题了
那么 我这个全局状态
我要自己记着
我到底更新了谁 没更新谁
或者说 我这个机器上
有很多很多的值
我传到这个全局状态里
是不是所有的每一个值
都更新进去了
这都是一个原子操作
所以出现这种情况下
有机器失败的情况下
是很有问题的
另一个问题是一个存储的问题
这个表里头只有三个词
当然没有问题
如果我们有三百万个歌词
有三亿的词
那么这个状态就非常非常大
所以它也不是说
我通讯过去之后
我就全局状态就
全部能存在内存里头了
所以它自己也要
可能这个全局状态
本身也变成了一个
就是很大的数据管理的
这么一个问题
他是不是自身也要并行化
因此我们可以考虑到
这样一个问题
就是说我们是不是
可以把这个全局状态
也切分开 这样的话全局状态
整个儿能够处理的吞吐量
就变得更大了
那么我说这个人
就只管给我数dog有多少个
这个人只管数cat有多少个
这个人只管数is有多少个
然后每个人 数完了之后
都把这一小块通讯给它
这样的话 它的全局状态
实际上也是分布式的
但是最后还有什么问题
如果这个全局状态
或者说某一块人失败了
这个时候
你还是破坏了全局状态
就是你破坏了这一块状态
假设这一块死菜了
那么我需要做的是什么
每个人其实都要重新数一遍
因为它 如果他自己一个人
把他个数告诉我之后
他就忘掉了他的个数之后
那他忘掉了is
到时候他这dog和cat也白数了
他下次的话
还得重新扫描整个数据
再数一遍
因此的话
我们希望这个东西
它不要合并起来
最好的办法就是说
我局部个数
我把每一个局部个数
都记录下来
这样的话 如果谁死了之后
我们再互相通讯一下
我们还能找回到这个局部个数来
这个就是我们要防止它失败
因为这种大的分布式系统
它总会失败的
所以在这种 各种各样的
对于失败的情况的考虑下
人们就设计了
这种MapReduce这种系统
和这种模型
来解决这种数据并行的
这样的一个问题
当然MapReduce
除了这个问题之外
你想这一个小的
只是分布式的数个数
就这么麻烦
那么其他的问题
它还要解决一些易用性
包括通用性的问题
以及我们应该采取
什么样的抽象层次
来让大家能够方便地来写
这样数据并行的程序呢
这些都是人们
设计MapReduce系统的时候
要考虑的一些问题
-授课视频
--什么是大数据
--大数据典型应用
--大数据的特点
--大数据技术体系
--大数据生态系统
--大数据技术挑战
--课程内容
-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