spark monitoring --WebUi, Metrics System (reprint)

Reprinted from: https: //www.cnblogs.com/barrenlake/p/4364644.html

Spark monitoring relevant parts have WebUi and Metrics System; WebUi representative Spark state resources, index information Metrics System integration.

Ui related processes

After Spark cluster start, we can observe the cluster status and other information through the Web, this part of the work is Spark WebUi modules.

Servlet container to start:

When Master is created, by Val  webui =  new new  MasterWebUI ( the this , webUiPort) create webUi,

() Starts JettyServer, i.e. when Servlet containers (perStart ()) is started by Master webUi.bind.

Master's PRESTART () of source code is shown below

And webUi.bind () of source code is shown below:

WebUI page information

MasterWebUI initial creation will add three pages and a static resource processor, its initialization code is as follows:

Wherein attachPage method code is as follows:

Which is initialized when adding a page, the page address pagePath, create and bind request processor, and in response to the specified method page.render (request).

Wherein createServletHandler implemented as follows:

This function will call another overloaded methods, which in turn calls creatServlet method, create Servlet for external services. createServlet method code is shown below:

Servlet doGet method used to process the get request, the specific service provided by the incoming logic 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方法程序代码如下所示:

 

Guess you like

Origin www.cnblogs.com/itboys/p/11122177.html