Spark Metric/restapi
服務(wù)運行時將服務(wù)信息展示出來方便用戶查看時服務(wù)易用性的重要組成部分。特別時對于分布式集群服務(wù)。
spark服務(wù)本身有提供獲取應(yīng)用信息對方法,方便用戶查看應(yīng)用信息。Spark服務(wù)提供對master,worker,driver,executor,Historyserver進(jìn)程對運行展示。對于應(yīng)用(driver/executor)進(jìn)程,主要提供metric和restapi對訪問方式以展示運行狀態(tài)。
Metric信息:
服務(wù)/進(jìn)程通過Metric將自身運行信息展示出來。spark基于Coda Hale Metrics Library庫展示。需要展示的信息通過配置source類,在運行時通過反射實例化并啟動source進(jìn)行收集。然后通過配置sink類,將信息sink到對應(yīng)的平臺。
Metrics的source和sink模塊啟動流程
以driver為例:driver進(jìn)程啟動metricSystem的流程:
初始化:
SparkContext在初始化時調(diào)用 : MetricsSystem.createMetricsSystem("driver", conf, securityManager)
然后等待ui啟動后啟動并綁定webui(executor則是初始化后直接啟動)
metricsSystem.start()
metricsSystem.getServletHandlers.foreach(handler => ui.foreach(_.attachHandler(handler)))
進(jìn)一步查看MetricSystem創(chuàng)建過程:
創(chuàng)建MetricConfig, val metricsConfig = new MetricsConfig(conf)
初始化MetricConfig,首先設(shè)置默認(rèn)的屬性信息:
prop.setProperty("*.sink.servlet.class","org.apache.spark.metrics.sink.MetricsServlet")
prop.setProperty("*.sink.servlet.path","/metrics/json")
prop.setProperty("master.sink.servlet.path","/metrics/master/json")
prop.setProperty("applications.sink.servlet.path","/metrics/applications/json")
加載conf/metric.properties文件或者通過spark.metrics.conf制定的文件。讀取相關(guān)配置,metricsConfig.initialize()
在啟動metricSystem時,則會注冊并啟動source和sink
registerSources()
registerSinks()
sinks.foreach(_.start)
默認(rèn)啟動對source如下:
| Source | 服務(wù)/進(jìn)程 | 收集信息 |
|---|---|---|
| MasterSource | Master進(jìn)程Standalone模式生效 | workers,aliveWorkers,apps,waitingApps |
| ApplicationSource | Master進(jìn)程Standalone模式生效 | application,status,runtime_ms,cores |
| WorkerSource | Worker進(jìn)程,Standalone模式生效 | executors,coresUsed,memUsed_MB,coresFree,memFree_MB |
| StreamingSource | Streaming應(yīng)用,driver進(jìn)程 | receivers,lastReceivedBatch_records... |
| DAGSchedulerSource | driver進(jìn)程 | failedStages,runningStages,waitingStages,allJobs... |
| CodegenMetrics | sql應(yīng)用,driver進(jìn)程 | sourceCodeSize,compilationTime,generatedClassSize,generatedMethodSize |
| MesosClusterSchedulerSource | mesos調(diào)度模式下,drvier啟用 | WatingDrivers,LaunchedDrivers,retryDrivers |
| CacheMetrics | jobhistory進(jìn)程 | ookup.count. |
| ExecutorAllocationManagerSource | driver進(jìn)程,executor動態(tài)調(diào)度使用 | numberExecutorsToAdd,numberMaxNeededExecutors,numberTargetExecutors.. |
| ExecutorSource | executor進(jìn)程 | read_bytes,write_bytes,largeRead_ops,write_ops,read_ops,activeTasks... |
可配置的source如下:
| Source | 服務(wù)/進(jìn)程 | 收集信息 |
|---|---|---|
| JvmSource | driver,executor,master,worker | 收集jvm運行信息 |
配置方法:修改$SPARK_HOME/conf目錄下的metrics.properties文件:
默認(rèn)相關(guān)source已經(jīng)統(tǒng)計在列。可添加source為jvmsource。添加之后則相關(guān)進(jìn)程的jvm信息會被收集。配置方法
添加如下行:
driver.source.jvm.class=org.apache.spark.metrics.source.JvmSource
executor.source.jvm.class=org.apache.spark.metrics.source.JvmSource
或者*.source.jvm.class=org.apache.spark.metrics.source.JvmSource
source信息的獲取比較簡單,以DAGSchedulerSource的runningStages為例,直接計算dagscheduler的runningStages大小即可。override def getValue: Int = dagScheduler.runningStages.size
通過這些收集的信息可以看到,主要是方便查看運行狀態(tài),并非提供用來監(jiān)控和管理應(yīng)用
Metric信息展示方法:
收集的目的是方便展示,展示的方法是sink。
常用的sink如下:
a) metricserverlet
spark默認(rèn)的sink為metricsserverlet,通過driver服務(wù)啟動的webui綁定,然后展示出來。ip:4040/metrics/json(ip位driver節(jié)點的ip)展示:由于executor服務(wù)沒有相關(guān)ui,無法展示metricsource的信息。 下圖是配置過JVMsource后,通過driver節(jié)點的看到的metric信息。

