正如曹操在《建学令》中所言,优秀人才的培育离不开国家政策这个大环境。在人类生活中,总是会依赖于外部的各种环境。一个人学习成绩的好坏,很大的因素取决于他所处的教育环境;一个人健康与否,依赖于他所处的医疗卫生环境;一个人的沟通能力,与自己的家庭环境有很重要的关系。如果某一天你发现自己联系不到亲人、朋友,甚至周围的环境都是陌生的,那么你立刻会处于崩溃的边缘。

一、概述

就像学习一门编程语言一样, 无论是 Java 程序还是 Scala 程序,都需要运行在其所依托的环境下。Spark 对任务的计算都依托于 Executor 的能力,所有的 Executor 都有自己的 Spark 执行环境 SparkEnv。Executor 有了 SparkEnv, 就可以将数据存储在 SparkEnv 提供的存储体系中; 就能利用计算引擎对计算任务进行处理,就可以在节点间进行通信等…

二、SparkEnv 架构

SparkEnv 还提供了多种多样的内部组件,实现不同的功能。

2.1. 公共基础服务组件

  1. 安全服务 SecurityManager

    SecurityManager 主要对账号、权限及身份认证进行设置和管理

  2. 通信服务 RpcEnv

    Spark 通信架构中最核心的就是 RpcEnv, 类似于 akka 中的 ActorSystem, 服务端和客户端都可以使用它来做通信。

  3. 序列化服务 SerializerManager

    Spark 数据在通用网络传输或者写入存储体系时,都需要序列化。SparkEnv 中有两个序列化组件,分别是 SerializerManager 和 ClosureSerializer。

    用户可以通过 spark.serializer 属性配置其他的序列化实现,如 org.apache.spark.serializer.KryoSerializer

    1
    2
    val serializer = instantiateClassFromConf[Serializer]("spark.serializer","org.apache.spark.serializer.JavaSerializer")
    val serializerManager = new SerializerManager(serializer, conf, ioEncryptionKey)

    ClosureSerializer 的实际类型固定org.apache.spark.serializer.JavaSerializer ,用户不能够自己指定。JavaSerializer 采用 Java 语言自带的序列化 API 实现。

    1
    val closureSerializer = new JavaSerializer(conf)
  4. 度量系统

    Spark 作为优秀的开源系统,在监控方面也有自己的一整套体系,Spark 基于 Metrics 实现了自己的度量系统。

2.2. 运行时服务组件

  1. BroadcastManager

    BroadcastManager 用于将配置信息和序列化后的 RDD、Job 以及 ShuffleDependency 等信息在本地存储。如果为了容灾,也会复制到其他节点上。

    截屏2021-03-07 上午10.24.25

    通过 SparkContext.broadcast 广播一个 Broadcast, 实际调用的是 SparkEnv 的 BroadcastManager 来创建。

  2. MapOutputTracker

    MapOutputTracker 用于跟踪 Map 阶段任务的输出状态,此状态便于Reduce阶段任务获取地址及中间结果。每个 Map 任务或者 Reduce 任务都会有其唯一的标识,分别为 mapId 和 reduceId。每个 Reduce 任务的输入可能是多个 Map 任务的输出,Reduce 会到各个 Map 任务的所在节点上拉取 Block,这一过程叫做 Shuffle。每个 Shuffle 过程都有唯一的表示 shuffleId。

    MapOutputTracker 有两个子类: MapOutputTrackerMaster(for driver) 和 MapOutputTrackerWorker (for executors);它们使用了不同的HashMap 来存储元数据。

  3. ShuffleManager

    Spark Shuffle 机制的主要接口是 ShuffleManager,定义了 Spark 的 Shuffle 机制的主要接口方法,而 Spark 从 2.0 版本之后,其默认实现为 SortShuffleManager。

    ShuffleManager

  4. 存储体系

    Spark 的存储体系在整个 Spark 架构中与大地在生态圈中的作用非常类似。Spark 的存储体系贯穿了集群中的每个实例。从单个节点来着,Spark 的存储体系隶属于 SparkEnv。

  5. OutputCommitCoordinator

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

    在 Driver 上注册了 OutputCommitCoordinatorEndpoint,所有 Executor 上的 OutputCommitCoordinator 通过 OutputCommitCoordinatorEndpoint 的 RpcEndpointRef 来询问 Driver 上的 OutputCommitCoordinator,是否能够将输出提交到 HDFS。

https://www.cnblogs.com/xia520pi/p/8609625.html#_label2_0