首页 技术 正文
技术 2022年11月17日
0 收藏 422 点赞 4,191 浏览 38126 个字

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()的源码如下所示

spark 监控–WebUi、Metrics System

又webUi.bind()的源码如下所示:

spark 监控–WebUi、Metrics System

WebUI页面信息

创建的MasterWebUI初始化时会添加三个页面和一个静态资源处理器,其初始化代码如下:

spark 监控–WebUi、Metrics System

其中 attachPage方法代码如下:

spark 监控–WebUi、Metrics System

其在添加页面时将初始化,页面地址pagePath,创建并绑定请求处理器,以及指定响应方法page.render(request).

其中createServletHandler实现如下:

spark 监控–WebUi、Metrics System

此函数中会掉用另一重载方法,其又会调用creatServlet方法,创建Servlet用于对外提供服务。createServlet方法代码如下所示:

spark 监控–WebUi、Metrics System

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源程序代码如下:

spark 监控–WebUi、Metrics System

通过分析源代码可知:renderjson首先向master发送消息RequestMasterState,请求Master的状态信息. 然后阻塞等待结果,然后将结果转换成JSON格式、返回。

Master收到RequestMasterState消息后:

spark 监控–WebUi、Metrics System

将其状态信息封装成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实例时都将会从此属性中取相应的Metric sConfig配制.如下代码所示:若存在指定key的属性,则返回;否则返回默认值。

spark 监控–WebUi、Metrics System

propertyCategories将在MetricsConfig初始化时(initialize()调用时)对其赋值,初始化过程如下:

防止没有属性文件,添加默认属性。

spark 监控–WebUi、Metrics System

检测spark.metrics.conf是否设置,若未设置则试着去classpath下寻找”metrics.properties”文件。若存在配制文件,则将其属性载入properties。

spark 监控–WebUi、Metrics System

然后将properties中内容进行抽取、分类、归并处理,其代码如下:

spark 监控–WebUi、Metrics System

若不存在配制文件的情况下,系统只有默认添加属性,经上述代码处理的结果为:

  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属性进行抽取、规类。代码如下:

spark 监控–WebUi、Metrics System

注册数据源: MetricsSystem启动时

当MetricsSystem 在启动时将会调用注册数据源函数registerSources(),注册实例相关的所有数据源。

spark 监控–WebUi、Metrics System

上面是registerSources相关代码,其通过getInstance()方法获取该instance相关的配制属性。然后通过subProperties方法进行抽取、归类。然后取出key为class的属性,利用java反射机制创建Source对象并进行注册。默认情况下不存在Source相关属性,所以此例中MasterSource唯一数据源。

其通过MetricsConfig的getInstance()方法。该方法会以传入的instance做为key 去propertyCategories中取属性值

注册数据汇(目的地)

MetricsSystem的start()方法通过调用registerSinks()方法来注册数据汇(数据指标接收点)。程序代码如下所示:

spark 监控–WebUi、Metrics System

通过分析此方法的源码,若未通过配制文件指定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。其核心代码如下:

<img src="data:image/png;base64,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" alt="" />

此方法将创建以/metrics/master/json为请求路径的httpServlet, 影响类型为JSON串。

然后并将创建的Hander赋值给通过MetircsSystem的getServletHander方法交由WebUi处理。

getServletHander方法程序代码如下所示:

spark 监控–WebUi、Metrics System

注: http://www.cnblogs.com/barrenlake/p/4364644.html

相关推荐
python开发_常用的python模块及安装方法
adodb:我们领导推荐的数据库连接组件bsddb3:BerkeleyDB的连接组件Cheetah-1.0:我比较喜欢这个版本的cheeta…
日期:2022-11-24 点赞:878 阅读:9,082
Educational Codeforces Round 11 C. Hard Process 二分
C. Hard Process题目连接:http://www.codeforces.com/contest/660/problem/CDes…
日期:2022-11-24 点赞:807 阅读:5,556
下载Ubuntn 17.04 内核源代码
zengkefu@server1:/usr/src$ uname -aLinux server1 4.10.0-19-generic #21…
日期:2022-11-24 点赞:569 阅读:6,406
可用Active Desktop Calendar V7.86 注册码序列号
可用Active Desktop Calendar V7.86 注册码序列号Name: www.greendown.cn Code: &nb…
日期:2022-11-24 点赞:733 阅读:6,179
Android调用系统相机、自定义相机、处理大图片
Android调用系统相机和自定义相机实例本博文主要是介绍了android上使用相机进行拍照并显示的两种方式,并且由于涉及到要把拍到的照片显…
日期:2022-11-24 点赞:512 阅读:7,815
Struts的使用
一、Struts2的获取  Struts的官方网站为:http://struts.apache.org/  下载完Struts2的jar包,…
日期:2022-11-24 点赞:671 阅读:4,898