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分区和数据块有啥联系?