Spark中三大核心数据结构:
RDD、
广播变量(分布式只读变量)、
累加器(分布式只写变量)、
1. RDD的概念和特点:
RDD,全称Resilient Distributed Dataset,弹性分布式数据集,作为Spark中最基础的数据抽象,类似Java中对象的概念;
它代表一个不可变(只读)、可分区、里面的元素可并行计算的集合,List、Set、Map都是RDD的常见形式。
特点:只读、分区、血缘、缓存、checkpoint
2. RDD的血缘关系(宽窄依赖)
RDD是只读的分区的数据集,对RDD进行改动只能通过RDD的转换操作来实现,多个互相转换的RDDs之间存在血缘关系,也即RDD之间的依赖,分为Narrow Dependencies(一个父RDD对应一个子RDD)和Wide Dependencies(一个父RDD对应多个子RDD);
RDD的执行是按照血缘关系进行延时计算,血缘关系可以天然的实现数据的容错,如果数据迭代出错,可以通过血缘关系进行回溯重建;并且如果血缘关系过长,也可以通过持久化RDD来切断血缘;
3. RDD支持缓存Cache和CheckPoint这两种持久化方式:
(1)缓存Cache一般适用于应用程序多次需要使用同一个RDD,eg:保存到HDFS中(saveAsHadoopFile),缓存的RDD只有在第一次计算时会根据血缘关系得到分区数据,后续用到该RDD直接从缓存中取得数据而不再依据血缘关系计算,这样的好处是加速了后期的RDD重用;
因为Cache本身只是MemoryOnly,可能会随着内存释放,这样释放后数据会丢失,不安全;所以Cache并不会切断RDDs的血缘关系,如果Cache丢失还可以通过血缘关系来回溯;
(2)checkpoint是将RDD数据保存到持久化存储(eg:HDFS的节点中)中,并通过创建备份保证数据的安全性,这样就可以切断RDD之间的血缘关系,checkpoint后的RDD可以直接从checkpoint拿到数据而并不需要知道其父RDDs,checkpoint是一种常用的RDD缓存手段,相比Cache更加安全。