大数据
流式处理
Spark
源码解析

Spark源码分析 - 2.1.0版本源码分析系列文章总纲目录

简介:Spark 2.1.0版本源码分析总纲目录

1. 完整注释仓库

本系列博客所使用的Spark版本是2.1.0,博主在Github中Fork了官方的仓库,在2.1.0-code-analyze分支有完整注释版的代码,仓库地址:

https://github.com/LennonChin/spark

2. 环境准备

2.1. 版本源码编译及阅读环境搭建

阅读链接:Spark源码分析01 - 2.1.0版本源码编译及阅读环境搭建

  • 1. 使用Maven编译Spark源码
  • 2. 搭建IDEA阅读环境
  • 3. 使用IDEA进行编译
  • 4. 运行Master和Worker

3. 配置管理

3.1. SparkConf配置管理

阅读链接:Spark源码分析02 - SparkConf配置管理

  • 1. SparkConf简介
  • 2. 配置项的设置
  • 3. 配置项的获取
  • 4. 配置项的校验

4. 通信架构

4.1. 传输层原理(1)传输层组件

阅读链接:Spark源码分析03 - 通信架构01:传输层原理(1)传输层组件

  • 1. Spark通信架构简介
  • 2. TransportConf类
  • 3. TransportContext类
  • 4. TransportServer
  • 4.1. 添加ChannelHandler
  • 5. TransportClientFactory
  • 6. TransportClient
  • 6.1. 发送OneWayMessage
  • 6.2. 发送RpcRequest
  • 6.3. 发送ChunkFetchRequest
  • 6.4. 发送StreamRequest
  • 7. TransportServerBootstrap
  • 7.1. SaslServerBootstrap
  • 7.2. EncryptionCheckerBootstrap
  • 8. TransportClientBootstrap
  • 8.1. SaslClientBootstrap
  • 8.2. EncryptionDisablerBootstrap

4.2. 传输层原理(2)消息处理

阅读链接:Spark源码分析04 - 通信架构02:传输层原理(2)消息处理

  • 1. 出入站处理器
  • 1.1. MessageEncoder编码器
  • 1.1.1. Message消息体系
  • 1.2. TransportFrameDecoder帧解码器
  • 1.3. MessageDecoder解码器
  • 1.4. TransportChannelHandler处理器
  • 1.4.1. TransportRequestHandler处理器
  • 1.4.1.1. 处理ChunkFetchRequest
  • 1.4.1.2. 处理StreamRequest
  • 1.4.1.3. 处理RpcRequest
  • 1.4.1.4. 处理OneWayMessage
  • 1.4.1.5. 消息的回复
  • 1.4.1.6. RpcHandler
  • 1.4.1.7. StreamManager
  • 1.4.1.7.1. OneForOneStreamManager
  • 1.4.2. TransportResponseHandler处理器
  • 1.4.2.1. 处理ChunkFetchSuccess
  • 1.4.2.2. 处理RpcResponse
  • 1.4.2.3. 处理StreamResponse
  • 1.4.2.3.1. StreamInterceptor流拦截器
  • 1.4.2.4. 处理Failure消息
  • 2. 传输层架构总结

4.3. 高层实现(1)RpcEnv和Dispatcher

