一 弹性分布式数据集(RDD)
1 RDD
存放数据的集合,数据是分布式存储的,可以保存在内存或磁盘中。是spark中最基本的数据抽象)
2 RDD五大属性
- 分区列表
- 作用于分区中得到函数
- RDD之前的依赖关系:每次一个RDD通过函数操作会生成新的RDD(spark容错机制的依据:会根据依赖关系进行数据恢复)
- 分区函数 * 只有k-v类型的RDD 才有分区函数(必须产生shuffle)
- 一个列表,存储每个Partition的最优位置
3 为什么会产生RDD
解决了mapReduce 不能循环式的数据流模型。可以把RDD的结果数据进行缓存,方便多次重用可迭代计算,避免重复计算。提示IO操作。
4 RDD是Spark中的底层核心,Spark是这个抽象方法的实现。 迭代运算 和 交互式
5 创建RDD
(1)通过sparkContext调用parallelize方法,需要一个已经存在的Scala集合创建
val rdd1 = sc.parallelize(集合/数组)
(2)由外部存储系统的文件创建
val rdd2=sc.textFile(“xxx”)
(3)已有的RDD经过算子转换生成新的RDD
val rdd3=rdd2.flatMap(_.split(" "))
6 RDD算子:Transformation和Action
处理RDD数据的函数方法
Transformation算子:属于延迟计算,当一个RDD转换成另一个RDD时并不立即进行转换,而是记住了数据集的逻辑操作。
Action算子:触发Spark作业的运行,真正触发转换算子的计算
Transformation 常见算子:
map、filter、flatMap、mapPartitions(这四个面试常问到)、mapPartitionsWithIndex、union(并集)、intersection(交集)、distinct(去重)、groupByKey、reduceByKey(聚合)、sortBy、sortByKey、join(相同key提取,v依次排在后面)、cogroup、coalesce、repartition、repartitionAndSortWithKey
mapParitions和map的区别 :一个只作用于分区,一个作用于每个元素 ???
Action 常见算子:
reduce、collect、count、first、take、takeOrdered、saveAsTextFile、saveAsObjectFile、countByKey、foreach、foreachPartition
7 宽依赖与窄依赖
宽依赖:父RDD的分区被子RDD的多个分区使用 例如 groupByKey、reduceByKey、sortByKey等操作会产生宽依赖,会产生shuffle
窄依赖:父RDD的每个分区都只被子RDD的一个分区使用 例如map、filter、union等操作会产生窄依赖
Lineage(血统)
记录RDD的元数据信息和转换行为。如果当前RDD的某些分区数据丢失后,可以通过血统来恢复丢失的分区。血统应该存在Application里面
RDD的缓存
把rdd1的数据进行缓存,以便之后对其能快速读取。
8 RDD的缓存方式
persist方法: 可以设置丰富的存储级别。 如:设置 序列化、内存、磁盘、几份 等
cache方法: 默认保存在内存中,本质调用的是persist的默认方法 即保存在内存中。
对需要进行缓存的RDD调用persist和cache,不会立即执行,而是有action算子时候才真正执行缓存操作。
spark有自带的机制,如果数据量太小,没有强制设置缓存在内存 而是正常设置缓存在磁盘 但是依然会存在内存的。
9 DAG
简介:原始的RDD通过一系列的转换就形成了DAG
为什么要划分Stage:就是让每一个Stage中的多任务可以并行的运行,互不干扰,划分给对应的task执行。
划分Stage流程:
1、从最后一个rdd开始往前推,首先把当前rdd加入到一个stage中,这个stage就是最后一个stage
2、如果遇到窄依赖,就把当前rdd加入本stage中,如果遇到宽依赖,就从宽依赖切开,这样最后一个stage就已