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线程,并且在线程池中 ...
随机推荐
- MacOS平台上编译 hadoop 3.1.2 源码
1. 先从官方下载源码:源码下载地址:https://hadoop.apache.org/releases.html,下载 3.1.2 版本 2. 解压缩源码:tar xvf hadoop-3.1.2 ...
- SpringBoot中资源初始化加载的几种方式(看这一片就够了)
一.问题 在平时的业务模块开发过程中,难免会需要做一些全局的任务.缓存.线程等等的初始化工作,那么如何解决这个问题呢?方法有多种,但具体又要怎么选择呢? 二.资源初始化 1.既然要做资源的初始化,那么 ...
- Scala 学习之路(三)—— 流程控制语句
一.条件表达式if Scala中的if/else语法结构与Java中的一样,唯一不同的是,Scala中的if表达式是有返回值的. object ScalaApp extends App { val x ...
- Java 泛型学习总结
前言 Java 5 添加了泛型,提供了编译时类型安全检测机制,该机制允许程序员在编译时检测到非法的类型. 泛型的本质是参数化类型,可以为以前处理通用对象的类和方法,指定具体的对象类型.听起来有点抽象, ...
- Java NIO 学习笔记(六)----异步文件通道 AsynchronousFileChannel
目录: Java NIO 学习笔记(一)----概述,Channel/Buffer Java NIO 学习笔记(二)----聚集和分散,通道到通道 Java NIO 学习笔记(三)----Select ...
- 【需要重新整理】【mongoDB】mongoDB初见笔记
A安装(windows版): 1.官网下载安装文件 2.解压 3.配置环境变量 4.win+r cmd>打开控制台配置仓库路径 5.mongod --dbpath=d:/bigMongo//启动 ...
- Vue SSR初探
因为之前用nuxt开发过应用程序,但是nuxt早就达到了开箱即用的目的,所以一直对vue ssr的具体实现存在好奇. 构建步骤 我们通过上图可以看到,vue ssr 也是离不开 webpack 的打包 ...
- centos安装netcat TCP UDP测试工具 简称 nc,安全界叫它瑞士军刀
centos安装netcat 今天安装swoole后,测试UDP服务需要用到netcat,然而百度了很多安装方法,并没有一个好用的.几经尝试,终于安装成功,现在就分享给大家,以供参考. 配置环境:ce ...
- Centos7下安装Mysql8.0
突然发现mysql都有8.0了,且性能提升比较明显,就自己装来玩玩. centos的yum源中默认是没有mysql的,所以我们需要先去官网下载mysql的repo源并安装: 官网:http://dev ...
- Spring Boot2(七):拦截器和过滤器
一.前言 过滤器和拦截器两者都具有AOP的切面思想,关于aop切面,可以看上一篇文章.过滤器filter和拦截器interceptor都属于面向切面编程的具体实现. 二.过滤器 过滤器工作原理 从上图 ...