RDD 深入理解
-
当由大批量数据需计算时,则需放入集群中进行并行处理
-
解决并行计算的四个要点
- 要解决的问题必须可以分解为多个可以并发计算的部分
- 每个部分要可以在不同处理器上被同时执行
- 需要一个共享内存的机制
- 需要一个总体上的协作机制来进行调度
-
任务分解
- hdfs中,分为不同block
- 进行计算的时候,可按照block来划分,每一个block对应一个不同的计算单元
RDD
并没有真实的存放数据, 数据是从 HDFS 中读取的, 在计算的过程中读取即可RDD
分片的意义在于表示对源数据集每个分片的计算,RDD
可以分片也意味着 可以并行计算
-
移动数据不如移动计算
- 每个计算单元需要记录其存储单元的位置,尽量调度过去。
-
集群RDD错误恢复
- 缓存,类似HDFS的备份
- 记录RDD依赖关系,通过其父级RDD来恢复子级RDD
- 记录子级的父级关系
- 记录子级的计算函数,
- 当子集RDD出错时,可通过父级RDD和计算函数来恢复子级RDD
-
复杂RDD间依赖优化
- 缓存
- checkpoint
RDD在计算过程中是共享内存的,而不需要将中间结果存放在可靠的分布式文件系统中。
(Spark 分区/分片)
RDD 特点
-
RDD 不仅是数据集,也是编程模型
- RDD 即是一种数据结构, 同时也提供了上层 API, 同时 RDD 的 API 和 Scala 中对集合运算的 API 非常类似, 同样也都是各种算子
- RDD 的算子大致分为两类
- Transformation 转换操作, 例如
map
flatMap
filter
等 - Action 动作操作, 例如
reduce
collect
show
等
- Transformation 转换操作, 例如
执行 RDD 的时候, 在执行到转换操作的时候, 并不会立刻执行, 直到遇见了 Action 操作, 才会触发真正的执行, 这个特点叫做 惰性求值
-
RDD可以分区
- RDD 是一个分布式计算框架, 所以, 一定是要能够进行分区计算的, 只有分区了, 才能利用集群的并行计算能力。
- 同时, RDD 不需要始终被具体化, 也就是说: RDD 中可以没有数据, 只要有足够的信息知道自己是从谁计算得来的就可以, 这是一种非常高效的容错方式。
-
RDD是只读的
- RDD 是只读的, 不允许任何形式的修改. 虽说不能因为 RDD 和 HDFS 是只读的, 就认为分布式存储系统必须设计为只读的. 但是设计为只读的, 会显著降低问题的复杂度, 因为 RDD 需要可以容错, 可以惰性求值, 可以移动计算, 所以很难支持修改.
-
RDD是可以容错的
- RDD 的容错有两种方式
- 保存 RDD 之间的依赖关系, 以及计算函数, 出现错误重新计算
- 直接将 RDD 的数据存放在外部存储系统, 出现错误直接读取, Checkpoint
- RDD 的容错有两种方式