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方法程序代码如下所示:

 

转载于:https://www.cnblogs.com/itboys/p/11122177.html

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/569251.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Hadoop64位版本安装后遇到的警告处理

在使用hadoop的过程中,会遇到一个警告,内容如下: WARN util.NativeCodeLoader: Unable to load native-hadoop library for your platform... using builtin-java classes where applicable 对于这个问题网上很多说法是由于系统位数和所下载…

ueditor跨域上传图片文件(基于jsp框架、tomcat)

额,好久没有用到ueditor了,因为现在的相关工作很少涉及到富文本编辑;最近临时带了一个项目,里面要用到富文本编辑器,而且文件要统一上传到文件服务器上保存;应为以前用过ueditor就试着在网上着一些跨域保存…

精选Pycharm里6大神器插件

http://www.sohu.com/a/306693644_752099 上次写了一篇关于Sublime的精品插件推荐,有小伙伴提议再来一篇Pycharm的主题。相比Sublime,Pycharm要强大许多,而且是专为python设计的集成开发环境,所以无论是自身功能、环境配置还是使用…

数字信号处理实验(一)——DTFT

一、离散序列傅里叶变化——DTFT 1、DTFT公式 2、Matlab算法实现 function[X]dtft(x,n,w,flag)%计算离散时间付里叶变换 %[X]dtft(x,n,w) %X在w频率点上的DTFT数组 %xn点有限长度序列 %n样本位置向量 %w频率点位置向量X x * (exp(-j).^(n * w));3、DTFT一些画图代码 function …

修改hadoop中yarn的webui中显示的任务时间为中国时间

在${HADOOP_HOME}\share\hadoop\yarn目录下找到hadoop-yarn-common-x.x.x.jar,然后用winRAR打开; 打开以后结构如下: 进入webapps/static/目录,然后修改yarn.dt.plugins.js;做出如下修改: (1&a…

Trident API 概览

Trident API 概览 在网上看到了很多有TRIDENT相关API的翻译,看来看去,总觉得没有说清楚很多东西,所以自己结合使用的经验翻译了一篇出来;翻译完以后,也发现 在自己的翻译中也有很多地方是表达不清楚的不过多少感觉有些…

Trident State译文

Trident State 译文 Trident针对状态化的数据源的读写进行了一流的分装。State可以包含在拓扑中-例如,保存在内存中,有HDFS提供备份-也可以保存在一个外部的数据库中,像Memcached和Cassandra。针对以上的所有情况,Trident的API都…

软件之道:软件开发争议问题剖析

软件之道:软件开发争议问题剖析 基本信息 原书名: Making Software 原出版社: OReilly 作者: (美)Andy Oram Greg Wilson 译者: 鲍央舟 张玳 沈欢星丛书名: 图灵程序设计丛书出版社:人民邮…

Java 多线程-生产者、消费者

一、整体代码 ThreadDemo.java public class ThreadDemo { public static void main(String[] args) { Godown godown new Godown(0); Consumer c1 new Consumer(50, godown); Consumer c2 new Consumer(20, godown); Consumer c3 new Consumer(30, godown); Producer p1 …

HGOI20190707 题解

Problem A 钢铁侠的诞生 现在有$n$个数字$a_i \leq 10^9 $,然后取出$m$个数字,保证合法。 从小到大输出剩余的$n-m$个数字。 对于100%的数据$m\leq n \leq 3\times 10^5$ Sol : 直接map映射然后用iterator来遍历整个map输出答案即可。 复杂度大概是$O(n…

Java连载3-编译与运行阶段详解JRE,JDK,JVM关系

一、 1.JDK下载地址:https://www.oracle.com/technetwork/java/javase/downloads/jdk12-downloads-5295953.html 二、Java的加载与执行 1.Java程序运行包括: (1)编译阶段:检查Java源程序是否符合Java语法,符…

求最长回文串-从动态规划到马拉车之路(上)

要解决的问题: 给定一个字符串,要求求出这个字符串中的最长的回文串子串。 例子: cbddba的最长回文子串为 bddb cbdedba的最长回文子串为dbedb 由上面的例子可以看到,在考虑回文子串的问题时需要考虑奇偶性。因为奇回文关于中…

求最长回文串-从动态规划到马拉车之路(下)

预备知识&#xff1a; &#xff08;1&#xff09;在一个数轴上有两点i和j&#xff08;i<j&#xff09;关于点m对称&#xff0c;那么有 i 2m-j&#xff1b; 证明&#xff1a; 因为 i<j 且 i 和 j 关于 m 对称&#xff0c;那么有 &#xff08;i j&#xff09;/ 2 m 所…

Copy: 了解SQL Server锁争用:NOLOCK 和 ROWLOCK 的秘密

From http://blog.csdn.net/Atwind/archive/2007/10/19/1832844.aspx 关系型数据库&#xff0c;如SQL Server&#xff0c;使用锁来避免多用户修改数据时的并发冲突。当一组数据被某个用户锁定时&#xff0c;除非第一个用户结束修改并释放锁&#xff0c;否则其他用户就无法修改…

react-json渲染

在js文件内 //定义react组件 import React from react; import ReactDom from react-dom import ./components/assets/taobao.cssclass TaoBao extends React.Component{state{list:[{title:女装,href:javescript:;,hot:false,child:[{title:衬衫,href:javescript:;,hot:false}…

pageContext对象

这个对象代表页面上下文&#xff0c;该对象主要用于访问JSP之间的共享数据。使用pageContext可以访问page、request、session、application范围的变量。 pageContext是PageContext类的实例&#xff0c;它提供了如下两个方法来访问page、request、session、application范围的变量…

noi.ac #543 商店

我们考虑可并堆维护&#xff0c;从深到浅贪心选取。 用priority_queue启发式合并的话&#xff0c;是60pts: #include<iostream> #include<cstdio> #include<cstring> #include<algorithm> #include<cmath> #include<queue> #include<ct…

软件设计师--文件索引

问题&#xff08;题目&#xff09;如下图所示&#xff1a;这道题最中要的是理解什么是直接索引、一级间接索引、二级间接索引&#xff1a; 直接索引&#xff1a;地址项直接指向文件块 一级间接索引&#xff1a;地址项&#xff08;一层&#xff09;指向存放地址项&#xff08;二…

Floyd算法及其应用

Part I-Introduction Floyd算法是一种求图上多源最短路径的算法&#xff0c;适用于中小规模的图&#xff0c;思维简单易懂。 Floyd算法的实质是&#xff08;区间&#xff09;动态规划&#xff0c;在这里做一个简单的概述。 对于一个有\(n\)个结点的图&#xff0c; 令\(dis[i][j…

软件设计师--最早开始时间和最晚开始时间

题目如图所示&#xff0c;解法如下&#xff1a; 方法&#xff1a; 先求最早开始时间&#xff1a;A是开始节点&#xff0c;所以A的最早开始时间是0&#xff0c;并且最早开始时间等于最晚开始时间。等得到图中红色的部分。 其他节点的最早开始时间为以该节点作为弧头的所有有向…