3,spark源码分析-SparkContext初始化

我们在driver中启动用户线程之后,就进入了用户的Main-class。在样例中,我们首先实例化一个SparkSession, 在sparkSession中初始化SparkContext.
在这里插入图片描述
在这里插入图片描述
SparkContext实例化的过程是一个比较复杂的过程,初始化的东西比较多。包括SparkEnv, spark-history, 心跳,状态追踪,广播,资源/任务调度,底层通信。下图是从网友博客找到的SparkContext包含的比较重要的组件,以下我从SparkContext实例化过程中组件初始化的顺序对各个组件进行一些简单分析
在这里插入图片描述

EventLog

Spark History Server服务可将App的事件日志存储到Hdfs中看,一般来说一个Spark Job对应一个事件日志,通过分析这些事件日志,我们可以发现一些应用中的错误和待提升的点,从而进一步去优化应用性能。以下是一些我自己比较常用的配置。

spark.eventLog.enabled  true
spark.eventLog.compress true
spark.executor.logs.rolling.maxSize     10000000
spark.executor.logs.rolling.maxRetainedFiles 10
spark.eventLog.dir      hdfs://****

LiveListenerBus

sparkListener主线,主要在driver端注册各种sparkListener, 接收各种executor发送过来的SparkListenerEvent. 具体的实现类在SparkListenerBus。这个地方可以加个扩展,针对spark的读写记录可以在这个地方加上。
在这里插入图片描述

SparkEnv

  • SparkEnv是spark的运行环境,用于通信的RpcEnv,序列化的SerializerManager,ShuffleManager、BroadcastManager、BlockManager,MemoryManager等用于管理Shuffle,broadcast,block和memory的组件。
  • SparkEnv运行于driver和executor(createDriverEnv,createExecutorEnv,分别用于创建Driver端和Executor端的SparkEnv对象)。
RPC通讯

主要是executor和driver之间的通信,包括各种心跳,状态,数据交换。底层是通过Netty实现。
new NettyRpcEnvFactory().create(config)

实例化serializer

默认使用org.apache.spark.serializer.JavaSerializer, 在生产环境可以考虑org.apache.spark.serializer.KryoSerializer, 性能会更好

  • spark.broadcast.compress=true
  • spark.shuffle.compress=true
  • spark.rdd.compress=false
  • spark.shuffle.spill.compress=true
BroadcastManager

主要用于Broadcast场景,具体的实现类是TorrentBroadcast。
把共享的状态,元数据信息广播出去。
把数据序列化成小块,存储在driver端的BlockManager, 当一个executor第一次尝试获取这些对象从executor的blockManager的时候,如果不存在,就通过rpc的方式从driver端获取/或者从其他已经有的executor上获取并放入自己的blockManager中,方便其他executor获取。

mapOutputTracker
  • 用于跟踪Map阶段stage的输出状态,此状态便于Reduce阶段任务获取地址及中间结果。比如每个Map任务或者Reduce任务都会有其唯一的标识,分别为mapId 和 reduceId。

  • MapOutputTracker 有两个子类:MapOutputTrackerMaster(for driver) 和 MapOutputTrackerWorker(for executors);

MapOutTrackerMaster 内部维护了一个hashMap存储shuffleStatus, mapoutStatus. shuffleDataSize, MapoutDataSize. shuffle,mapout的状态通过executor传递给driver. 里面还包含了一些统计shuflle, mapout的数据,为下游处理结果数据提供参照。

MapOutputTrackerWorker 主要是是从driver端的MapOutTrackerMaster拉取mapoutinfo数据。

在这里插入图片描述

ShuffleManager

ShuffleManager负责管理本地及远程的Block数据的shuffle操作。Spark 2.x.x 版本提供 sort 和 tungsten-sort 两种 ShuffleManager 的实现。无论是 sort 还是 tungsten-sort,我们看到实现类都是 SortShuffleManager。
关于具体的详情,可以关注后续的博客。这里就不多做介绍。

MemoryManager

默认的内存管理器是 UnifiedMemoryManager;而UnifiedMemoryManager 是在Spark1.6中增加了一个新的内存管理模型,该模型可以使得execution部分和storage部分的内存不像之前的(StaticMemoryManager)由比例参数限定住,而是两者可以互相借用空闲的内存
关于具体的详情,可以关注后续的博客。这里就不多做介绍。

BlockManager
  • BlockManager 是spark的分布式存储系统,运行于所有节点上。
  • driver端的是BlockManagerMaster. executor端的是BlockManager. BlockManagerMaster负责接收Executor上的BlockManager的注册一级管理BlockManager的元数据信息。

BlockManager运行于driver和executor. 对整个集群的 Block 数据进行管理(内存,磁盘,off-heap), Block 是 Spark 数据管理的 单位

OutputCommitCoordinator

当 Spark 应用程序使用了 Spark SQL (包括 Hive)或者需要将任务的输出保存到 HDFS 时,就会用到输出提交协调器 OutputCommitCoordinator,OutputCommitCoordinator 将决定任务是否可以提交输出到 HDFS。无论是 Driver 还是 Executor,在 SparkEnv 中都包含了子组件 OutputCommitCoordinator

SparkStatusTracker

从AppStatusStore-kv从获取

ConsoleProgressBar

SparkUI

HeartbeatReceiver

createTaskScheduler

在这里插入图片描述

ExternalClusterManager

ExternalClusterManager => YarnClusterManager
TaskScheduler => YarnClusterScheduler
SchedulerBackend => YarnClusterSchedulerBackend

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
_taskScheduler.start()最终会调用YarnClusterSchedulerBackend.start(); 主要做了两件事请
在这里插入图片描述
得到初始化的executor数量。

在这里插入图片描述

DAGScheduler

DAG调度是整个调度的核心,包括触发task的开始,停止,kill等等。这个后续会详细介绍。

EventLoggingListener

ExecutorAllocationManager

在这里插入图片描述
在这里插入图片描述
增加删除的逻辑是根据业务总需求的task/每个executor的task来判断的。具体逻辑可以参考下面的博文:
https://blog.csdn.net/run_bigdata/article/details/102665153

几个参数
  • spark.dynamicAllocation.minExecutors 默认值为0
  • spark.dynamicAllocation.maxExecutors 可以限制最大使用的资源量,可以参照资源的总量和并发数。
  • spark.dynamicAllocation.initialExecutors 默认值等于最小值

ContextCleaner

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值