• Spark基于弹性分布式数据集(RDD)模型,具有良好的通用性、容错性与并行处理数据的能力
RDD(Resilient Distributed Dataset ):弹性分布式数据集(相当于集合),它的本质是数据集的描述(只读的、可分区的分布式数据集),而不是数据集本身

• RDD的关键特征:
RDD使用户能够显式将计算结果保存在内存中,控制数据的划分,并使用更丰富的操作集合来处理
– 使用更丰富的操作来处理,只读(由一个RDD变换得到另一个RDD,但是不能对本身的RDD修改)
记录数据的变换而不是数据本身保证容错(lineage)
• 通常在不同机器上备份数据或者记录数据更新的方式完成容错,但这种对任务密集型任务代价很高
• RDD采用数据应用变换(map,filter,join),若部分数据丢失,RDD拥有足够的信息得知这部分数据是如何计算得到的,可通过重新计算来得到丢失的数据
• 这种恢复数据方法很快,无需大量数据复制操作,可以认为Spark是基于RDD模型的系统
– 懒操作,延迟计算,action的时候才操作
– 瞬时性,用时才产生,用完就释放

• Spark允许从以下四个方面构建RDD
– 从共享文件系统中获取,如从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”)
Sparkcontext是spark的入口,编写spark程序用
到的第一个类,包含sparkconf sparkenv等类

Spark针对RDD提供两类操作:transformations 和 action
transformations是RDD之间的变换action会对数据执行一定的操作
– transformations采用懒策略,仅在对相关RDD进行action提交时才触发计算

每个RDD包含了数据分块/分区(partition)的集合,每个partition是不可分割的
– 实际数据块的描述(实际数据到底存在哪,或者不存在)
– 其值依赖于哪些partition

• 与父RDD的依赖关系(rddA=>rddB)
– 宽依赖: B的每个partition依赖于A的所有partition
• 比如groupByKey、 reduceByKey、 join……,由A产生B时会先对A做shuffle分桶
– 窄依赖: B的每个partition依赖于A的常数个partition
• 比如map、 filter、 union

RDD依赖关系:
spark-2-核心
•从后往前,将宽依赖的边删掉, 连通分量及其在原图中所有依赖的RDD,构成一个stage
• DAG 是 在 计 算过 程中 不 断 扩 展 , 在action后才会启动计算
• 每个stage 内部尽可能多地包含一组具有窄依赖关系的转换,并将它们流水线并行化(pipeline)

相关文章: