|NO.Z.00080|——————————|BigDataEnd|——|Hadoop&Spark.V06|——|Spark.v06|Spark 原理 源码|Spark Context&Spark Context内部组件|
一、SparkContext
### --- SparkContext内部组件
~~~ Spark应用程序的第一步就是创建并初始化SparkContext,
~~~ SparkContext的初始化过程包含了内部组件的创建和准备,
~~~ 主要涉及网络通信、分布式、消息、存储、计算、调度、缓存、度量、清理、文件服务和UI等方面。
~~~ SparkContext 是 Spark 程序主要功能的入口点,链接Spark集群,创建RDD、累加器和广播变量,
~~~ 一个线程只能运行一个SparkContext。
~~~ SparkContext在应用程序中将外部数据转换成RDD,
~~~ 建立了第一个RDD,也就是说SparkContext建立了RDD血缘关系的根,是DAG的根源。
### --- 源码提取说明
~~~ # 源码提取说明:SparkContext.scala
~~~ # 185行~220行
/* ------------------------------------------------------------------------------------- *
| Private variables. These variables keep the internal state of the context, and are |
| not accessible by the outside world. They're mutable since we want to initialize all |
| of them to some neutral value ahead of time, so that calling "stop()" while the |
| constructor is still running is safe. |
* ------------------------------------------------------------------------------------- */
private var _conf: SparkConf = _
private var _eventLogDir: Option[URI] = None
private var _eventLogCodec: Option[String] = None
private var _listenerBus: LiveListenerBus = _
private var _env: SparkEnv = _
private var _statusTracker: SparkStatusTracker = _
private var _progressBar: Option[ConsoleProgressBar] = None
private var _ui: Option[SparkUI] = None
private var _hadoopConfiguration: Configuration = _
private var _executorMemory: Int = _
private var _schedulerBackend: SchedulerBackend = _
private var _taskScheduler: TaskScheduler = _
private var _heartbeatReceiver: RpcEndpointRef = _
@volatile private var _dagScheduler: DAGScheduler = _
private var _applicationId: String = _
private var _applicationAttemptId: Option[String] = None
private var _eventLogger: Option[EventLoggingListener] = None
private var _executorAllocationManager: Option[ExecutorAllocationManager] = None
private var _cleaner: Option[ContextCleaner] = None
private var _listenerBusStarted: Boolean = false
private var _jars: Seq[String] = _
private var _files: Seq[String] = _
private var _shutdownHookRef: AnyRef = _
private var _statusStore: AppStatusStore = _
/* ------------------------------------------------------------------------------------- *
| Accessors and public fields. These provide access to the internal state of the |
| context. |
* ------------------------------------------------------------------------------------- */
二、SparkContext内部组件
### --- SparkContext 内部组件:
~~~ # SparkConf
~~~ Spark Application 的配置,用来设置 Spark 的 KV 格式的参数。
~~~ 可用通过 new 实例化一个SparkConf 的对象,这可以把所有的以 spark 开头的属性配置好,
~~~ 使用 SparkConf 进行参数设置的优先级是高于属性文件,
~~~ 通过 new SparkConf(false) 可以在进行单元测试的时候不去读取外部的设置。
~~~ 所有的 setter方法都支持链式表达。
~~~ 一旦 SparkConf 对象传给 Spark,会被其他组件 clone,并且不能再动态的被任何用户修改
~~~ # SparkEnv:
~~~ SparkEnv 是Spark的执行环境对象,其中包括与众多Executor执行相关的对象。
~~~ Executor 有自己的 Spark 的执行环境 SparkEnv。有了 SparkEnv,就可以将数据存储在存储体系中;
~~~ 就能利用计算引擎对计算任务进行处理,就可以在节点间进行通信等。
~~~ 在 local 模式下Driver会创建Executor,
~~~ local-cluster部署模式或者 Standalone
~~~ 部署模式下 Worker 的 CoarseGrainedExecutorBackend 进程中也会创建Executor,
~~~ 所以SparkEnv 存在于 Driver 或者 CoarseGrainedExecutorBackend 进程中。
~~~ SparkEnv包含了很多重要的组件,完成不同的功能
~~~ # DAGScheduler:
~~~ DAG调度器,调度系统中最重要的组件之一,
~~~ 负责创建job,将DAG的RDD划分为不同的stage,提交stage
~~~ # TaskScheduler:
~~~ 任务调度器,调度系统中最重要的组件之一,
~~~ 按照调度算法对集群管理器已经分配给应用程序的资源进行二次调度后分配任务,
~~~ TaskScheduler调度的 Task是 DAGScheduler创建的,
~~~ 因此DAGScheduler是TaskScheduler的前置调度器
~~~ # SchedulerBackend:
~~~ 用于对接不同的资源管理系统
~~~ # LiveListenerBus:
~~~ 事件总线。接收各个使用方的事件,以异步的方式对事件进行匹配和处理
~~~ # SparkUI:
~~~ 用户界面,依赖计算引擎、调度系统、存储体系、作业、阶段、存储、执行器等组件的监控数据,
~~~ 以SparkListenerEnvent的形式投递给Live Listener,Spark从SparkListener中读取数据
~~~ # SparkStatusTracker:
~~~ 状态跟踪器,提供对作业、stage等的监控信息
~~~ # shutdownHookRef:
~~~ 任务退出时执行清理任务
~~~ # ConsoleProgressBar:
~~~ 进度条,利用SparkStatusTracker的API,在控制台展示Stage的进度
~~~ # ContextCleaner:
~~~ 上下文清理器,用异步方式清理超出应用程序范围的RDD、ShuffleDependency和BroadCast
~~~ # EventLoggingListener:
~~~ 将事件日志的监听器,Spark可选组件,spark.eventLog.enabled=true时启动
~~~ # ExecutorAllocationManager:
~~~ Executor动态分配管理器,根据工作负载动态调整Executor的数量,
~~~ 在spark.dynamicAllocation.enabled=true的前提下,
~~~ 和非local模式下或者spark.dynamicAllocation.testing=true时启动
~~~ # hadoopConfiguration():
~~~ hadoop的配置信息,
~~~ 如果使用的是系统SPARK_YARN_MODE=true或者环境变量SPARK_YARN_MODE=true时,
~~~ 启用yarn配置,否则启用hadoop配置
~~~ # heartbeatReceiver(RpcEndpointRef):
~~~ 心跳接收器,Executor都会向heartbeatReceiver发送心跳信息,heartbeatReceiver接收到信息后,
~~~ 更新executor最后的可见时间,然后传递给taskScheduler做进一步处理
Walter Savage Landor:strove with none,for none was worth my strife.Nature I loved and, next to Nature, Art:I warm'd both hands before the fire of life.It sinks, and I am ready to depart
——W.S.Landor
分类:
bdv018-spark.v03
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 无需6万激活码!GitHub神秘组织3小时极速复刻Manus,手把手教你使用OpenManus搭建本
· Manus爆火,是硬核还是营销?
· 终于写完轮子一部分:tcp代理 了,记录一下
· 别再用vector<bool>了!Google高级工程师:这可能是STL最大的设计失误
· 单元测试从入门到精通