Spark核心RDD

  • Spark的核心:
  • RDD特性:
  • RDD的关键特征:
  • RDD创建方式


温馨提示:工作中已经很少使用RDD,一般直接使用df

Spark的核心:

Spark任务来说,最终的目标是Action(save、collect…)
①Spark的核心是建立在统一的抽象弹性分布式数据集(Resiliennt Distributed Datasets ,RDD)之上的,这使得Spark的各个组件可以无缝地进行集成,能够在同一个应用程序中完成大数据处理

②RDD(Resilient Distributed Dataset):弹性分布式数据集(相当于集合),它的本质是数据集的描述(只读的、可分区的分布式数据集),而不是数据集本身

③RDD是Spark提供的最重要的抽象概念,它是一种有容错机制的特殊数据集合,可以分布在集群的节点上,以函数式操作集合的方式进行各种并行操作。

④每个RDD包含了数据分块/分区(partition)的集合,每个partition是不可分割的
实际数据块的描述(实际数据到底存在哪,或者不存在)
其值依赖于哪些partition

RDD特性:

RDD不包含待处理数据,真正的数据之中有在执行的时候才加载出来
加载数据的主要来源:
1、Spark外部 => HDFS
2、Spark内部 => 其他RDD

RDD的关键特征:

– RDD使用户能够显式将计算结果保存在内存中,控制数据的划分,并使用更丰富的操作集合来处理
– 使用更丰富的操作来处理,只读(由一个RDD变换得到另一个RDD,但是不能对本身的RDD修改)
– 记录数据的变换而不是数据本身保证容错(lineage)
– 通常在不同机器上备份数据或者记录数据更新的方式完成容错,但这种对任务密集型任务代价很高
– RDD采用数据应用变换(map,filter,join),若部分数据丢失,RDD拥有足够的信息得知这部分数据是如何计算得到的,可通过重新计算来得到丢失
的数据
– 这种恢复数据方法很快,无需大量数据复制操作,可以认为Spark是基于RDD模型的系统
– 懒操作,延迟计算,action的时候才操作,(transform不会真正执行,只有当遇到action后才会开始执行)
– 瞬时性,用时才产生,用完就释放

RDD创建方式

– 通过读取文件生成的

• val a = sc.textFile(“/xxx/yyy/file”) – 通过并行化的方式创建RDD
等价于 val a = spark.sparkContext.textFile()
• val array = Array(1,2,3,4,5)
• val rdd = sc.parallelize(array)

• 其他方式(其他的RDD转换, 或者读取数据库的方式等等)

• Spark针对RDD提供两类操作:transformations和action

– transformations是RDD之间的变换,action会对数据执行一定的操作

– transformations采用懒策略,仅在对相关RDD进行action提交时才触发计算

sparkrdd的两种初始化方式 spark中rdd_spark


spark 核心 - RDD窄依赖和宽依赖

• 窄依赖: 指的是每一个父RDD的Partition最多被子RDD的一个Partition使用任务可以在本地

执行,不需要shuffle 常见算子:map flatmap filter union sample 等等

宽依赖: 指的是多个子RDD的Partition会依赖同一个父RDD的Partition;除非父RDD是hash- partitioned, 需要shuffle 常见算子:groupByKey reduceByKey sortByKey join 等等

sparkrdd的两种初始化方式 spark中rdd_sparkrdd的两种初始化方式_02

DAG(有向五环图)

RDD相互依赖形成连线

sparkrdd的两种初始化方式 spark中rdd_分布式_03

•从后往前,将宽依赖的边删掉,连通分量及其在原图中所有依赖的RDD,构成一个stage
• DAG是在计算过程中不断扩展 , 在action后才会启动计算
• 每个stage内部尽可能多地包含一组具有窄依赖关系的转换,并将它们流水线并行
化(pipeline)