Spark核心—RDD( Resilient Distributed Dataset 弹性分布式数据集模型)
1.四个特征
– RDD使用户能够显式将计算结果保存在内存中,控制数据的划分
– 记录数据的变换和描述,而不是数据本身,以保证容错
– 懒操作,延迟计算,action的时候才操作
– 瞬时性,用时才产生,用完就释放
2.四种构建方法
– 从共享文件系统中获取,如从HDFS中读数据构建RDD
• val a = sc.textFile(“/xxx/yyy/file”)
– 通过现有RDD转换得到
• val b = a.map(x => (x, 1))
– 定义一个scala数组
• val c = sc.parallelize(1 to 10, 1)
– 由一个已经存在的RDD通过持久化操作生成
• val d = a.persist(), a. saveAsHadoopFile(“/xxx/yyy/zzz”)
3.partition和依赖
– 每个RDD包含了数据分块/分区(partition)的集合,每个partition是不可分割的
– 每个partition的计算就是一个task,task是调度的基本单位
– 与父RDD的依赖关系(rddA=>rddB)
宽依赖: B的每个partition依赖于A的所有partition
• 比如groupByKey、reduceByKey、join……,由A产生B时会先对A做shuffle分桶
窄依赖: B的每个partition依赖于A的常数个partition
• 比如map、filter、union……
4.stage和依赖
– 从后往前,将宽依赖的边删掉,连通分量及其所有依赖的RDD,构成一个stage
– 每个stage内部尽可能多地包含一组具有窄依赖关系的转换,并将它们流水线并行化
5.数据局部性原则
– 如果一个任务需要的数据在某个节点的内存中,这个任务就会被分配至那个节点
– 需要的数据在某个节点的文件系统中,就分配至那个节点
6.容错性原则
– 如果此task失败,AM会重新分配task
– 如果task依赖的上层partition数据已经失效了,会先将其依赖的partition计算任务再重算一遍
• 宽依赖中被依赖partition,可以将数据保存HDFS,以便快速重构(checkpoint)
• 窄依赖只依赖上层一个partition,恢复代价较少
– 可以指定保存一个RDD的数据至节点的cache中,如果内存不够,会LRU释放一部分,仍有重构的可能
暂无数据