spark 源码分析之三 -- LiveListenerBus介绍
LiveListenerBus
官方说明如下:
Asynchronously passes SparkListenerEvents to registered SparkListeners.
即它的功能是异步地将SparkListenerEvent传递给已经注册的SparkListener,这种异步的机制是通过生产消费者模型来实现的。
首先,它定义了 4 个 消息堵塞队列,队列的名字分别为shared、appStatus、executorManagement、eventLog。队列的类型是 org.apache.spark.scheduler.AsyncEventQueue#AsyncEventQueue,保存在 queues 变量中。每一个队列上都可以注册监听器,如果队列没有监听器,则会被移除。
它有启动和stop和start两个标志位来指示 监听总线的的启动停止状态。 如果总线没有启动,有事件过来,先放到 一个待添加的可变数组中,否则直接将事件 post 到每一个队列中。
其直接依赖类是 AsyncEventQueue, 相当于 LiveListenerBus 的多事件队列是对 AsyncEventQueue 进一步的封装。
AsyncEventQueue
其继承关系如下:

它有启动和stop和start两个标志位来指示 监听总线的的启动停止状态。
其内部维护了listenersPlusTimers 主要就是用来保存注册到这个总线上的监听器对象的。
post 操作将事件放入内部的 LinkedBlockingQueue中,默认大小是 10000。
有一个事件分发器,它不停地从 LinkedBlockingQueue 执行 take 操作,获取事件,并将事件进一步分发给所有的监听器,由org.apache.spark.scheduler.SparkListenerBus#doPostEvent 方法实现事件转发,具体代码如下:
1 protected override def doPostEvent(
2 listener: SparkListenerInterface,
3 event: SparkListenerEvent): Unit = {
4 event match {
5 case stageSubmitted: SparkListenerStageSubmitted =>
6 listener.onStageSubmitted(stageSubmitted)
7 case stageCompleted: SparkListenerStageCompleted =>
8 listener.onStageCompleted(stageCompleted)
9 case jobStart: SparkListenerJobStart =>
10 listener.onJobStart(jobStart)
11 case jobEnd: SparkListenerJobEnd =>
12 listener.onJobEnd(jobEnd)
13 case taskStart: SparkListenerTaskStart =>
14 listener.onTaskStart(taskStart)
15 case taskGettingResult: SparkListenerTaskGettingResult =>
16 listener.onTaskGettingResult(taskGettingResult)
17 case taskEnd: SparkListenerTaskEnd =>
18 listener.onTaskEnd(taskEnd)
19 case environmentUpdate: SparkListenerEnvironmentUpdate =>
20 listener.onEnvironmentUpdate(environmentUpdate)
21 case blockManagerAdded: SparkListenerBlockManagerAdded =>
22 listener.onBlockManagerAdded(blockManagerAdded)
23 case blockManagerRemoved: SparkListenerBlockManagerRemoved =>
24 listener.onBlockManagerRemoved(blockManagerRemoved)
25 case unpersistRDD: SparkListenerUnpersistRDD =>
26 listener.onUnpersistRDD(unpersistRDD)
27 case applicationStart: SparkListenerApplicationStart =>
28 listener.onApplicationStart(applicationStart)
29 case applicationEnd: SparkListenerApplicationEnd =>
30 listener.onApplicationEnd(applicationEnd)
31 case metricsUpdate: SparkListenerExecutorMetricsUpdate =>
32 listener.onExecutorMetricsUpdate(metricsUpdate)
33 case executorAdded: SparkListenerExecutorAdded =>
34 listener.onExecutorAdded(executorAdded)
35 case executorRemoved: SparkListenerExecutorRemoved =>
36 listener.onExecutorRemoved(executorRemoved)
37 case executorBlacklistedForStage: SparkListenerExecutorBlacklistedForStage =>
38 listener.onExecutorBlacklistedForStage(executorBlacklistedForStage)
39 case nodeBlacklistedForStage: SparkListenerNodeBlacklistedForStage =>
40 listener.onNodeBlacklistedForStage(nodeBlacklistedForStage)
41 case executorBlacklisted: SparkListenerExecutorBlacklisted =>
42 listener.onExecutorBlacklisted(executorBlacklisted)
43 case executorUnblacklisted: SparkListenerExecutorUnblacklisted =>
44 listener.onExecutorUnblacklisted(executorUnblacklisted)
45 case nodeBlacklisted: SparkListenerNodeBlacklisted =>
46 listener.onNodeBlacklisted(nodeBlacklisted)
47 case nodeUnblacklisted: SparkListenerNodeUnblacklisted =>
48 listener.onNodeUnblacklisted(nodeUnblacklisted)
49 case blockUpdated: SparkListenerBlockUpdated =>
50 listener.onBlockUpdated(blockUpdated)
51 case speculativeTaskSubmitted: SparkListenerSpeculativeTaskSubmitted =>
52 listener.onSpeculativeTaskSubmitted(speculativeTaskSubmitted)
53 case _ => listener.onOtherEvent(event)
54 }
55 }
然后去调用 listener 的相对应的方法。
就这样,事件总线上的消息事件被监听器消费了。
spark 源码分析之三 -- LiveListenerBus介绍的更多相关文章
- Spark源码分析之三:Stage划分
继上篇<Spark源码分析之Job的调度模型与运行反馈>之后,我们继续来看第二阶段--Stage划分. Stage划分的大体流程如下图所示: 前面提到,对于JobSubmitted事件,我 ...
- spark 源码分析之十九 -- Stage的提交
引言 上篇 spark 源码分析之十九 -- DAG的生成和Stage的划分 中,主要介绍了下图中的前两个阶段DAG的构建和Stage的划分. 本篇文章主要剖析,Stage是如何提交的. rdd的依赖 ...
- Spark 源码分析系列
如下,是 spark 源码分析系列的一些文章汇总,持续更新中...... Spark RPC spark 源码分析之五--Spark RPC剖析之创建NettyRpcEnv spark 源码分析之六- ...
- spark源码分析以及优化
第一章.spark源码分析之RDD四种依赖关系 一.RDD四种依赖关系 RDD四种依赖关系,分别是 ShuffleDependency.PrunDependency.RangeDependency和O ...
- Spark源码分析(三)-TaskScheduler创建
原创文章,转载请注明: 转载自http://www.cnblogs.com/tovin/p/3879151.html 在SparkContext创建过程中会调用createTaskScheduler函 ...
- 【转】Spark源码分析之-deploy模块
原文地址:http://jerryshao.me/architecture/2013/04/30/Spark%E6%BA%90%E7%A0%81%E5%88%86%E6%9E%90%E4%B9%8B- ...
- Spark源码分析:多种部署方式之间的区别与联系(转)
原文链接:Spark源码分析:多种部署方式之间的区别与联系(1) 从官方的文档我们可以知道,Spark的部署方式有很多种:local.Standalone.Mesos.YARN.....不同部署方式的 ...
- Spark源码分析之九:内存管理模型
Spark是现在很流行的一个基于内存的分布式计算框架,既然是基于内存,那么自然而然的,内存的管理就是Spark存储管理的重中之重了.那么,Spark究竟采用什么样的内存管理模型呢?本文就为大家揭开Sp ...
- Spark源码分析之八:Task运行(二)
在<Spark源码分析之七:Task运行(一)>一文中,我们详细叙述了Task运行的整体流程,最终Task被传输到Executor上,启动一个对应的TaskRunner线程,并且在线程池中 ...
随机推荐
- SYN5006型电机同步编码脉冲分配器
SYN5006型电机同步编码脉冲分配器 编码器信号分配板增量式编码器脉冲分配器使用说明视频链接: http://www.syn029.com/h-pd-81-0_310_13_-1.html 请将此链 ...
- RocketMQ(1)-架构原理
RocketMQ(1)-架构原理 RocketMQ是阿里开源的分布式消息中间件,跟其它中间件相比,RocketMQ的特点是纯JAVA实现:集群和HA实现相对简单:在发生宕机和其它故障时消息丢失率更低. ...
- springboot中加分布式redis锁
分布式redis锁,spring-boot-starter-data-redis,RedisTemplate 公司聊天的聊天系统,近期出现多个客服并发接待同一个客户的记录,经排查,是由于代码加的同步锁 ...
- HBase —— 集群环境搭建
一.集群规划 这里搭建一个3节点的HBase集群,其中三台主机上均为Regin Server.同时为了保证高可用,除了在hadoop001上部署主Master服务外,还在hadoop002上部署备用的 ...
- unity中实现物体在一定角度范围内来回旋转
using System.Collections; using System.Collections.Generic; using UnityEngine; public class Rotate : ...
- 微信小程序商城(Java版)
体验 后台演示地址(账号:admin 密码:admin) 小程序体验如下: 技术选型 1 后端使用技术 1.1 springframework4.3.7.RELEASE 1.2 mybatis3.1. ...
- 超级实用的表格树控件--QtTreePropertyBrowser
目录 一.源码下载 二.代码编译 1.intersect函数替换为intersected 2.移除UnicodeUTF8 3.QtGui模块拆分 4.Q_TYPENAME错误 5.qVariantVa ...
- MySQL下的DB Link
前言: 在实际工作中,我们可能会遇到需要操作其他数据库实例的部分表,但又不想系统连接多库.此时我们就需要用到数据表映射.如同Oracle中的DBlink一般,使用过Oracle DBlink数据库链接 ...
- vSphere、 ESXi、Vcenter、vSphere Client关系
vSphere是什么? vSphere 是VMware公司发布的一整套产品包,是VMware公司推出的一套服务器虚拟化解决方案,包含VMware ESXi hypervisor,VMware vCen ...
- SQL Server温故系列(1):SQL 数据操作 CRUD 之增删改合
1.插入语句 INSERT INTO 1.1.用 INSERT 插入单行数据 1.2.用 INSERT 插入多行数据 1.3.用 INSERT 插入子查询结果行 1.4.INSERT 小结及特殊字段插 ...