阅读链接:Spark源码分析05 - 通信架构03:高层实现(1)RpcEnv和Dispatcher

  • 1. 通信组件架构
  • 2. RpcEnv
  • 2.1. RpcEndpoint
  • 2.2. RpcEndpointRef
  • 2.3. NettyRpcEnvFactory
  • 3. NettyRpcEnv
  • 3.1. NettyRpcEnv实现的方法
  • 3.1.1. RpcEndpoint相关
  • 3.1.2. 下载文件流相关
  • 3.1.3. 其他辅助方法
  • 3.2. NettyRpcEnv中的组件
  • 4. Dispatcher
  • 4.1. EndpointData
  • 4.2. RpcEndpoint的维护
  • 4.2.1. 注册RpcEndpoint
  • 4.2.2. 获取RpcEndpointRef
  • 4.2.3. 移除RpcEndpoint
  • 4.2.4. 关闭RpcEndpoint
  • 4.3. Inbox
  • 4.4. 消息的处理
  • 4.4.1. OnStart消息的处理
  • 4.4.2. OnStop消息的处理
  • 4.5. 消息的投递
  • 4.5.1. 私有投递方法
  • 4.5.2. 投递OneWayMessage
  • 4.5.3. 投递来自远端RpcEndpoint的消息
  • 4.5.4. 投递本地消息
  • 4.5.5. 投递消息的回调
  • 4.6. 终止消息处理

4.4. 高层实现(2)RpcHandler与消息的处理

阅读链接:Spark源码分析06 - 通信架构04:高层实现(2)RpcHandler与消息的处理

  • 1. NettyRpcHandler
  • 1.1. 处理Channel状态
  • 1.1.1. Channel Active
  • 1.1.2. Exception Caught
  • 1.1.3. Channel Inactive
  • 1.2. 处理消息接收
  • 1.3. 获取StreamManager
  • 2. RpcEndpoint的启动
  • 3. 消息发送
  • 3.1. 发送需要回复的消息
  • 3.2. 发送无需回复的消息
  • 3.3. postToOutbox方法
  • 3.3.1. Outbox
  • 3.3.2. OutboxMessage
  • 4. Inbox中的消息处理
  • 4.1. RpcMessage
  • 4.2. OneWayMessage
  • 4.3. RemoteProcess相关消息

4.5. 事件总线

阅读链接:Spark源码分析07 - 通信架构05:事件总线

  • 1. 事件总线简介
  • 2. ListenerBus
  • 3. SparkListenerBus
  • 3.1. SparkListenerInterface
  • 4. LiveListenerBus
  • 4.1. 事件处理
  • 4.2. 事件投递
  • 4.3. 等待LiveListenerBus空闲
  • 4.4. 启动和停止LiveListenerBus
  • 5. ReplayListenerBus
  • 6. StreamingQueryListenerBus
  • 7. StreamingListenerBus

5. 存储体系

5.1. 辅助类

阅读链接:Spark源码分析08 - 存储体系01:辅助类

  • 1. Spark存储体系简介
  • 2. BlockManager初识
  • 3. 存储体系的RpcEnv
  • 4. 辅助状态类
  • 4.1. BlockManagerId
  • 4.2. BlockId
  • 4.3. StorageLevel
  • 4.4. BlockStatus
  • 4.5. BlockInfo
  • 5. BlockInfoManager
  • 5.1. 锁记录维护
  • 5.2. 读锁定
  • 5.3. 写锁定
  • 5.4. 释放锁
  • 5.5. 锁降级
  • 5.6. 判断读锁持有
  • 5.7. 释放所有锁
  • 5.8. 添加新的BlockInfo
  • 5.9. 移除BlockInfo
  • 5.10. 清空所有记录
  • 6. BlockManagerInfo
  • 6.1. 更新数据块状态
  • 6.2. 移除数据块

5.2. 通信层(1)消息通信

