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线程,并且在线程池中 ...
随机推荐
- 深度强化学习day01初探强化学习
深度强化学习 基本概念 强化学习 强化学习(Reinforcement Learning)是机器学习的一个重要的分支,主要用来解决连续决策的问题.强化学习可以在复杂的.不确定的环境中学习如何实现我们设 ...
- 查看linux系统时间和时区
参考地址:http://lidao.blog.51cto.com/ 一.使用date命令查看系统时间 [root@benbang ~]# date -R Tue, 01 Aug 2017 15:43: ...
- Android native进程间通信实例-binder篇之——HAL层访问JAVA层的服务
有一天在群里聊天的时候,有人提出一个问题,怎样才能做到HAL层访问JAVA层的接口?刚好我不会,所以做了一点研究. 之前的文章末尾部分说过了service call 可以用来调试系统的binder服务 ...
- C# 设计模式,简单工厂
C# 实现计算机功能 (封装,继承,多态) using System; using System.Collections.Generic; using System.Linq; using Syste ...
- 计算广告之CTR预测--PNN模型
论文为:Product-based Neural Networks for User Response Prediction 1.原理 给大家举例一个直观的场景:比如现在有一个凤凰网站,网站上面有一个 ...
- php函数引用
//在自定义函数中,前面加一个&符号,是对返回静态变量的引用 function &test(){ static $a; $a += 1; echo $a; return $a; } / ...
- VS2017 编译 Visual Leak Detector + VLD 使用示例
起因 一个Qt5+VS2017的工程,需要进行串口操作,在自动时发现一段时间软件崩溃了,没有保存log,在 debug 的时候发现每运行一次应用占据的内存就多一点,后来意识到是内存泄漏了.这个真是头疼 ...
- 长春理工大学第十四届程序设计竞赛(重现赛)J
J.Printout 题目:链接:https://ac.nowcoder.com/acm/contest/912/J 题目: 小r为了打校赛,他打算去打字社打印一份包含世界上所有算法的模板. 到了打字 ...
- VMware Tools安装,设置centos全屏、可拖入文件功能
Mr·Hu原创作品.转载请注明出处http://www.cnblogs.com/huxiuqian/p/7843126.html 由于在VM中使用小屏太不方便,所以进行全屏化,亦可进行文件共享. 1. ...
- 23 | 知其然知其所以然:聊聊API自动化测试框架的前世今生