spark 监控--WebUi、Metrics System(转载)
转载自:https://www.cnblogs.com/barrenlake/p/4364644.html
Spark 监控相关的部分有WebUi 及 Metrics System; WebUi用于展示Spark 资源状态、Metrics System 整合的指标信息。
Ui相关流程
Spark集群启动之后,我们可以通过Web观察集群状态等信息,这一部分工作是Spark WebUi 模块实现。
Servlet容器启动:
Master创建时,会通过val webUi = new MasterWebUI(this, webUiPort)创建webUi,
在启动Master时(perStart()中)通过webUi.bind()启动JettyServer,即Servlet容器。
Master的preStart()的源码如下所示
又webUi.bind()的源码如下所示:
WebUI页面信息
创建的MasterWebUI初始化时会添加三个页面和一个静态资源处理器,其初始化代码如下:
其中 attachPage方法代码如下:
其在添加页面时将初始化,页面地址pagePath,创建并绑定请求处理器,以及指定响应方法page.render(request).
其中createServletHandler实现如下:
此函数中会调用另一重载方法,其又会调用creatServlet方法,创建Servlet用于对外提供服务。createServlet方法代码如下所示:
Servlet中doGet方法用来处理get请求, 具体业务逻辑由传入的servletParams提供。
下面以attachPage(new MasterPage(this))为例对servletParams进行说明,由上文源码示例attachPage可知 (request: HttpServletRequest) => page.render(request)为servletParams。此参数意为使用page.render(request)对request进行处理。
MasterPage
MasterPage负责对master页面的请求,请求路径为http://master:webUiPort/或http://master:webUiPort/json.
下面http://master:webUiPort/json请求进行说明,当servlet接收到请求后,通过page.renderJson对其进行处理, renderJson源程序代码如下:
通过分析源代码可知:renderjson首先向master发送消息RequestMasterState,请求Master的状态信息. 然后阻塞等待结果,然后将结果转换成JSON格式、返回。
Master收到RequestMasterState消息后:
将其状态信息封装成MasterStateResponse对象发送给请求者。
Spark MetricsSystem 运行机制
Spark中的Metrics System 特殊的“实例”创建的,结合数据源、数据汇(接收点)的系统,其作用是定期将数据指标从数据源拉到数据汇。
实例(instance):创建Metrics的实例一般指使用Metrics System的角色。Spark中有多种角色,像master, worker, executor, client Driver,这些角色会创建Metrics System用于监控。所以这里所说的“实例”代表这些角色。当前,Spark中已实现的实例有:master,worker, executor,driver, applications.
数据源(source): 从哪里收集数据指标,在Metrics System中存在两种类型的数据源:
Spark 内部源,像MasterSource, WorkerSource等,这些源会收集Spark组件的状态,它们与Spark中角色相关,当Metrics System创建后,它们会在Metrics System中注册。
共用源,通过配制文件配制并通过反射机制进行加载,会收集更底层的状态指标,像JvmSource。
数据汇(sink):收集的数据指标输出的目的地,目的地可以是控制台,Servlet等。
下面以Master为入口对Metrics System工作机制做详细说明:
伴随Master的创建会创建MetricsSystem、MasterSource、WebUI等对象
在Master启动时会执行以下动作:
绑定WebUI
将MasterSource注册到Metrics中,
启动MetricsSystem,并将其servlethandler绑定到WebUI.
MetricsConfig
创建MetricsConfig时会创建并初始化MetricsConfig, MetricsConfig将持有一个HashMap类型的propertyCategories,其用来存放处理过的属性集合。再获取MetricsConfig实例时都将会从此属性中取相应的MetricsConfig配制.如下代码所示:若存在指定key的属性,则返回;否则返回默认值。
propertyCategories将在MetricsConfig初始化时(initialize())调用时对其赋值,初始化过程如下:
防止没有属性文件,添加默认属性。
检测spark.metrics.conf是否设置,若未设置则试着去classpath下寻找”metrics.properties”文件。若存在配制文件,则将其属性载入properties。
然后将properties中内容进行抽取、分类、归并处理,其代码如下:
若不存在配制文件的情况下,系统只有默认添加属性,经上述代码处理的结果为:
applications -> {sink.servlet.class=org.apache.spark.metrics.sink.MetricsServlet, sink.servlet.path=/metrics/applications/json} master -> {sink.servlet.class=org.apache.spark.metrics.sink.MetricsServlet, sink.servlet.path=/metrics/master/json} * -> {sink.servlet.class=org.apache.spark.metrics.sink.MetricsServlet, sink.servlet.path=/metrics/json}
其中subProperties()方法是对properties属性进行抽取、规类。代码如下:
注册数据源: MetricsSystem启动时
当MetricsSystem 在启动时将会调用注册数据源函数registerSources(),注册实例相关的所有数据源。
上面是registerSources相关代码,其通过getInstance()方法获取该instance相关的配制属性。然后通过subProperties方法进行抽取、归类。然后取出key为class的属性,利用java反射机制创建Source对象并进行注册。默认情况下不存在Source相关属性,所以此例中MasterSource唯一数据源。
其通过MetricsConfig的getInstance()方法。该方法会以传入的instance做为key 去propertyCategories中取属性值
注册数据汇(目的地)
MetricsSystem的start()方法通过调用registerSinks()方法来注册数据汇(数据指标接收点)。程序代码如下所示:
通过分析此方法的源码,若未通过配制文件指定MetricsConfig属性,则将只通过反射创建MetricsServlet,其内部再创建ServletHander交付WebUI使用。但此MetricsServlet并未做为sink添加到sinks列表,至此 sinks列表仍为空,MetricsSystem的start()方法中调用sinks.foreach(_.start)时将不执行任何动作。换句话说,在默认情况下,registerSinks方法只是对MetricsServlet进行实例化用。
MetricsServlet的创建
MetricsSystem在注册Sink时, 会创建MetricsServlet, MetricsServlet的映射地址为propertyCategories是path属性对应项,其做为一个web服务,用于对相应请求进行处理。 MetricsServlet会通过调用jettyUtils的createServletHandler方法ServletContextHandler,创建Handler。其核心代码如下:
此方法将创建以/metrics/master/json为请求路径的httpServlet, 影响类型为JSON串。
然后并将创建的Hander赋值给通过MetircsSystem的getServletHander方法交由WebUi处理。
getServletHander方法程序代码如下所示:
spark 监控--WebUi、Metrics System(转载)的更多相关文章
- spark 监控--WebUi、Metrics System
Spark 监控相关的部分有WebUi 及 Metrics System; WebUi用于展示Spark 资源状态.Metrics System 整合的指标信息. Ui相关流程 Spark集群启动之后 ...
- spark监控入门
前言 Spark作为计算引擎每天承载了大量的计算任务,为了监控集群的资源使用情况,对spark的监控也在所难免,Spark的监控有3个入口,1. Rest; 2.另一个是Metrics; 3. Log ...
- HBase 监控 | HBase Metrics 初探(一)
前言:对于任意一个系统而言,做好监控都是非常重要的,HBase也不例外.经常,我们会从JMX中获取相关指标来做展示.对HBase进行监控,那这些指标是怎么生成的呢?如果你想自定义自己的监控指标又该怎么 ...
- Spark监控官方文档学习笔记
任务的监控和使用 有几种方式监控spark应用:Web UI,指标和外部方法 Web接口 每个SparkContext都会启动一个web UI,默认是4040端口,用来展示一些信息: 一系列调度的st ...
- spark Listener和metrics实现分析
在spark内部,rpc可以用来实现不同组件(Driver, executor,client)之间的远程交互.而在同一组件内,spark还有事件监听机制,如spark中各种指标的采集主要就是通过事件监 ...
- 【Spark学习】Apache Spark监控与测量
Spark版本:1.1.1 本文系从官方文档翻译而来,转载请尊重译者的工作,注明以下链接: http://www.cnblogs.com/zhangningbo/p/4137952.html
- 20个命令行工具监控 Linux 系统性能(转载)
1. top — Linux 系统进程监控 top 命令是性能监控程序,它可以在很多 Linux/Unix 版本下使用,并且它也是 Linux 系统管理员经常使用的监控系统性能的工具.Top 命令可以 ...
- 20个命令行工具监控 Linux 系统性能【转载】
对于每个系统管理员或网络管理员来说,每天要监控和调试 Linux 系统性能问题都是非常困难的工作.我已经有5年 Linux 管理员的工作经历,知道如何监控系统使其保持正常运行.为此,我们编写了对于 L ...
- Java实时监控类库Metrics
随着系统越来越大,越来越复杂,我们需要在业务方面加上一些监控服务.Metrics作为一款监控指标的度量类库,提供了许多工具帮助开发者来完成自定义的监控工作. 使用Metrics 使用Metrics,只 ...
随机推荐
- Docker 0x03:Install Docker
目录 Install Docker Centos yum 安装 运行docker-daemon并开机自启动 运行hello-world应用docker容器中 Ubn Install Docker do ...
- etcd和flannel实现docker跨物理机通信
实验目标 跨物理机的容器之间能直接访问docker通过Flannel可以实现各容器间的相互通信,即宿主机和容器,容器和容器之间都能相互通信 实验环境 192.168.3.50 //etcd.flann ...
- vue2.0 在页面中使用process获取全局路径的时候 报错 process is not defined
如果是刚配置好的全局变量需要 重新启动一下vue才能通过proccess.env.xxx 获取到 如果想在html中使用 需要在data中声明一个变量 然后在vue生命周期中 将process.env ...
- aws centos系统磁盘扩容
growpart /dev/xvda 1 展开修改后的分区(注意是:空格 1,而非打错了) # ext3/4 1.resize2fs /dev/xvda1 将分区调整为新的卷容量 # xfs分区 2 ...
- KVM虚拟机被OOM killer
一.线上环境的虚拟机被KVM物理机kill掉 Linux 内核根据应用程序的要求分配内存,通常来说应用程序分配了内存但是并没有实际全部使用,为了提高性能,这部分没用的内存可以留作它用,这部分内存是属于 ...
- 关于苹果手机设置fiddler代理后无网络无法抓包的问题
1.设置代理后,需要在苹果手机的关于本机中,打开证书信任 这样就可以抓包咯
- 《团队名称》第八次团队作业:Alpha冲刺day5
项目 内容 这个作业属于哪个课程 2016计算机科学与工程学院软件工程(西北师范大学) 这个作业的要求在哪里 实验十二 团队作业8-软件测试与ALPHA冲刺 团队名称 快活帮 作业学习目标 (1)掌握 ...
- APP——Ruby开源分发平台搭建
前言 蒲公英,维护后把我上传的包清除了,所以想自己搭建一个用下. 步骤 项目用ruby语言写的,部署起来也很简单支持源码和Docker部署 GitHub | https://github.com/pl ...
- 【Linux】linux ln文件夹的链接(转)
1 文件的链接ln -s a.py b.pya.py 软链接到b.py (无论 b.py 文件存在与否 都可以成功)2 文件夹的链接ln -s a ba文件夹软链接到b文件夹(b文件夹不能提前创建) ...
- 异步模型:上下文与时间---async = request + reponse + handler + context + time;
futureHandler = current(handler, context(t0)) : T0 -> handler(context(t0),taskResult) : Tx ...