阅读链接:Spark源码分析09 - 存储体系02:通信层(1)消息通信

  • 1. 通信层结构
  • 2. BlockManagerMaster
  • 2.1. 注册BlockManager
  • 2.2. 移除指定的Executor
  • 2.3. 移除指定的数据块
  • 2.4. 移除指定的RDD的所有数据块
  • 2.5. 移除指定的Broadcast的所有数据块
  • 2.6. 移除指定的Shuffle的所有数据块
  • 2.7. 更新指定的数据块的信息
  • 2.8. 判断是否管理着指定的数据块
  • 2.9. 判断Executor是否缓存了数据块
  • 2.10. 获取指定数据块的状态
  • 2.11. 获取Executor的RpcEndpointRef
  • 2.12. 获取指定数据块的位置信息
  • 2.13. 获取匹配的数据块
  • 2.14. 获取所有BlockManager的内存状态
  • 2.15. 获取所有BlockManager的存储状态
  • 2.16. 获取BlockManager的标识集合
  • 2.17. 停止BlockManager
  • 3. BlockManagerMasterEndpoint
  • 3.1. 对消息进行路由
  • 3.2. 处理RegisterBlockManager消息
  • 3.3. 处理RemoveExecutor消息
  • 3.4. 处理RemoveBlock消息
  • 3.5. 处理RemoveRdd消息
  • 3.6. 处理RemoveBroadcast消息
  • 3.7. 处理RemoveShuffle消息
  • 3.8. 处理UpdateBlockInfo消息
  • 3.9. 处理HasCachedBlocks消息
  • 3.10. 处理GetBlockStatus消息
  • 3.11. 处理GetExecutorEndpointRef消息
  • 3.12. 处理GetLocations消息
  • 3.13. 处理GetLocationsMultipleBlockIds消息
  • 3.14. 处理GetMatchingBlockIds消息
  • 3.15. 处理GetMemoryStatus消息
  • 3.16. 处理GetStorageStatus消息
  • 3.17. 处理GetPeers消息
  • 3.18. 处理StopBlockManagerMaster消息
  • 4. BlockManagerSlaveEndpoint
  • 4.1. 对消息进行路由
  • 4.2. 异步执行方法
  • 4.3. 处理RemoveBlock消息
  • 4.4. 处理RemoveRdd消息
  • 4.5. 处理RemoveShuffle消息
  • 4.6. 处理RemoveBroadcast消息
  • 4.7. 处理GetBlockStatus消息
  • 4.8. 处理GetMatchingBlockIds消息

5.3. 通信层(2)数据传输

阅读链接:Spark源码分析10 - 存储体系03:通信层(2)数据传输

  • 1. BlockTransferService
  • 1.1. 充当数据传输客户端
  • 1.1.1. 拉取数据
  • 1.1.1.1. OneForOneBlockFetcher
  • 1.1.1.2. RetryingBlockFetcher
  • 1.2. 充当数据传输服务端
  • 1.2.1. NettyBlockRpcServer
  • 1.2.2. 处理OpenBlocks消息
  • 1.2.3. 处理UploadBlock消息
  • 2. BlockManager的初始化
  • 3. 总结

5.4. 存储层(1)内存池

阅读链接:Spark源码分析11 - 存储体系04:存储层(1)内存池

  • 1. 存储层简介
  • 2. 内存存储
  • 3. 内存池
  • 3.1. ExecutionMemoryPool
  • 3.1.1. 申请内存
  • 3.1.2. 释放内存
  • 3.2. StorageMemoryPool
  • 3.2.1. 申请内存
  • 3.2.2. 释放内存
  • 3.2.3. 缩小内存池大小

5.5. 存储层(2)内存管理器

阅读链接:Spark源码分析12 - 存储体系05:存储层(2)内存管理器

  • 1. 内存管理器简介
  • 2. MemoryManager
  • 2.1. 对存储内存的操作
  • 2.2. 对执行内存的操作
  • 2.3. Tungsten存储
  • 2.3.1. MemoryLocation和MemoryBlock
  • 2.3.2. HeapMemoryAllocator
  • 2.3.3. UnsafeMemoryAllocator
  • 3. StaticMemoryManager
  • 3.1. 内存划分
  • 3.2. 申请存储内存
  • 3.3. 申请展开存储内存
  • 3.4. 申请执行内存
  • 4. UnifiedMemoryManager
  • 4.1. 内存划分
  • 4.2. 动态调整
  • 4.3. 申请存储内存
  • 4.4. 申请展开存储内存
  • 4.5. 申请执行内存

5.6. 存储层(3)内存存储的具体实现

