Spark引擎中RDD的性质
RDD(Resilient Distributed Dataset,弹性分布式数据集)是SparkCore提供的核心抽象。一个RDD在逻辑上抽象地代表了一个HDFS文件或数据库中的表,但RDD是被分区的,每个分区分布在不同的节点上,从而并行执行。
RDD算子包括:
- 转换算子:也叫计算,有flatmap、map等;
- 缓存算子:这个有的不叫算子,叫持久化,使用cache方法;
- 行动算子:有collect等。RDD是懒执行的,没有行动算子,前面的所有算子不会执行(但是会加载进来,加载也会执行其中的代码,例如打印代码)。
- 输出算子:如saveAsFile等。
Spark中对于一个RDD执行多次算子的默认原理是:每次你对一个RDD执行一个算子操作时,都会重新从源头处计算一遍,计算出那个RDD来,然后再对这个RDD执行你的算子操作。例如:A->B->C->D,然后如果需要C->E就需要A->B->C->E这一套计算,这种方式的性能是很差的。如果C重复使用可以做持久化,也就是做缓存算子。
RDD通常通过HDFS文件或Hive表创建,也可以通过数据库表或应用程序的集合(例如Scala代码)来创建。
RDD的性质如下:
- 不可变性:每经过一次算子生成一个新的RDD,不是对之前的做改变,RDD理解成逻辑的概念;
- 可分区性:类似MapReduce中多个Map任务并行度,有默认分区也可自定义(根据集群性能来确定分区);
- 弹性:包括:
- 存储弹性:内存与磁盘的自动切换,RDD默认存放在内存中,但内存容量不足时,Spark会自动将RDD数据写入磁盘,用户不用去管这些,也就是对用户透明。这就是RDD的弹性;
- 容错的弹性:数据丢失可自动恢复,RDD的一套算子是一个血统,也就是血统关系,知道每个算子的位置。假如一个节点的RDD Partition失败或宕掉,RDD会通过数据来源重新计算该Partition,这对使用者是透明的);
- 计算的弹性:计算出错重试机制;
- 分片弹性:根据需求重新分片,即分区。
总之,RDD 是一个 分布式、不可变、带血统的对象集合,支持 延迟计算 和 容错恢复,是 Spark 高层抽象的基础。