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,一经查实,立即删除!

相关文章

js中使用shiro标签的一个小坑

在jsp页面中使用shiro标签很简单 <shiro:haspermission name"你的权限"> 你的标签 </shiro:haspermission> 这样就可以把标签加上权限了。 但是有时候你的标签是js动态生成的&#xff0c;就像下面的例子&#xff1a; <script type"text/java…

求1-100数字的和

function sum_all(){var result 0;for(var i0;i<100;i){resultresulti;}return result; } var s sum_all(100); console.log(s);// while循环 function sum_all(){var result 0;var i0;while(i<100){i;resultresulti;}return result; } //do while语句 function sum_al…

微信开发--自定义菜单

一、定义几个实体类 public class AccessToken {//这里定义一个AccessToken的实体类&#xff0c;用来保存获取到的accesstokenprivate String token;//获得到的tokenprivate int expireIn;//过期时间public String getToken() {return token;}public void setToken(String toke…

.Net框架理论

.NET框架 .NET Framework是该平台的第一个也是最早的实现。它包括三个主要的应用程序模型 - WPF&#xff0c;Windows窗体&#xff0c;ASP.NET窗体 - 和基类库。 Windows Presentation Foundation&#xff08;WPF&#xff09;是一个UI框架&#xff0c;用于主要为Windows操作系统…

zkCli使用手册

zkClient命令笔记connect host:port 连接到其他的zk服务器&#xff0c;例&#xff1a;connect 192.168.174.222:2181-------------------------------------------------------------------------------------------------------get path [watch] 获取某个节点的数据&#xff0…

浏览器解析JavaScript的原理

JavaScript的特点一般都知道的就是解释执行&#xff0c;逐行执行&#xff0c;就是从上到下依次执行。 JavaScript的执行之前&#xff0c;其实还是有一些操作的&#xff0c;只是没有表现出来 JavaScript的执行过程&#xff1a; 1、语法检测  首先是大致查看有没有基本的语法错…

实现 tomcat 热加载证书

原文地址&#xff1a;https://my.oschina.net/u/157514/blog/395238 之前一篇中说了如何 建立 https 通信的完整流程&#xff0c;其中涉及了java web容器 tomcat&#xff0c;关于它的配置是&#xff1a; <Connector port"8443" protocol"org.apache.coyote.…

修改yapf中的列宽限制值

yapf是一款由Google开源的Python代码自动格式化工具&#xff0c;它根据PEP 8规范可以帮我们自动格式化我们的代码&#xff0c;让代码更规范、更漂亮。但是其中最大列宽被限制为80&#xff0c;如果超过80&#xff0c;在格式化时就会被yapf换行&#xff0c;随着现在人们的显示器越…

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

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

【转】C++类的sizeof大小

转自https://blog.csdn.net/zhengjihao/article/details/77825269 其中有的描述与实际GCC上执行的结果不符&#xff0c;不过其中的分析思路需要掌握。 以下是GCC的实际执行结果&#xff1a; 1 #include <iostream>2 using namespace std;3 4 int *pointer;5 6 class Null…

shiro扩展获得用户登录类型并提供cookie的方式记住用户密码

在最近的项目中要实现一个需求&#xff1a;“同时让两种类型的用户进行登录&#xff0c;登录后如果用户勾选了记住密码就要生成cookie来记录用户的密码和用户名”。本人做安全认证的时候一直在使用shiro&#xff0c;所以就想到在shiro的基础上进行一些扩展来满足需求。 shiro自…

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

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

JavaWeb-RESTful_用SpringMVC开发RESTful

RESTful简介 一种软件架构风格、设计风格&#xff0c;而不是标准&#xff0c;只是提供了一组设计原则和约束条件。 它主要用于客户端和服务器交互类的软件。 基于这个风格设计的软件可以更简洁&#xff0c;更有层次&#xff0c;更易于实现缓存等机制。 RESTful可以理解为一种编…

在storm中使用流

storm是一个强大的流式计算框架&#xff0c;单流的storm在使用中非常普遍&#xff0c;而同时storm也提供对多个流的支持&#xff1b;通过定义多个流&#xff0c;用户可以进一步的把数据发放到不同的流中进行处理。 代码如下&#xff1a; 一、 定义多个流的spout public class…

精选Pycharm里6大神器插件

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

在storm中使用定时保存

在storm中使用实时保存会对性能带来很大的考验&#xff0c;所以在很多场景中还是使用定时保存&#xff1b;而且storm自带了定时功能&#xff0c;使用方式如下&#xff1a; 首先在topo中的config中定义一个通信时间&#xff0c;定义方式如下&#xff1a; conf.put(Config.TOPOLO…

数字信号处理实验(一)——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&#xff0c;然后用winRAR打开&#xff1b; 打开以后结构如下&#xff1a; 进入webapps/static/目录&#xff0c;然后修改yarn.dt.plugins.js&#xff1b;做出如下修改&#xff1a; &#xff08;1&a…

一条语句复制整个目录《转》

使用的是 Delphi 2010 下 IOUtils 单元的 TDirectory.Copy 函数: 1 uses IOUtils; 2 3 procedure TForm1.Button1Click(Sender: TObject); 4 const 5 SourceDir C:\Temp\Folder1; { 源文件夹必须存在 } 6 DestDir C:\Temp\Folder2; { 如果目标文件夹不存在, 程序会自动…

设计模式与重构汇总

面向对象的基本原则&#xff1a;单一原则&#xff1a;引起一个类发生变化的原因只有一个 开放封闭原则&#xff1a;对于类的修改是封闭的&#xff0c;而对于类的扩展是开放的 依赖倒置原则&#xff1a;高层不依赖于底层&#xff0c;都应该依赖与抽象&#xff1b;抽象不依赖于…