阅读链接:Spark源码分析13 - 存储体系06:存储层(3)内存存储的具体实现

  • 1. 内存存储具体实现
  • 2. MemoryEntry
  • 3. MemoryStore
  • 3.1. 保留与释放展开内存
  • 3.2. 写入操作
  • 3.3. 获取操作
  • 3.4. 辅助操作
  • 3.5. 驱逐操作
  • 3.6. 清理操作

5.7. 存储层(4)磁盘存储与序列化

阅读链接:Spark源码分析14 - 存储体系07:存储层(4)磁盘存储与序列化

  • 1. 磁盘存储
  • 1.1. 磁盘数据块管理器
  • 1.1.1. 获取文件
  • 1.1.2. 判断是否包含指定数据块的文件
  • 1.1.3. 创建临时数据块
  • 1.1.4. 关闭DiskBlockManager
  • 1.2. 磁盘存储具体实现
  • 1.2.1. 判断是否包含指定数据块的文件
  • 1.2.2. 获取指定数据块文件大小
  • 1.2.3. 读取指定数据块数据
  • 1.2.4. 向指定数据块写入数据
  • 1.2.5. 移除指定数据块
  • 2. 序列化
  • 2.1. SerializerManager
  • 2.1.1. 序列化器
  • 2.1.2. 加密
  • 2.1.3. 压缩
  • 2.1.4. 序列化
  • 2.1.5. 反序列化
  • 2.2. Serializer
  • 2.2.1. JavaSerializer
  • 2.3. SerializerInstance
  • 2.3.1. JavaSerializerInstance
  • 2.4. SerializationStream
  • 2.4.1. JavaSerializationStream
  • 2.5. DeserializationStream
  • 2.5.1. JavaDeserializationStream

5.8. 存储层(5)BlockManager解析

阅读链接:Spark源码分析15 - 存储体系08:存储层(5)BlockManager解析

  • 1. BlockManager的构造和初始化
  • 2. 写入操作
  • 2.1. putBytes方法
  • 2.2. putBlockData方法
  • 2.3. putIterator方法
  • 2.4. putSingle方法
  • 2.5. replicate方法
  • 3. 读取操作
  • 3.1. getStatus方法
  • 3.2. getLocalBytes方法
  • 3.3. getRemoteBytes方法
  • 3.4. getLocalValues方法
  • 3.5. getBlockData方法
  • 3.6. get方法
  • 3.7. getSingle方法
  • 3.8. getMatchingBlockIds方法
  • 3.9. getOrElseUpdate方法
  • 4. 锁相关操作
  • 4.1. registerTask方法
  • 4.2. releaseLock方法
  • 4.3. releaseAllLocksForTask方法
  • 4.4. downgradeLock方法
  • 5. 移除操作
  • 5.1. removeBlock方法
  • 5.2. removeRdd方法
  • 5.3. removeBroadcast方法
  • 5.4. dropFromMemory方法
  • 6. 辅助操作
  • 6.1. reregister方法
  • 6.2. getDiskWriter方法

6. 调度系统

6.1. RDD、Partition、Dependency和Stage

阅读链接:Spark源码分析16 - 调度系统01:RDD、Partition、Dependency和Stage

  • 1. RDD
  • 1.1. RDDInfo
  • 2. Partition
  • 2.1. 分区器
  • 2.1.1. HashPartitioner
  • 2.1.2. RangePartitioner
  • 3. Dependency
  • 3.1. RDD与Dependency
  • 3.2. NarrowDependency
  • 3.2.1. OneToOneDependency
  • 3.2.2. RangeDependency
  • 3.2.3. PruneDependency
  • 3.3. ShuffleDependency
  • 4. Stage
  • 4.1. ShuffleMapStage
  • 4.2. ResultStage
  • 4.3. StageInfo

6.2. DAGScheduler

