Spark书籍笔记

1、MapReduce相比Spark

1)MapReduce

编程模型表达能力弱,只有map和reduce(map-shuffle-reduce)、难以实现复杂的数据操作

处理流程固定,难以实现迭代式计算

数据基于磁盘进行传递,效率较低

2)Spark

抽象出RDD的数据结构,DAG图组合数据处理操作,表达能力强

灵活的数据结构和依赖关系

自动并行化执行,开发人员仅编写普通程序即可

缺点:

单向操作,中间数据不可修改

粗粒度,每个分区操作不可以不同,只能最后聚合到一起操作

2、大数据处理框架的四层架构

用户层:<输入数据,用户代码,配置参数>

分布式数据并行处理层:将用户提交的应用转化为较小的计算任务,然后通过调用底层的资源管理与任务调度层实现并行执行

资源管理与任务调度层:将用户提交的应用及其任务按照一定的策略进行调度执行

物理执行层:负责启动任务,执行每个任务的数据处理步骤

3、系统架构

1)Master-Worker

Master:负责管理应用和任务

Worker:负责执行任务

2)概念

Spark application:指一个可运行的Spark程序,包括配置参数

Spark Driver:驱动程序,运行应用的main函数产生的进程

Executor:执行器,计算资源的一个单位,物理上是一个JVM进程

Task:计算任务,会将应用拆分成多个task分配给Executor执行

4、逻辑处理流程

1)宽依赖与窄依赖

区别:子RDD的各个分区是否完全依赖父RDD的一个或多个分区(父RDD中的某个分区数据是否被拆开输出)

2)分区

水平划分:按照record的索引进行划分

Hash划分:按照record的hash值对数据划分

Range划分:按照元素的大小关系划分,比如1-100的数字,先将上边界和下边界划分为若干份,再将每个数字划分到对应分区,最后对分区进行排序

5、物理执行计划

1)根据action操作生成job

每个action操作生成一个job

2)根据宽依赖关系将job划分成stage

从最后的RDD向前回溯,遇到窄依赖继续回溯,遇到宽依赖就停止并将已经回溯的所有RDD按照依赖关系建立一个执行阶段

3)根据分区计算将stage划分成task

根据stage的最后一个RDD的分区个数决定生成的task数量

6、shuffle机制

1)计算顺序

ShuffleWrite

map输出 -> 数据聚合 -> 数据排序 -> 分区 -> 输出

ShuffleRead

数据获取 -> 数据聚合 -> 数据排序 -> 输出

2)种类

ShuffleWrite

BypassMergeSortShuffleWrite:不需要聚合排序的情况,直接计算partitionId(PID),先输出到buffer中(因为map输出的速度很快需要缓冲),填满就溢写到磁盘的分区文件中

优点:速度很快

缺点:每个分区都需要一个buffer(默认32k),适合分区数较少的情况

SortShuffleWrite:不需要聚合但需要排序的情况,建立一个类似Array的结构存放数据,按照数据的key+PID进行排序,最后将所有写入到一个文件中,通过建立索引来标示分区,Array存不下就会扩容,如果还存不下就溢写到磁盘中,最终进行全局排序(Spark还没有提供这种数据操作,但不排除用户会自定义)

优点:只需要一个Array结构就可以将key+PID进行排序,只需一个分区文件进行存储

缺点:排序增加时延

sort-based ShuffleWrite:需要聚合,需要或者不需要排序的情况,建立一个类似HashMap+Array的数据结构进行聚合(在线聚合)与排序,如果HashMap存不下先扩容为两倍大小,还存不下就排序溢写到磁盘中,这时已经清空HashMap,可以继续重复这个操作。最终HashMap与磁盘数据进行全局聚合后输出到分区文件中

优点:只需要一个HashMap结构就可以将map端进行聚合,也适用于分区数大的情况,聚合后使用Array排序满足不同排序需求

