简介
RDD: 弹性分布式数据集
出现目的: 为了能够支持更加高效的迭代计算操作
背景说明:
早期的计算模型: 单机计算模型
例如: MySQL / Excel
单机的计算模型
仅适合于: 小量数据集的处理操作
在计算操作的时候 只有一个进程, 在一个进程中通过不断的迭代完成最终的计算操作
随着不断的发展, 整个数据体量都在不断的增大, 原有单机的计算模型无法应对未来的数据处理需求, 怎么办? 分布式计算模型
核心: 采用多个节点处理,将一个任务拆分为N多个子任务, 分别运行在不同的节点上进行并行的处理, 各个节点计算完成后, 将结果汇总处理即可(分而治之)
诞生了相关的分布式计算框架: MR Spark Flink Storm ....
MR和spark都是一个大规模的分布式计算引擎, 都可以处理大规模的数据
MR存在的弊端: 1- 执行效率低 2- 迭代计算不方便
正因为MR存在的一些弊端, 对于市场, 迫切需要一款能够解决MR痛点的框架:
1- 解决多次磁盘IO的问题, 整个计算尽可能的都在内存中处理, 减少IO
2- 提供一个更加高效的迭代计算引擎
RDD的出现就是为了解决这些问题
- MR的迭代模型
- Spark的迭代计算模型:
RDD是一个抽象的数据模型, RDD本身并不存储任何的数据, 仅仅是一个数据传输的管道, 在这个管道中, 作为使用者,只需要告知给RDD应该从哪里读, 中间需要进行什么样的转换逻辑操作, 以及最后需要将结果输出到什么位置即可, 一旦启动后, RDD会根据用户设定的规则, 完成整个处理操作
五大特性
1- (必须的)RDD是可分区的
2- (必须的)每一个RDD都是由一个计算函数产生的, 一个函数会作用在RDD的每一个分区上
3- (必须的)RDD之间都是存在着依赖关系
4- (可选的)对于KV类型的RDD, 是存在分区函数, 对于KV类型的RDD默认是基于Hash 分区方案
5- (可选的)移动数据不如移动计算(让计算程序离数据越近越好)
五大特点
1- RDD是可分区的: 分区是一种逻辑分区, 仅仅定义分区的规则, 并不是直接对数据进行分区操作, 因为RDD本身不存储数据
2- RDD是只读的: 每一个RDD都是不可变的, 如果想要改变, 处理后得到一个新的RDD, 原有RDD保持原样
3- RDD之间存在依赖关系: 每个RDD之间都有依赖关系的, 也称为血缘关系, 一般分为两种依赖关系(宽依赖和窄依赖)
4- RDD可以设置cache(缓存): 当计算过程中, 一个RDD被多个RDD所依赖, 可以将这个RDD结果缓存起来, 这样后续在使用这个RDD的时候, 直接获取数据即可, 不需要重新计算
5- RDD可以设置checkpoint(检查点): 与缓存类似, 都是可以将中间某一个RDD的结果保存起来, 只不过checkpoint支持持久化的保存, 不发生丢失