sparkEnv——spark的执行环境
1.创建的组件
组件 | 作用 |
---|---|
securityManager | 主要对帐号、权限以及身份认证进行设置和管理 |
rpcEnv | RpcEndpoint 的运行环境,管理 RpcEndpoint 的整个生命周期 |
SerializerManager | 为spark提供序列化、压缩和加密的管理器 |
BroadcastManager | 负责Broadcast的创建和销毁 |
mapOutputTracker | 用于跟踪map阶段任务的输出状态,此状态便于reduce阶段任务获取地址以及中间输出结果 |
shuffleManager | 负责 shuffle 过程的执行、计算、处理的组件主要是 ShuffleManager |
MemoryManager | 内存管理器,有动态和静态可选,管理存储内存空间和执行内存空间 |
blockManager | 负责对block管理,BlockManager是分布式结构,在driver和所有executor上都会有blockmanager节点,每个节点上存储的block信息都会汇报给driver端的blockManagerMaster作统一管理 |
metricsSystem | 度量系统的各项指标的,比如说可以度量driver,worker,executor端的jvm相关的信息 |
outputCommitCoordinator | 输出提交控制器,用于判定task是否拥有将output提交到HDFS的权限 |
2.代码解析
2.1会根据diver和excutor分别创建的sparkenv
为diver创建sparkEnv的参数
create(
conf,
SparkContext.DRIVER_IDENTIFIER,
bindAddress,
advertiseAddress,
port,
isLocal,
numCores,
ioEncryptionKey,
listenerBus = listenerBus,
mockOutputCommitCoordinator = mockOutputCommitCoordinator
)
为excutor创建sparkEnv的参数
val env = create(
conf,
executorId,
hostname,
hostname,
port,
isLocal,
numCores,
ioEncryptionKey
)
其中creat方法参数如下,其中:
1.conf:sparkconf,在创建各个组件时会用到conf,主要是取出conf里的配置参数
2.executorId:val isDriver = executorId == SparkContext.DRIVER_IDENTIFIER用以判断当前的节点是diver还是excutor
3.bindAddress:绑定侦听的主机名或IP地址
4.advertiseAddress:驱动程序的主机名或IP地址
5.isLocal:是否是本地模式
6.numUsableCores:本地模式下用于diver驱动模式的核心数
7.ioEncryptionKey:io密钥,用于SerializerManager 和securityManager 中
8.LiveListenerBus :监听队列
9.mockOutputCommitCoordinator:输出提交控制器
create(
conf: SparkConf,
executorId: String,
bindAddress: String,
advertiseAddress: String,
port: Int,
isLocal: Boolean,
numUsableCores: Int,
ioEncryptionKey: Option[Array[Byte]],
listenerBus: LiveListenerBus = null,
mockOutputCommitCoordinator: Option[OutputCommitCoordinator] = None)
从可以比较出diver的sparkEnv对象和excutor的sparkEnv对象的不同
excutorexcutor的参数bindAddress和advertiseAddress为hostname,并且没有listenerBus与mockOutputCommitCoordinator,因为excutor作为执行器无需监听其他节点的状态。
2.2创建各个组件的代码
private def create(
conf: SparkConf,
executorId: String,
bindAddress: String,
advertiseAddress: String,
port: Int,
isLocal: Boolean,
numUsableCores: Int,
ioEncryptionKey: Option[Array[Byte]],
listenerBus: LiveListenerBus = null,
mockOutputCommitCoordinator: Option[OutputCommitCoordinator] = None): SparkEnv = {
val isDriver = executorId == SparkContext.DRIVER_IDENTIFIER
// Listener bus is only used on the driver