阅读链接:Spark源码分析17 - 调度系统02:DAGScheduler

  • 1. DAGScheduler简介
  • 2. DAGScheduler的定义
  • 3. DAGSchedulerEventProcessLoop
  • 4. Job的提交
  • 4.1. 构建Stage链
  • 4.1.1. 划分Stage
  • 4.1.2. 创建ShuffleMapStage
  • 4.1.3. 创建ResultStage
  • 4.2. 提交ResultStage
  • 4.3. 提交Task
  • 4.3.1. 寻找需要计算的分区
  • 4.3.2. 偏好位置相关
  • 4.3.2.1. 偏好位置的表示
  • 4.3.2.2. 偏好位置的计算
  • 4.3.3. 封装TaskSet并提交
  • 4.3.4. 异常处理
  • 4.3.4.1. 终止Stage
  • 4.3.4.2. 终止相关的Job
  • 4.3.4.3. Job和Stage的清理
  • 4.4. JobWaiter和ActiveJob

6.3. OutputCommitCoordinator和MapOutputTracker

阅读链接:Spark源码分析18 - 调度系统03:OutputCommitCoordinator和MapOutputTracker

  • 1. 输出提交协调器
  • 1.1. OutputCommitCoordinatorEndpoint
  • 1.2. OutputCommitCoordinator
  • 2. Map任务输出跟踪器
  • 2.1. MapOutputTrackerMasterEndpoint
  • 2.2. MapOutputTracker
  • 2.2.1. MapStatus
  • 2.2.1.1. CompressedMapStatus
  • 2.2.1.2. HighlyCompressedMapStatus
  • 2.2.2. MapOutputTracker的方法
  • 2.3. MapOutputTrackerMaster
  • 2.3.1. MessageLoop任务
  • 2.3.2. 注册方法
  • 2.3.3. 获取方法
  • 2.3.4. 其它方法
  • 2.4. MapOutputTrackerWorker
  • 2.5. MapOutputTracker的工作机制

6.4. 调度池详解

阅读链接:Spark源码分析19 - 调度系统04:调度池详解

  • 1. 调度池简介
  • 2. Schedulable
  • 3. Pool
  • 4. TaskSetManager
  • 4.1. Task本地性
  • 4.1.1. TaskLocality
  • 4.1.2. 本地性级别的初始化
  • 4.1.3. 本地性级别的相关操作
  • 4.2. 推测执行
  • 4.2.1. 推测执行的检测
  • 4.2.2. 获取推测执行任务
  • 4.3. 辅助方法
  • 4.3.1. 获取特定的Task
  • 4.3.2. 添加或移除Task
  • 4.3.3. Task的出队
  • 4.3.4. Task的分配
  • 4.3.5. 处理Task运行结果
  • 4.3.6. 拉取结果相关
  • 4.3.7. Executor的变化
  • 4.3.8. 终止运行

6.5. 调度算法和调度池的构建

阅读链接:Spark源码分析20 - 调度系统05:调度算法和调度池的构建

  • 1. 调度池构建器
  • 1.1. FIFOSchedulableBuilder
  • 1.2. FairSchedulableBuilder
  • 2. 调度算法
  • 2.1. FIFOSchedulingAlgorithm
  • 2.2. FairSchedulingAlgorithm
  • 3. 调度池的运作方式

6.6. SchedulerBackend和DriverEndpoint

