RDD介绍
RDD可以通过两种方式创建:由一个存在的Scala集合,如 var rdd = sc.parallelize(1 to 10) ;由外部存储系统的数据集创建,包括本地文件系统 var rdd = sc.textFile(“xx.txt”),或者所有hadoop支持的数据集,比如HDFS、Cassandra、HBase、Amazon S3等。
RDD每次转换都会生成一个新的RDD,所以RDD之间就会形成类似于流水线一样的前后依赖关系,在部分分区数据丢失时,Spark可以通过这个依赖关系重新计算丢失的分区数据,而不是对RDD的所有分区进行重新计算。
Spark实现了两种类型的分片函数,一个是基于哈希的HashPartitioner,另一个是基于范围的RangePartitioner。只有基于key-value的RDD,才会有Partitioner。
对于一个HDFS文件来说,每一个RDD存储列表保存的是每个Partitioner所在块的位置。Spark在进行任务调度的时候,会尽可能将计算任务分配到其所要处理数据块的存储位置。
RDD支持两种操作,转换(Transformation)和动作(Action)。
Transformation:从现有数据集创建新的数据集,如map、filter、groupBy、join等。
Action:数据集进行计算,返回一个值给Driver,如reduceByKey、collect、count、saveAsTextFile等。
RDD 缓存(Cache)和 检查点(Checkpoint)机制。
Spark速度非常快原因之一就是不同的操作可在内存中持久化(或缓存)数据集,并可在其他动作中重用。
例如,假设首先进行了RDD0—RDD1—RDD2的计算作业,那么在进行RDD0—RDD1—RDD3的作业时,由于RDD1在第一次计算中已经缓存到系统,因此RDD0—RDD1的转换不会重复进行,大大提高了计算效率。
cache:通过 persist() 或 cache() 方法可以标记一个要被持久化的RDD,其中cache() 等价于persist(StorageLevel.MEMORY_ONLY)。
RDD缓存能在第一次计算完成后,将计算结果缓存到内存、本地文件系统中,但如果缓存丢失了,则需要重新计算。为了避免缓存丢失重新计算带来的开销,Spark引入了检查点(CheckPoint)机制。
检查点是在计算完成后,重新建立一个job来计算。
checkpoint:数据集进行计算,返回一个值给Driver,如reduceByKey、collect、count、saveAsTextFile等。
为了引入检查点机制后的重复计算,一般是通过先将RDD缓存,这样就能保证检查点的操作可以快速完成。