Spark之编程模型RDD
前言:spark编程模型两个主要抽象,一个是弹性分布式数据集rdd,它是一种特殊集合,支持多种数据源,可支持并行计算,可缓存;另一个是两种共享变量,支持并行计算的广播变量和累加器。
1.rdd介绍
spark大数据处理平台建立在rdd之上,rdd是spark的核心概念,最主要的抽象之一。rdd和spark之间的关系是,rdd是一种基于内存的具有容错性的集群抽象方法,spark是这个抽象方法的实现。
rdd(resilient distributed dataset)叫做弹性分布式数据集,是spark中最基本的数据抽象,它代表一个不可变、可分区、里面的元素可并行计算的集合。rdd具有数据流模型的特点:自动容错、位置感知性调度和可伸缩性。rdd允许用户在执行多个查询时显式地将工作集缓存在内存中,后续的查询能够重用工作集,这极大地提升了查询速度。
1.1 rdd的特征
(1)分区(partition):一个数据分片列表。能够将数据切分,切分好的数据能够进行并行计算,是数据集的原子组成部分。用户可以在创建rdd时指定rdd的分片个数,如果没有指定,那么就会采用默认值。默认值就是程序所分配到的cpu core的数目。
(2)函数(compute):一个计算rdd每个分片的函数。rdd的计算是以分片为单位的,每个rdd都会实现compute函数以达到这个目的。compute函数会对迭代器进行复合,不需要保存每次计算的结果。
(3)依赖(dependency):rdd的每次转换都会生成一个新的rdd,所以rdd之间就会形成类似于流水线一样的前后依赖关系。在部分分区数据丢失时,spark可以通过这个依赖关系重新计算丢失的分区数据,而不是对rdd的所有分区进行重新计算。
(4)优先位置(可选):一个列表,存储存取每个partition的优先位置(preferred location)。对于一个hdfs文件来说,这个列表保存的就是每个partition所在的块的位置。按照“移动数据不如移动计算”的理念,spark在进行任务调度的时候,会尽可能地将计算任务分配到其所要处理数据块的存储位置。
(5)分区策略(可选):一个partitioner,即rdd的分片函数,描述分区的模式和数据存放的位置。当前spark中实现了两种类型的分片函数,一个是基于哈希的hashpartitioner,另外一个是基于范围的rangepartitioner。只有对于于key-value的rdd,才会有partitioner,非key-value的rdd的parititioner的值是none。partitioner函数不但决定了rdd本身的分片数量,也决定了parent rdd shuffle输出时的分片数量。
常见的rdd有很多种,每个transformation操作都会产生一种rdd,一下是各种rdd特征比较。
1.2 rdd依赖