阅读链接:Spark源码分析21 - 调度系统06:SchedulerBackend和DriverEndpoint

  • 1. SchedulerBackend
  • 2. LocalSchedulerBackend
  • 2.1. 启动
  • 2.2. LocalEndpoint
  • 2.2.1. 处理ReviveOffers消息
  • 2.2.2. 处理StatusUpdate消息
  • 2.2.3. 处理KillTask消息
  • 2.2.4. 处理StopExecutor消息
  • 3. CoarseGrainedSchedulerBackend
  • 3.1. 启动方法
  • 3.2. 申请Executor
  • 3.3. 停止Executor
  • 3.4. 移除Executor
  • 3.5. 停止Executor
  • 3.6. 申请资源并运行Task
  • 3.7. 停止Task
  • 3.8. 重置操作
  • 3.9. 停止方法
  • 3.10. DriverEndpoint
  • 3.10.1. RpcEndpoint相关方法
  • 3.10.1.1. onStart方法
  • 3.10.1.2. onDisconnected方法
  • 3.10.1.3. onStop方法
  • 3.10.2. 辅助方法
  • 3.10.2.1. makeOffers方法
  • 3.10.2.2. launchTasks方法
  • 3.10.2.3. removeExecutor方法
  • 3.10.2.4. disableExecutor方法
  • 3.10.3. 消息处理
  • 3.10.3.1. 处理RegisterExecutor消息
  • 3.10.3.2. 处理RetrieveSparkAppConfig消息
  • 3.10.3.3. 处理StatusUpdate消息
  • 3.10.3.4. 处理ReviveOffers消息
  • 3.10.3.5. 处理KillTask消息
  • 3.10.3.6. 处理StopExecutors消息
  • 3.10.3.7. 处理RemoveExecutor消息
  • 3.10.3.8. 处理StopDriver消息
  • 4. StandaloneSchedulerBackend
  • 4.1. 启动方法
  • 4.2. StandaloneAppClientListener
  • 4.3. 其他方法

6.7. StandaloneAppClient和ClientEndpoint

阅读链接:Spark源码分析22 - 调度系统07:StandaloneAppClient和ClientEndpoint

  • 1. StandaloneAppClient
  • 2. ClientEndpoint
  • 2.1. onStart方法
  • 2.2. onDisconnected
  • 2.3. onNetworkError
  • 2.4. onStop
  • 2.5. 消息处理
  • 2.5.1. RegisteredApplication
  • 2.5.2. ApplicationRemoved
  • 2.5.3. RequestExecutors
  • 2.5.4. ExecutorAdded
  • 2.5.5. ExecutorUpdated
  • 2.5.6. KillExecutors
  • 2.5.7. MasterChanged
  • 2.5.8. StopAppClient

6.8. TaskScheduler

阅读链接:Spark源码分析23 - 调度系统08:TaskScheduler

  • 1. TaskScheduler简介
  • 2. TaskSchedulerImpl
  • 2.1. 启动
  • 2.2. 提交作业
  • 2.3. 分配资源
  • 2.4. Task状态更新
  • 2.5. 处理执行成功的Task
  • 2.6. 处理执行失败的Task
  • 2.7. 推测执行
  • 2.8. 取消Task
  • 2.9. 处理已完成的TaskSetManager
  • 2.10. 处理Executor被添加
  • 2.11. 处理Executor丢失
  • 2.12. 处理Executor的心跳
  • 3. TaskResultGetter
  • 3.1. 处理成功Task的结果
  • 3.2. 处理失败Task的结果
  • 4. DAGScheduler对结果的处理

7. 计算引擎

7.1. CoarseGrainedExecutorBackend、Executor和TaskRunner

阅读链接:Spark源码分析24 - 计算引擎01:CoarseGrainedExecutorBackend、Executor和TaskRunner

  • 1. Application运行流程
  • 2. CoarseGrainedExecutorBackend
  • 2.1. 启动
  • 2.2. 启动Task
  • 2.3. 其他消息处理
  • 2.3.1. RegisterExecutorFailed
  • 2.3.2. KillTask
  • 2.3.3. StopExecutor
  • 2.3.4. Shutdown
  • 2.4. 其他方法
  • 3. Executor
  • 3.1. 心跳操作
  • 3.2. 启动Task
  • 3.3. 终止Task
  • 3.4. 类加载器相关
  • 3.5. 更新依赖文件
  • 3.6. 停止Executor
  • 4. TaskRunner
  • 4.1. 运行Task
  • 4.1.1. 运行准备
  • 4.1.2. 运行
  • 4.1.3. 资源回收
  • 4.1.4. 序列化运行结果
  • 4.1.5. 更新度量信息
  • 4.1.6. 将结果反馈给Driver
  • 4.2. 终止Task
  • 4.3. 处理运行异常

