弹性分布式数据集(RDDS)---RDD是只读的、分区记录的集合,只支持粗粒度转换,即在大量记录上执行的单个操作。
Spark 主要以一个弹性分布式数据集(RDD)的概念为中心,它是一个容错且可以执行并行操作的元素的集合。
1、RDD的五个特征:
①分区:有一个数据分片列表,能够将数据进行切分,切分后的数据能够进行计算,是数据集的原子组成部分。
②函数:计算每个分片,得出一个可遍历的结果,用于说明在父RDD上执行何种计算。
③依赖:计算每个RDD对父RDD的依赖列表,源RDD没有依赖,通过依赖关系描述血统。
④优先位置:每一个分片的优先计算位置
⑤分区策略:描述分区模式饥饿数据存放的位置,k-v的RDD根据哈希值进行分区,类似于MR的Partitioner接口,根据key来决定分配位置。
2、RDD的依赖
Spark中的依赖关系主要体现为两种形式,宽依赖和窄依赖,其本质区别是是否发生shuffle。
窄依赖:父RDD的每一个分区最多被一个子RDD的分区所用,表现为一个父RDD的分区对应一个子RDD的分区,或多个父RDD的分区对应一个子RDD的分区,也就是说一个父RDD的一个分区不可能对应一字子RDD的多个分区。
宽依赖:子RDD的每个分区都依赖于所有父RDD的所有或多个分区,也就是说存在一个父RDD的一个分区对应一个子RDD的多个分区。
3、RDD的创建
有两种方法可以创建 RDD : 在你的 driver program(驱动程序)中 parallelizing 一个已存在的集合,或者在外部存储系统中引用一个数据集,例如,一个共享文件系统,HDFS,HBase,或者提供 Hadoop InputFormat 的任何数据源。
(SparkContext).makeRDD
(SparkContext).parallelize
(SparkContext).textFile
4、RDD的操作
RDDS 支持两种类型的操作 :
①transformations(转换):在一个已存在的 dataset 上创建一个新的 dataset。
②actions(动作): 将在 dataset 上运行的计算结果返回到驱动程序。
Spark 中的所有 transformations 都是 lazy(懒加载的),因此它不会立刻计算出结果。相反,他们只记得应用于一些基本数据集(例如 : 文件)的转换。只有当需要返回结果给驱动程序时,transformations 才开始计算。这种设计使 Spark 的运行更高效。例如,我们可以意识到,map 所创建的数据集将被用在 reduce 中,并且只有 reduce 的计算结果返回给驱动程序,而不是映射一个更大的数据集。
默认情况下,每次你在 RDD 运行一个 action 的时, 每个 transformed RDD 都会被重新计算。但是,您也可用 persist (或 cache) 方法将 RDD persist(持久化)到内存中;在这种情况下,Spark 为了下次查询时可以更快地访问,会把数据保存在集群上。此外,还支持持续持久化 RDDs 到磁盘,或复制到多个结点。
5、DAG的生成
原始的RDD经过一系列转换就形成了DAG图。在Spark中,DAG绘制完毕不会被立即执行,而是仅仅对数据集进行标记。