RDD
共享内存模型
- 只读的记录分区的集合
依赖关系
- 窄依赖 narrow dependency
- OneToOneDependency
- 父 RDD 每个分区只被子 RDD 的一个分区所使用
- 不需要 shuffle
- map,union
- 宽依赖 wide dependency/shuffle
- 父 RDD 的每个分区可能被多个子 RDD分区所使用,会有 shuffle 产生
- groupByKey
Partitioner 分区器
- 定义如何分布数据
- 一个 RDD 分成多少个分区,每个分区数据量多发,从而决定每个 Task 将处理哪些数据
- 可使用分区器
- [[HashPartitioner]] 给定的 key,计算 hashCode,对分区个数取余
- [[RangePartitioner]] 尽量保证每个分区中的数据量均匀,且分区与分区之间是有序的。
- rangeBounds
- 自定义分区器
Question
- RDD是弹性数据集,“弹性”体现在哪里呢?
- 存储弹性
- spark 计算产生的中间结果会保存在内存中,如果内存不足会自动存储在磁盘
- 容错弹性
- 计算过程中如果出错会自动重试
- task 失败会重试
- stage 失败会重试失败的分片
- 计算过程中如果出错会自动重试
- 计算弹性
- 如果计算过程中数据丢失,会根据 RDD 的依赖关系重新计算得到数据
- 分区弹性
- RDD 会根据文件大小动态分区
- 存储弹性
- 你觉得RDD有哪些缺陷?
- 惰性计算,中间数据默认不保存,每次操作都会对数据集重复计算,某些计算量比较大的操作可能会影响系统的运行效率。
- RDD分区和数据块有啥联系?