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设计与实现》
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 阿里最新开源QwQ-32B,效果媲美deepseek-r1满血版,部署成本又又又降低了!
· AI编程工具终极对决:字节Trae VS Cursor,谁才是开发者新宠?
· Manus重磅发布:全球首款通用AI代理技术深度解析与实战指南
· 开源Multi-agent AI智能体框架aevatar.ai,欢迎大家贡献代码
· 被坑几百块钱后,我竟然真的恢复了删除的微信聊天记录!