7.2. Task、TaskContxt和TaskMemoryManager

阅读链接:Spark源码分析25 - 计算引擎02:Task、TaskContxt和TaskMemoryManager

  • 1. Task
  • 1.1. 运行Task
  • 1.2. 其他方法
  • 2. TaskContext
  • 2.1. TaskContextImpl
  • 3. TaskMemoryManager
  • 3.1. MemoryConsumer
  • 3.1.1. 内存的申请与释放
  • 3.1.2. 溢写
  • 3.2. 内存管理相关
  • 3.2.1. 执行内存管理
  • 3.2.2. 页内存管理
  • 3.2.3. 页管理
  • 3.2.3.1. 定位内存页
  • 3.2.3.2. 定位偏移量
  • 3.2.3.3. 页号与偏移量的编码
  • 3.2.4. 内存相关的其他操作
  • 4. ShuffleMapTask
  • 5. ResultTask

7.3. RDD的迭代计算

阅读链接:Spark源码分析26 - 计算引擎03:RDD的迭代计算

  • 1. RDD的迭代计算
  • 2. MapPartitionsRDD
  • 3. HadoopRDD
  • 4. ShuffledRDD
  • 4.1. 依赖
  • 4.2. 分区
  • 4.3. 偏好位置
  • 4.4. 计算

7.4. Shuffle过程(1)ShuffleManager和IndexShuffleBlockResolver

阅读链接:Spark源码分析27 - 计算引擎04:Shuffle过程(1)ShuffleManager和IndexShuffleBlockResolver

  • 1. ShuffleManager
  • 2. SortShuffleManager
  • 2.1. 注册Shuffle过程
  • 2.2. 取消Shuffle过程的注册
  • 2.3. 获取ShuffleWriter
  • 2.4. 获取ShuffleReader
  • 3. IndexShuffleBlockResolver
  • 3.1. 获取索引文件
  • 3.2. 获取数据文件
  • 3.3. 删除Shuffle文件
  • 3.4. 写入索引文件
  • 3.5. 校验索引文件和数据文件
  • 3.6. 获取指定的Shuffle数据块
  • 4. FileSegmentManagedBuffer

7.5. Shuffle过程(2)ShuffleExternalSorter

阅读链接:Spark源码分析28 - 计算引擎05:Shuffle过程(2)ShuffleExternalSorter

  • 1. ShuffleInMemorySorter
  • 1.1. PackedRecordPointer
  • 1.1.1. 指针转换
  • 1.1.2. 解码分区号
  • 1.2. SortComparator
  • 1.3. 初始化
  • 1.4. 辅助方法
  • 1.5. 扩容
  • 1.6. 添加索引记录
  • 1.7. 迭代操作
  • 1.8. 重置排序器
  • 1.9. 释放内存
  • 2. ShuffleExternalSorter
  • 2.1. 申请新的内存页
  • 2.2. 扩容存放索引的内存
  • 2.3. 插入记录
  • 2.4. 写出索引数据
  • 2.5. 溢写
  • 2.6. 清理资源
  • 2.7. 关闭排序器

7.6. Shuffle过程(3)键值对聚合及排序容器

