spark Listener和metrics实现分析
在spark内部,rpc可以用来实现不同组件(Driver, executor,client)之间的远程交互。而在同一组件内,spark还有事件监听机制,如spark中各种指标的采集主要就是通过事件监听机制获取的。另外,本文也会spark中metrics的采集过程做一个简要分析。
1,spark事件监听机制
spark的事件监听主要是通过总线机制将不同的监听事件和 事件监听器连接起来的。总体设计如下图所示:

SparkListenerEvent具体包含的事件很多,如SparkListenerStageSubmitted,SparkListenerStageCompleted,SparkListenerTaskStart等等。
同理,SparkListenerInterface具体的实现也很多,如AppStatusListener,HeartbeatReceiver等。
下面以DAGScheduler中的JobSubmitted为例,梳理下整个过程:
1,在DAGScheduler处理JobSubmitted消息的函数在handleJobSubmitted中,在submitStage之前,会通过消息总线将SparkListenerJobStart监控事件发送到消息总线。
2,在LiveListenerBus内部,会将SparkListenerJobStart事件依次塞入到所有多列中(上图中的AsyncEventQueue中的Queue)。
3,与此同时,每个AsyncEventQueue中的Queue对应一个Thread,该线程将持续从队列中取出监听事件,将该事件发送给与该列队相连的所有事件监听器。
4,各个事件监听器根据不同的event类型,进行对应的处理。
以上就是事件响应处理的整体流程。
此外,还有一个问题是:监听器是怎么注册到消息总线内部的队列的?
以DAGScheduler中的ListenerBus为例,这个listenerbus是在SparkContext中初始化的,并且通过调用addToEventLogQueue,addToStatusQueue,addToManagementQueue,addToSharedQueue函数将各个监听器加入到不同的队列中去。
2, metrics实现机制
metrics实现机制和listener的机制有点类似,在spark的内部实现中,通过MetricsSystem连接Source和Sink。Source顾名思义就是收集数据的地方,而Sink则是采集数据落地的地方,Sink中一般而言会有一个Reporter周期性的将source采集的数据发送给sink,而MetricsSystem则可以简单理解为一个容器。

