Spark-源码学习-SparkSession-SparkContext-SparkEnv
正如曹操在《建学令》中所言,优秀人才的培育离不开国家政策这个大环境。在人类生活中,总是会依赖于外部的各种环境。一个人学习成绩的好坏,很大的因素取决于他所处的教育环境;一个人健康与否,依赖于他所处的医疗卫生环境;一个人的沟通能力,与自己的家庭环境有很重要的关系。如果某一天你发现自己联系不到亲人、朋友,甚至周围的环境都是陌生的,那么你立刻会处于崩溃的边缘。
一、概述
就像学习一门编程语言一样, 无论是 Java 程序还是 Scala 程序,都需要运行在其所依托的环境下。Spark 对任务的计算都依托于 Executor 的能力,所有的 Executor 都有自己的 Spark 执行环境 SparkEnv。Executor 有了 SparkEnv, 就可以将数据存储在 SparkEnv 提供的存储体系中; 就能利用计算引擎对计算任务进行处理,就可以在节点间进行通信等…
二、SparkEnv 架构
SparkEnv 还提供了多种多样的内部组件,实现不同的功能。
2.1. 公共基础服务组件
安全服务 SecurityManager
SecurityManager 主要对账号、权限及身份认证进行设置和管理
通信服务 RpcEnv
Spark 通信架构中最核心的就是 RpcEnv, 类似于 akka 中的 ActorSystem, 服务端和客户端都可以使用它来做通信。
引用本站文章Spark-源码学习-SparkCore-通信服务-架构设计Joker序列化服务 SerializerManager
Spark 数据在通用网络传输或者写入存储体系时,都需要序列化。SparkEnv 中有两个序列化组件,分别是 SerializerManager 和 ClosureSerializer。
用户可以通过 spark.serializer 属性配置其他的序列化实现,如
org.apache.spark.serializer.KryoSerializer
。1
2val 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)
度量系统
Spark 作为优秀的开源系统,在监控方面也有自己的一整套体系,Spark 基于 Metrics 实现了自己的度量系统。
2.2. 运行时服务组件
BroadcastManager
BroadcastManager 用于将配置信息和序列化后的 RDD、Job 以及 ShuffleDependency 等信息在本地存储。如果为了容灾,也会复制到其他节点上。
通过 SparkContext.broadcast 广播一个 Broadcast, 实际调用的是 SparkEnv 的 BroadcastManager 来创建。
MapOutputTracker
MapOutputTracker 用于跟踪 Map 阶段任务的输出状态,此状态便于Reduce阶段任务获取地址及中间结果。每个 Map 任务或者 Reduce 任务都会有其唯一的标识,分别为 mapId 和 reduceId。每个 Reduce 任务的输入可能是多个 Map 任务的输出,Reduce 会到各个 Map 任务的所在节点上拉取 Block,这一过程叫做 Shuffle。每个 Shuffle 过程都有唯一的表示 shuffleId。
MapOutputTracker 有两个子类: MapOutputTrackerMaster(for driver) 和 MapOutputTrackerWorker (for executors);它们使用了不同的HashMap 来存储元数据。
引用本站文章Spark-源码学习-SparkCore-SparkEnv-MapOutputTrackerJokerShuffleManager
Spark Shuffle 机制的主要接口是 ShuffleManager,定义了 Spark 的 Shuffle 机制的主要接口方法,而 Spark 从 2.0 版本之后,其默认实现为 SortShuffleManager。
存储体系
Spark 的存储体系在整个 Spark 架构中与大地在生态圈中的作用非常类似。Spark 的存储体系贯穿了集群中的每个实例。从单个节点来着,Spark 的存储体系隶属于 SparkEnv。
引用本站文章Spark-源码学习-SparkCore-存储服务-架构设计JokerOutputCommitCoordinator
当 Spark 应用程序使用了 Spark SQL (包括 Hive) 或者需要将任务的输出保存到 HDFS 时,就会用到输出提交协调器 OutputCommitCoordinator,OutputCommitCoordinator 将决定任务是否可以提交输出到 HDFS。无论是 Driver 还是 Executor,在 SparkEnv 中都包含了子组件 OutputCommitCoordinator。
在 Driver 上注册了 OutputCommitCoordinatorEndpoint,所有 Executor 上的 OutputCommitCoordinator 通过 OutputCommitCoordinatorEndpoint 的 RpcEndpointRef 来询问 Driver 上的 OutputCommitCoordinator,是否能够将输出提交到 HDFS。