阅读链接:Spark源码分析29 - 计算引擎06:Shuffle过程(3)键值对聚合及排序容器

  • 1. 初识ExternalSorter
  • 2. SizeTracker
  • 2.1. 重置采样器
  • 2.2. 采样操作
  • 2.3. 触发采样的时机
  • 2.4. 估算大小
  • 3. WritablePartitionedPairCollection
  • 3.1. 插入元素
  • 3.2. 获取迭代器
  • 3.3. 元素的迭代写出
  • 4. AppendOnlyMap
  • 4.1. 更新元素
  • 4.2. 扩容
  • 4.3. 获取元素
  • 4.4. 聚合
  • 4.5. 迭代
  • 5. SizeTrackingAppendOnlyMap
  • 6. PartitionedAppendOnlyMap
  • 7. PartitionedPairBuffer
  • 7.1. 扩容
  • 7.2. 插入键值对
  • 7.3. 迭代

7.7. Shuffle过程(4)ExternalSorter

阅读链接:Spark源码分析30 - 计算引擎07:Shuffle过程(4)ExternalSorter

  • 1. Spillable
  • 1.1. 检测是否需要溢写
  • 1.2. 强制溢写
  • 1.3. 释放内存
  • 2. ExternalSorter
  • 2.1. ExternalSorter的定义
  • 2.2. 插入数据
  • 2.3. 检测是否需要溢写
  • 2.4. 溢写操作
  • 2.5. 强制溢写
  • 2.6. SpillableIterator
  • 2.7. 写出分区的数据
  • 2.8. 合并数据
  • 2.8.1. 无溢写文件
  • 2.8.1.1. 分区迭代器
  • 2.8.2. 有溢写文件
  • 2.8.2.1. SpillReader
  • 2.8.2.2. 无需聚合及排序的合并
  • 2.8.2.3. 仅需要排序的合并
  • 2.8.2.4. 需要排序并聚合的合并
  • 2.9. 停止ExternalSorter
  • 2.10. 总结

7.8. Shuffle过程(5)ShuffleWriter

阅读链接:Spark源码分析31 - 计算引擎08:Shuffle过程(5)ShuffleWriter

  • 1. ShuffleWriter
  • 2. UnsafeShuffleWriter
  • 2.1. 构造过程
  • 2.2. 写出记录
  • 2.2.1. 插入记录
  • 2.2.2. 合并溢写文件
  • 2.2.2.1. 文件流形式合并
  • 2.2.2.2. TransferTo形式合并
  • 2.3. 其他操作
  • 3. SortShuffleWriter
  • 3.1. 构造过程
  • 3.2. 写出记录
  • 3.3. 关闭操作
  • 4. BypassMergeSortShuffleWriter
  • 4.1. 构造过程
  • 4.2. 写出记录
  • 4.3. 合并文件
  • 4.4. 关闭操作
  • 5. MapStatus的处理

7.9. Shuffle过程(6)ShuffleReader

阅读链接:Spark源码分析32 - 计算引擎09:Shuffle过程(6)ShuffleReader

  • 1. Reduce任务数据读取
  • 2. ShuffleReader
  • 3. BlockStoreShuffleReader
  • 3.1. ShuffleBlockFetcherIterator
  • 3.1.1. 初始化
  • 3.1.2. 划分数据块获取请求
  • 3.1.3. 远程拉取
  • 3.1.4. 本地读取
  • 3.1.5. 迭代操作
  • 3.1.6. 清理操作
  • 3.2. 处理拉取的数据

7.10. Shuffle过程(7)ExternalAppendOnlyMap

阅读链接:Spark源码分析33 - 计算引擎10:Shuffle过程(7)ExternalAppendOnlyMap

  • 1. ExternalAppendOnlyMap的定义
  • 2. 插入数据
  • 3. 溢写操作
  • 4. 迭代操作
  • 4.1. 未发生溢写时的迭代
  • 4.2. 发生溢写后的迭代
  • 4.2.1. DiskMapIterator
  • 4.2.1.1. hasNext方法
  • 4.2.1.2. next方法
  • 4.2.1.3. 清理操作
  • 4.2.2. ExternalIterator
  • 4.2.2.1. 迭代器初始化
  • 4.2.2.2. hashNext方法
  • 4.2.2.3. next方法
  • 5. 总结