在SparkContext启动的时候,将会创建MetricSystem对象,并且在该对象启动的时候,将配置文件(默认metrics.properties)中的所有source和sink就注册到MetricsSystem中。对于Sink只能通过读取配置中所有sink,一次性注册。而对于Source,单独开放了接口,可以随时注册到MetricSystem中(在SparkContext中就有大量单独的source注册)。
对于source的具体实现,下面以BlockManagerSource为例简要阐述几点:
1,具体实现都实现了Source这个trait,实现Soure中定义的MetricRegistry和sourceName接口。
2,在Source中可以定义不同类型的metrics(Gauges,Counters,Meters,Histograms, Timers). 这些都是来自第三方的metrics库(https://github.com/dropwizard/metrics)。
3,在BlockManagerSource就定义了大量Gauge类型的metric。将name和value组成的kv值注册到MetricRegistry中。
而Sink中比较核心的就是有SchedulerReporter的对象(具体包括ConsoleReporter,CsvReporter,GraphiteReporter,JmxReporter),它会定期将source中采集的数据落到不同的目的地。
3, 小结
本文简要描述了spark中listener和metric的内部实现机制。metrics的实现了解有助于后续进一步对spark做数值类型的定制化监控。
spark Listener和metrics实现分析的更多相关文章
- Spark ListenerBus 和 MetricsSystem 体系分析
转载自:https://yq.aliyun.com/articles/60196 摘要: Spark 事件体系的中枢是ListenerBus,由该类接受Event并且分发给各个Listener.Met ...
- 【原】Spark中Master源码分析(二)
继续上一篇的内容.上一篇的内容为: Spark中Master源码分析(一) http://www.cnblogs.com/yourarebest/p/5312965.html 4.receive方法, ...
- 【原】Spark中Master源码分析(一)
Master作为集群的Manager,对于集群的健壮运行发挥着十分重要的作用.下面,我们一起了解一下Master是听从Client(Leader)的号召,如何管理好Worker的吧. 1.家当(静态属 ...
- Spark Scheduler模块源码分析之TaskScheduler和SchedulerBackend
本文是Scheduler模块源码分析的第二篇,第一篇Spark Scheduler模块源码分析之DAGScheduler主要分析了DAGScheduler.本文接下来结合Spark-1.6.0的源码继 ...
- Spark Scheduler模块源码分析之DAGScheduler
本文主要结合Spark-1.6.0的源码,对Spark中任务调度模块的执行过程进行分析.Spark Application在遇到Action操作时才会真正的提交任务并进行计算.这时Spark会根据Ac ...
- Spark RPC框架源码分析(三)Spark心跳机制分析
一.Spark心跳概述 前面两节中介绍了Spark RPC的基本知识,以及深入剖析了Spark RPC中一些源码的实现流程. 具体可以看这里: Spark RPC框架源码分析(二)运行时序 Spark ...
- 【原】Spark中Client源码分析(二)
继续前一篇的内容.前一篇内容为: Spark中Client源码分析(一)http://www.cnblogs.com/yourarebest/p/5313006.html DriverClient中的 ...
- 【原】 Spark中Worker源码分析(二)
继续前一篇的内容.前一篇内容为: Spark中Worker源码分析(一)http://www.cnblogs.com/yourarebest/p/5300202.html 4.receive方法, r ...
- Apache 流框架 Flink,Spark Streaming,Storm对比分析(一)
本文由 网易云发布. 1.Flink架构及特性分析 Flink是个相当早的项目,开始于2008年,但只在最近才得到注意.Flink是原生的流处理系统,提供high level的API.Flink也提 ...
随机推荐
- spark 33G表
http://192.168.2.51:4041 http://hadoop1:8088/proxy/application_1512362707596_0006/executors/ Executo ...
- 通达OA二次开发 工作流表单中关联查询另外一个工作流方法(源代码)
一个工作流表单中,怎样方便的查询相关的工作流表单内容.重复打开各个菜单必定须要造成多次点击浪费时间,切换也会带来思路的中断.这里通过js代码的方式把这个问题进行了解决. <style>&l ...
- React创建组件的三种方式比较和入门实例
推荐文章: https://www.cnblogs.com/wonyun/p/5930333.html 创建组件的方式主要有: 1.function 方式 2.class App extends Re ...
- YTU 2203: 最小节点(线性表)
2203: 最小节点(线性表) 时间限制: 1 Sec 内存限制: 128 MB 提交: 243 解决: 204 题目描述 (线性表)设有一个由正整数组成的无序(向后)单链表,编写完成下列功能的算 ...
- Android 代码设置RelativeLayout元素居中
RelativeLayout relativeLayout= new RelativeLayout(this); RelativeLayout.LayoutParams rlp=new Relativ ...
- poj 3368 Frequent values 解题报告
题目链接:http://poj.org/problem?id=3368 题目意思:给出一段 n 个数的序列你,对于区间 [l, r] 的询问,找出 出现频率最高的数的次数.考虑到序列中的数是非递减的, ...
- java nio的一个严重BUG
java nio的一个严重BUG Posted on 2009-09-28 19:27 dennis 阅读(4588) 评论(5) 编辑 收藏 所属分类: java .源码解读 这个BU ...
- 获取服务器基本信息.sh
#获取linux服务器基本信息脚本 #!/bin/bash # #Name:system_info #Ver:1.0 #Author:lykyl # # #程序说明: #获取服务器基本信息脚本 # e ...
- 如何 Xcode 开发工具里安装一个空的项目末模板
很多朋友因为Xcode升级取消了空工程模板而发愁 今天给大家推荐一个简单方便的方法,导入空工程模板 对于 xcode7 来说可以使用下面的方法添加空模板.建议在升级的时候,不要下载beta版,最好下 ...
- 6-8 adaboost分类器2
重点分析了Adaboost它的分类结构,以及如何使用Adaboost.这一节课讲解Adaboost分类器它训练的步骤以及训练好之后的XML文件的文件结构.所以这节课的核心是Adaboost分类器它的训 ...