Spark Metrics

Spark Metric/restapi

服务运行时将服务信息展示出来方便用户查看时服务易用性的重要组成部分。特别时对于分布式集群服务。

spark服务本身有提供获取应用信息对方法,方便用户查看应用信息。Spark服务提供对master,worker,driver,executor,Historyserver进程对运行展示。对于应用(driver/executor)进程,主要提供metric和restapi对访问方式以展示运行状态。

Metric信息:

服务/进程通过Metric将自身运行信息展示出来。spark基于Coda Hale Metrics Library库展示。需要展示的信息通过配置source类,在运行时通过反射实例化并启动source进行收集。然后通过配置sink类,将信息sink到对应的平台。

Metrics的source和sink模块启动流程

以driver为例:driver进程启动metricSystem的流程:

初始化:

SparkContext在初始化时调用 : MetricsSystem.createMetricsSystem("driver", conf, securityManager)

然后等待ui启动后启动并绑定webui(executor则是初始化后直接启动)

metricsSystem.start()

metricsSystem.getServletHandlers.foreach(handler => ui.foreach(_.attachHandler(handler)))

进一步查看MetricSystem创建过程:

创建MetricConfig, val metricsConfig = new MetricsConfig(conf)

初始化MetricConfig,首先设置默认的属性信息:

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制定的文件。读取相关配置,metricsConfig.initialize()

在启动metricSystem时,则会注册并启动source和sink

registerSources()

registerSinks()

sinks.foreach(_.start)

默认启动对source如下:

Source 服务/进程 收集信息
MasterSource Master进程Standalone模式生效 workers,aliveWorkers,apps,waitingApps
ApplicationSource Master进程Standalone模式生效 application,status,runtime_ms,cores
WorkerSource Worker进程,Standalone模式生效 executors,coresUsed,memUsed_MB,coresFree,memFree_MB
StreamingSource Streaming应用,driver进程 receivers,lastReceivedBatch_records...
DAGSchedulerSource driver进程 failedStages,runningStages,waitingStages,allJobs...
CodegenMetrics sql应用,driver进程 sourceCodeSize,compilationTime,generatedClassSize,generatedMethodSize
MesosClusterSchedulerSource mesos调度模式下,drvier启用 WatingDrivers,LaunchedDrivers,retryDrivers
CacheMetrics jobhistory进程 ookup.count.
ExecutorAllocationManagerSource driver进程,executor动态调度使用 numberExecutorsToAdd,numberMaxNeededExecutors,numberTargetExecutors..
ExecutorSource executor进程 read_bytes,write_bytes,largeRead_ops,write_ops,read_ops,activeTasks...

可配置的source如下:

Source 服务/进程 收集信息
JvmSource driver,executor,master,worker 收集jvm运行信息

配置方法:修改$SPARK_HOME/conf目录下的metrics.properties文件:

默认相关source已经统计在列。可添加source为jvmsource。添加之后则相关进程的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

通过这些收集的信息可以看到,主要是方便查看运行状态,并非提供用来监控和管理应用
Metric信息展示方法:
收集的目的是方便展示,展示的方法是sink。

常用的sink如下:

a) metricserverlet

spark默认的sink为metricsserverlet,通过driver服务启动的webui绑定,然后展示出来。ip:4040/metrics/json(ip位driver节点的ip)展示:由于executor服务没有相关ui,无法展示metricsource的信息。 下图是配置过JVMsource后,通过driver节点的看到的metric信息。


屏幕快照 2017-12-21 下午1.28.47.png

b) CSV方式(将进程的source信息,写入到csv文件,各进程打印至进程节点的相关目录下,每分钟打印一次):

*.sink.csv.class=org.apache.spark.metrics.sink.CsvSink

*.sink.csv.period=1

*.sink.csv.directory=/tmp/

c) console方式(将进程的source信息写入到console/stdout

,输出到进程的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方式(此情况下,相关端口要经过规划,不同的pap使用不同的端口,对于一个app来说,只能在一个节点启动一个executor,否则会有端口冲突):

executor.sink.jmx.class=org.apache.spark.metrics.sink.JmxSink

JMX方式在配置后,需要在driver/executor启动jmx服务。 可通过启动应用时添加如下操作实现--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工具链接至对应driver进程所在ip和端口查看jmx信息。

屏幕快照 2017-12-21 下午1.36.25.png

restApi信息

通过RestApi可查看信息如下:

除例metrics之外,用户还可以通过restApi接口查看应用运行信息。可以查询的信息如下(参见 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查看信息方法:

运行中的应用:通过driver进程查看:
ip:port/api/v1/....

其中Ip为driver所在节点ip,端口为4040. 如果一个节点运行多个driver,端口会以此累加至4040,4041,4042 . 如:10.1.236.65:4041/api/v1/applications/application_1512542119073_0229/storage/rdd/23(on yarn 模式会自动跳转至如下页面)


屏幕快照 2017-12-21 上午11.21.08.png

对于运行完的应用,可通过jobhistory服务查看
此场景下,需要提交应用时打开eventlog记录功能
打开方法在应用的spark-defaults.conf中添加如下配置spark.eventLog.enabled为true,spark.eventLog.dir为hdfs:///spark-history 。
其中/spark-history可配置,需要和jobhistory进程的路径配置一致 ,该路径可通过historyserver页面查看。
ip:port/api/v1/....(其中Ip为spark服务的jobhistory进程所在节点ip,默认端口为18080). 可通过如下方式访问:


屏幕快照 2017-12-21 上午11.32.06.png

总结:

Spark作为计算引擎,对于大数据集群来说,作为客户端向Yarn提交应用来完成数据的分析。所使用的资源一般在yarn控制之下。其应用场景并非作为服务端为其他组件提供服务。其所提供的信息通常是针对app级别,如job,stage,task等信息。一般的信息监控需求均可通过其ui页面查看。对于一些应用的运行情况,可通过restapi获取和分析。

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 218,284评论 6 506
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 93,115评论 3 395
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 164,614评论 0 354
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 58,671评论 1 293
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 67,699评论 6 392
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 51,562评论 1 305
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 40,309评论 3 418
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 39,223评论 0 276
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 45,668评论 1 314
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,859评论 3 336
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,981评论 1 348
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 35,705评论 5 347
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 41,310评论 3 330
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,904评论 0 22
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 33,023评论 1 270
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 48,146评论 3 370
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,933评论 2 355

推荐阅读更多精彩内容