缺点:内存中聚合,内存消耗较大,最后还需全局聚合

ShuffleRead

同上,不包括分区操作

3)数据结构

AppendOnlyMap

只支持record添加和对value更新的HashMap,只用数组存放元素,根据Hash值确定位置,发生冲突时,使用二次地址探测法解决

如果利用率达到70%扩张一倍,之前的Hash失效,需要进行重Hash排列key的位置,但只能使用内存

ExternalAppendOnlyMap

内存+磁盘,可全局聚合。

PartitionedAppendOnlyMap

同上,只是排序根据partitionId+key

PartitionedPairBuffer

本质上是一个基于内存+磁盘的Array,随数据不断添加扩容,当达到内存限制时,将数据按照partitionId或partitionId+key进行排序,然后溢写到磁盘上,最终进行全局排序

4)与Mapreduce区别

Mapreduce是严格按照key排序的,并且在此阶段只能排序不能聚合,所以要等到数据都溢写到磁盘之后再启动一个专门的聚合阶段。

7、数据缓存机制

缓存数据,避免重复计算,提高读取和计算速度,是一种空间换时间的思想

1)需要缓存的数据

会被重复使用的数据、数据不宜过大、非重复缓存的数据(已经缓存过的数据的血缘关系)

2)缓存的替代与回收机制

LRU(最近最久未使用)策略,利用了LinkedHashMap自带的LRU算法

3)与MapReduce对比

MapReduce的DistributedCache缓存机制不是用于存放job运行的中间结果的,而是用于缓存job运行所需文件的。并且将缓存的数据放在每个worker的本地磁盘而不是内存中

spark缓存机制缺点:缓存的RDD数据是只读的,不能修改。不能根据RDD的生命周期进行自动缓存替换

8、错误容忍机制

1)核心方法

通过重新执行计算来容忍错误

通过checkpoint机制,对重要的输入/输出以及中间数据进行持久化,可提高重新计算的效率

2)checkpoint

需要checkpoint的数据:RDD的数据依赖关系比较复杂计算代价较高,比如关联的数据较多、计算链过长、被多次重复利用等

时机以及计算顺序:如果每计算出RDD就将其持久化效率太低,所以Spark将用户设置的checkpoint的RDD启动额外的job再计算一次,会多一个job任务,Spark推荐用户先进行缓存,这样只需将缓存的数据进行checkpoint即可

3)checkpoint与缓存的区别

目的不同:checkpoint目的是在job失败后能快速回复计算,缓存的目的是加速计算

存储方式不同:checkpoint为了可靠一般存储在分布式文件系统中,而缓存为了加速计算主要使用内存,偶尔使用磁盘

写入速度不同:checkpoint启动专门的job写到磁盘速度慢,缓存写入速度快

对lineage(血缘关系)影响不同:checkpoint因为已经可靠存储不需要再保存该RDD的lineage,缓存对lineage没有影响

应用场景不同:checkpoint应用于RDD重新计算代价较大的场景,缓存应用于RDD被多次使用且占用空间不大的场景

9、内存管理机制

1)统一内存管理模型

将内存换分成三个分区:数据缓存空间、框架执行空间、用户代码空间,且为前两个设置了初始比例并可以根据执行过程动态调整。

2)Executor JVM的内存空间

系统保留空间:使用较小的空间保存Spark存储产生的对象,默认300M

用户代码空间:用户代码生成的对象空间,默认约为40%

框架内存空间:包括框架执行空间和数据缓存空间

3)数据缓存空间管理

存放的数据:RDD缓存数据、广播数据、task的执行结果

数据缓存空间最主要的是存储RDD的缓存数据,剩下两种采用内存+磁盘进行存储,内存不足时放入磁盘

内容来源书籍:《大数据处理框架Apache Spark设计与实现》

posted @ 2022-01-10 09:26  Leil_blogs  阅读(56)  评论(0编辑  收藏  举报