当前课程知识点:大数据系统基础 > 5.内存计算 > 授课视频 > 5.10SPARK-RDD
我们刚才讲到了传统的
内存抽象的容错开销是比较大的
它只有两类方法
那么在Spark里面
怎么解决这个问题
他提出了所谓的RDD
Resilinet Distributed Datasets
这样的一个模型
这个数据集数据抽象
它主要的特征是什么
首先
它是基于数据集合的
而不是单个数据的
也就是说大家注意这个sets
也就是它的编程抽象
是针对数据集合的
这样的话每一个数据
比如说我们有一个RDD A
我们对它做操作
比如说
把A转换称另外一个数据集B
这样的一个操作
我们如果要记log的话
我们还像刚才讲的
第二种容错的方法
记log的话
我们只需要记录把A
通过某种方法转换成B
比如这个转换是T的话
我们只要记这么多的信息
那么A里面可能有多少数据
可能有比如说有一百万个数据
那么对于这样
一百万个数据的转换
我们只要记一条
这样的记录就可以完成了
所以这个就可以在记录的方面
就可以节省大量的这样的时间
另外我们要真正的能够保证
能够容错的话
还需要让这个中间转换的方式
这个T这个transformation
它需要有一个特征叫做确定性
也就是说
我这个A通过这个T转换成B
那么如果A相同的话
每次转换出来的这个B
总是一样的
这个操作叫做确定性的
如果有一些非确定性的操作
大家可以想像
我即使记录了这个log
我知道这个转换是T
那么我下次执行这个T
想从A再产生B的时候
我也会产生不同的B
所以又达不到这个容错的
这样一个效果
那么第三个
是数据一旦产生就不能修改
也就是说当我产生了这个
数据集A以后
我就不能够直接的去
修改A中的某一个元素
或者是修改A中的
其它多个元素
我只能做的事情
是通过这样的一个转换
把它转换成另外的
其它的这个数据集合
或者把A直接生成一个值
比如说我们有一个操作叫做count
我们可以把A里面
有多少个元素数把它输出
比如说是五或者是一百万
这样的话做这些操作
我们都不能够再去修改
A里面的某一个元素
这样的一种设计
实际上还是为了容错的方便
那么假如A中的某个元素
可以被修改
那么实际上就回到了
我们刚才讲到的这种细粒度的
写的这样的一种方式
就和刚才讲的键值对
或者是DSM分布式共享内存
产生的问题是一样的
所以这个immutable
不能修改 不能够在
这里面还有一个词叫in-place
也就是说我们不能在这个A
它所对应的这个
数据集里面去改
那么我们当然还是可以改的
对吧 我们刚才说了
比如说我们要把A里面的
每个元素都加1
那么我们就可以通过
这样的一个变换
把它变换到数据集B里面去
那么这个B里面的每个元素
就是A里面的每个数据
都加1以后的这样一个结果
这个是可以的
但是大家注意这个修改
是把这个数据在转换的过程中
生成了一个新的数据集
而不是在A自己内部去修改的
所以这是RDD的这样一个设计
大家可以看到说
这样的一个设计
它的核心的出发点
实际上就是为了容错
我们可以看到
每一个设计的元素
都是为了容错
比如说
基于数据集合而不是单个数据
这主要是为了减小log的开销
基于确定性的粗粒度操作
也是为了我们今后能够
重复这样的操作
产生同样的结果来容错
那么immutatle这样的不能修改
不能做in-place修改的
这样的特征也是这样的
那好我们这边来看
这样一个例子
也就是说当我们按照RDD的
这个方式去做了这样的一种
数据抽象以后
也就是说数据是确定性的产生
而且产生后不会
变换immutatle的
一旦我们有了这样的特征以后
实际上我们可以通过
不是通过这个简单的log
或者是通过这个副本的方式
来恢复数据
而是通过重复计算的
这样的方式来恢复数据
那么我们还是要记log的
我们记的log是什么
我们只要记住这个RDD的
生成过程就可以了
而不是要记住它的每一个数据
是怎么变化的
因为我们刚才讲到
我们把它抽象成了集合以后
RDD这个Datasets
抽象成了一个集合以后
我们就可以用一个简单log
就记录一组数据的转换的过程
所以而且这种方式
在不出错的时候几乎没有开销
我们来看一下
下面这样的一个例子
这个例子是Scala语言的
不过大家即使没有
Scala语言的基础
也很容易理解
这里面我们首先
是读一个文件textFile
从这个hdfs上面
把这个数据读进来
读进来以后
我们对它做了一个过滤
过滤以后这个过滤的意思
大家很容易看懂
说这个里面
包括error的这些部分
把它取出来
那么对于所有有error的部分
我们再把它split
把它分词相当于
然后中间的这个分割符
是\t也就是把中间有errr的
这些部分再把它取出来
那么如果说我们
中间遇到的这个数据
比如说MappedRDD这个数据
它突然坏掉了
它所在的机器坏掉了
那么我们怎么能够去
重新产生它
因为我们没有去做副本
没有副本这个时候我们首先看
这个Map以后的这样的一个数据
就是最后产生的
这个massages它依赖于哪个
它依赖于前面的
这个FilteredRDD
也就是说这步的数据
如果这一步的数据我们还有
那么我们就可以把
这样的一个数据取出来以后
直接再去做Map操作
我们就可以
生成这样的MppedRDD
但如果FilteredRDD
也由于这个故障损失了
那我们还可以追诉
因为我们的log都记录了
那么这样的一个数据
是HadoopRDD也就是
从这个textFile中生成的
我们可以直接从这个
hdfs分布式文件系统中
取出这样的一个数据
也就是说这个数据
我们认为这个整个系统
如果没有完全失效的话
这个hdfs上面大家也学过
它是一个分布式文件系统
它有好几个文件副本
它可以把数据产生以后
然后再来做这个产生的这个
读取文件获得这个RDD以后
再去做这个Filered的操作
就可以得到Filered的RDD
然后再返回来做MAP这个操作
还是可以把messages恢复回来
所以这就是一个例子
也就是说
RDD这样的一种数据抽象
由于它是确定性的产生
而且产生后不会变换
所以我们可以通过
重复计算的方法来恢复数据
而且做这样的恢复
我们需要记录数据也非常少
因为我们是对数据集来做变换的
这就是Spark里面
所提出的这样一个数据抽象
它提供了这样的一种
高效率的容错的机制
-授课视频
--什么是大数据
--大数据典型应用
--大数据的特点
--大数据技术体系
--大数据生态系统
--大数据技术挑战
--课程内容
-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