b) CSV方式(將進(jìn)程的source信息,寫入到csv文件,各進(jìn)程打印至進(jìn)程節(jié)點的相關(guān)目錄下,每分鐘打印一次):
*.sink.csv.class=org.apache.spark.metrics.sink.CsvSink
*.sink.csv.period=1
*.sink.csv.directory=/tmp/
c) console方式(將進(jìn)程的source信息寫入到console/stdout
,輸出到進(jìn)程的stdout):
*.sink.console.class=org.apache.spark.metrics.sink.ConsoleSink
*.sink.console.period=20
*.sink.console.unit=seconds
d) slf4j方式(直接在運行日志中查看):
*.sink.slf4j.class=org.apache.spark.metrics.sink.Slf4jSink
*.sink.slf4j.period=10
*.sink.slf4j.unit=seconds
e) JMX方式(此情況下,相關(guān)端口要經(jīng)過規(guī)劃,不同的pap使用不同的端口,對于一個app來說,只能在一個節(jié)點啟動一個executor,否則會有端口沖突):
executor.sink.jmx.class=org.apache.spark.metrics.sink.JmxSink
JMX方式在配置后,需要在driver/executor啟動jmx服務(wù)。 可通過啟動應(yīng)用時添加如下操作實現(xiàn)--conf "spark.driver.extraJavaOptions=-Dcom.sun.management.jmxremote -Dcom.sun.management.jmxremote.port=8090 -Dcom.sun.management.jmxremote.rmi.port=8001 -Dcom.sun.management.jmxremote.authenticate=false -Dcom.sun.management.jmxremote.ssl=false --conf "spark.executor.extraJavaOptions=-Dcom.sun.management.jmxremote -Dcom.sun.management.jmxremote.port=8002 -Dcom.sun.management.jmxremote.rmi.port=8003 -Dcom.sun.management.jmxremote.authenticate=false -Dcom.sun.management.jmxremote.ssl=false"
可通過jconsole工具鏈接至對應(yīng)driver進(jìn)程所在ip和端口查看jmx信息。

restApi信息
通過RestApi可查看信息如下:
除例metrics之外,用戶還可以通過restApi接口查看應(yīng)用運行信息??梢圆樵兊男畔⑷缦拢▍⒁?http://spark.apache.org/docs/latest/monitoring.html):
| url | 描述 |
|---|---|
| /applications | A list of all applications |
| /applications/[app-id]/jobs | A list of all jobs for a given application |
| /applications/[app-id]/jobs/[job-id] | Details for the given job |
| /applications/[app-id]/stages | A list of all stages for a given application |
| /applications/[app-id]/stages/[stage-id] | A list of all attempts for the given stage |
| /applications/[app-id]/stages/[stage-id]/[stage-attempt-id] | Details for the given stage attempt |
| /applications/[app-id]/stages/[stage-id]/[stage-attempt-id]/taskSummary | Summary metrics of all tasks in the given stage attempt |
| /applications/[app-id]/stages/[stage-id]/[stage-attempt-id]/taskList | A list of all tasks for the given stage attempt |
| /applications/[app-id]/executors | A list of all executors for the given application |
| /applications/[app-id]/storage/rdd | A list of stored RDDs for the given application |
| /applications/[app-id]/storage/rdd/[rdd-id] | Details for the storage status of a given RDD |
| /applications/[app-id]/logs | dDownload the event logs for all attempts of the given application as a zip file |
| /applications/[app-id]/[attempt-id]/logs | Download the event logs for the specified attempt of the given application as a zip file |
通過RestApi查看信息方法:
運行中的應(yīng)用:通過driver進(jìn)程查看:
ip:port/api/v1/....
其中Ip為driver所在節(jié)點ip,端口為4040. 如果一個節(jié)點運行多個driver,端口會以此累加至4040,4041,4042 . 如:10.1.236.65:4041/api/v1/applications/application_1512542119073_0229/storage/rdd/23(on yarn 模式會自動跳轉(zhuǎn)至如下頁面)

對于運行完的應(yīng)用,可通過jobhistory服務(wù)查看
此場景下,需要提交應(yīng)用時打開eventlog記錄功能
打開方法在應(yīng)用的spark-defaults.conf中添加如下配置spark.eventLog.enabled為true,spark.eventLog.dir為hdfs:///spark-history 。
其中/spark-history可配置,需要和jobhistory進(jìn)程的路徑配置一致 ,該路徑可通過historyserver頁面查看。
ip:port/api/v1/....(其中Ip為spark服務(wù)的jobhistory進(jìn)程所在節(jié)點ip,默認(rèn)端口為18080). 可通過如下方式訪問:

總結(jié):
Spark作為計算引擎,對于大數(shù)據(jù)集群來說,作為客戶端向Yarn提交應(yīng)用來完成數(shù)據(jù)的分析。所使用的資源一般在yarn控制之下。其應(yīng)用場景并非作為服務(wù)端為其他組件提供服務(wù)。其所提供的信息通常是針對app級別,如job,stage,task等信息。一般的信息監(jiān)控需求均可通過其ui頁面查看。對于一些應(yīng)用的運行情況,可通過restapi獲取和分析。