Spark 应用监控告警-Graphite_exporter

article/2025/9/20 16:35:31

Spark 应用监控告警-Graphite_exporter

  • Spark监控和工具
    • Web界面
    • 事后查看
    • REST API
    • 度量
    • 高级工具
  • 一、下载graphite_exporter
    • 1.1 修改graphite_exporter_mapping
    • 1.2 启动graphite_exporter
  • 二、Spark配置Graphite metrics
  • 三、启动Spark程序
  • 四、配置Prometheus
    • 4.1 查看Prometheus是否收集到metrics数据
  • 五、Metrics分析
  • 六、Grafana模板
  • 七、进程监控失败重启和告警模块

 


相关内容原文地址:

CSDN:瓜牛呱呱:让 Spark Streaming 程序在 YARN 集群上长时间运行(一)—— 故障容错、性能、安全
CSDN:瓜牛呱呱:让 Spark Streaming 程序在 YARN 集群上长时间运行(二)—— 日志、监控、Metrics
CSDN:瓜牛呱呱:让 Spark Streaming 程序在 YARN 集群上长时间运行(三)—— Grafana、优雅地停止(Graceful stop)、总结
CSDN:weixin_44772715:graphite_exporter收集spark on yarn metrics
简书:0o青团o0:Spark 应用监控告警和自动重启
灰信网(软件开发博客聚合):使用 PROMETHEUS 和 GRAFANA 监控 SPARK 应用
并发编程网:邓林:《Spark 官方文档》监控和工具


Spark监控和工具

监控Spark应用有很多种方式:web UI,metrics 以及外部工具。

Web界面

每个SparkContext都会启动一个web UI,其默认端口为4040,并且这个web UI能展示很多有用的Spark应用相关信息。包括:

  • 一个stage和task的调度列表
  • 一个关于RDD大小以及内存占用的概览
  • 运行环境相关信息
  • 运行中的执行器相关信息

打开浏览器,输入 http://:4040 即可访问该web界面。如果有多个SparkContext在同时运行中,那么它们会从4040开始,按顺序依次绑定端口(4041,4042,等)。

注意,默认情况下,这些信息只有在Spark应用运行期内才可用。如果需要在Spark应用退出后仍然能在web UI上查看这些信息,则需要在应用启动前,将 spark.eventLog.enabled 设为 true。这项配置将会把Spark事件日志都记录到持久化存储中。

事后查看

Spark独立部署时,其对应的集群管理器也有其对应的 web UI。如果Spark应用将其运行期事件日志保留下来了,那么独立部署集群管理器对应的web UI将会根据这些日志自动展示已经结束的Spark应用。

如果Spark是运行于Mesos或者YARN上的话,那么你需要开启Spark的history server,开启event log。开启history server需要如下指令:
./sbin/start-history-server.sh

如果使用file-system provider class(参考下面的 spark.history.provider),那么日志目录将会基于 spark.history.fs.logDirectory 配置项,并且在表达Spark应用的事件日志路径时,应该带上子目录。history server对应的web界面默认在这里 http://<server-url>:18080。

环境变量含义
SPARK_DAEMON_MEMORYhistory server分配多少内存(默认: 1g)
SPARK_DAEMON_JAVA_OPTShistory server的 JVM参数(默认:none)
SPARK_PUBLIC_DNShistory server的外部访问地址,如果不配置,那么history server有可能会绑定server的内部地址,这可能会导致外部不能访问(默认:none)
SPARK_HISTORY_OPTShistory server配置项(默认:none):spark.history.*

REST API

度量信息除了可以在UI上查看之外,还可以以JSON格式访问。这能使开发人员很容易构建新的Spark可视化和监控工具。JSON格式的度量信息对运行中的Spark应用和history server中的历史作业均有效。其访问端点挂载在 /api/v1 路径下。例如,对于history server,一般你可以通过 http://<server-url>:18080/api/v1 来访问,而对于运行中的应用,可以通过 http://localhost:4040/api/v1 来访问。

在这里插入图片描述
如果在YARN上运行,每个应用都由多个attempts,所以 [app-id] 实际上是 [app-id]/[attempt-id]。
这些API端点都有版本号,所以基于这些API开发程序就比较容易。Spark将保证:

  • 端点一旦添加进来,就不会删除
  • 某个端点支持的字段永不删除
  • 未来可能会增加新的端点
  • 已有端点可能会增加新的字段
  • 未来可能会增加新的API版本,但会使用不同的端点(如:api/v2 )。但新版本不保证向后兼容。
  • API版本可能会整个丢弃掉,但在丢弃前,一定会和新版本API共存至少一个小版本。

注意,在UI上检查运行中的应用时,虽然每次只能查看一个应用, 但applicatoins/[app-id] 这部分路径仍然是必须的。例如,你需要查看运行中应用的作业列表时,你需要输入 http://localhost:4040/api/v1/applications/[app-id]/jobs。虽然麻烦点,但这能保证两种模式下访问路径的一致性。

度量

Spark的度量子系统是可配置的,其功能是基于Coda Hale Metrics Library开发的。这套度量子系统允许用户以多种形式的汇报槽(sink)汇报Spark度量信息,包括:HTTP、JMX和CSV文件等。其对应的配置文件路径为:${SPARK_HOME}/conf/metrics.properties。当然,你可以通过spark.metrics.conf 这个Spark属性来自定义配置文件路径(详见configuration property)。Spark的各个组件都有其对应的度量实例,且这些度量实例之间是解耦的。这些度量实例中,你都可以配置一系列不同的汇报槽来汇报度量信息。以下是目前支持的度量实例:

  • master: 对应Spark独立部署时的master进程。
  • applications: master进程中的一个组件,专门汇报各个Spark应用的度量信息。
  • worker: 对应Spark独立部署时的worker进程。
  • executor: 对应Spark执行器。
  • driver: 对应Spark驱动器进程(即创建SparkContext对象的进程)。

每个度量实例可以汇报给0~n个槽。以下是目前 org.apache.spark.metrics.sink 包中包含的几种汇报槽(sink):

  • ConsoleSink:将度量信息打印到控制台。
  • CSVSink: 以特定的间隔,将度量信息输出到CSV文件。
  • JmxSink: 将度量信息注册到JMX控制台。
  • MetricsServlet: 在已有的Spark UI中增加一个servlet,对外提供JSON格式的度量数据。
  • GraphiteSink: 将度量数据发到Graphite 节点。
  • Slf4jSink: 将度量数据发送给slf4j 打成日志。

Spark同样也支持Ganglia,但因为license限制的原因没有包含在默认的发布包中:

  • GangliaSink: 将度量信息发送给一个Ganglia节点或者多播组。

度量系统配置文件语法可以参考这个配置文件示例:${SPARK_HOME}/conf/metrics.properties.template

高级工具

以下是几个可以用以分析Spark性能的外部工具:

  • 集群整体监控工具,如:Ganglia,可以提供集群整体的使用率和资源瓶颈视图。比如,Ganglia的仪表盘可以迅速揭示出整个集群的工作负载是否达到磁盘、网络或CPU限制。
  • 操作系统分析工具,如:dstat, iostat, 以及 iotop ,可以提供单个节点上细粒度的分析剖面。
  • JVM工具可以帮助你分析JVM虚拟机,如:jstack可以提供调用栈信息,jmap可以转储堆内存数据,jstat可以汇报时序统计信息,jconsole可以直观的探索各种JVM属性,这对于熟悉JVM内部机制非常有用。

一、下载graphite_exporter

Graphite 来收集度量标准,Grafana 则用于构建仪表板,首先,需要配置 Spark 以将 metrics 报告到 Graphite。

prometheus 提供了一个插件(graphite_exporter),可以将 Graphite metrics 进行转化并写入 Prometheus (本文的方式)。

先去https://prometheus.io/download/下载graphite_exporter。
在这里插入图片描述

1.1 修改graphite_exporter_mapping

  • 将下载下来的graphite_exporter上传至服务器:
rz + graphite_exporter-.....tar.gz
  • 解压:
tar -zxvf graphite_exporter....tar.gz
  • 重命名:
mv graphite_exporter....  graphite_exporter
  • 进入到graphite_exporter,在该路面下创建graphite_exporter_mapping文件:
vi graphite_exporter_mapping
  • 添加如下内容
mappings:
- match: '*.*.executor.filesystem.*.*'name: spark_app_filesystem_usagelabels:application: $1executor_id: $2fs_type: $3qty: $4
- match: '*.*.jvm.*.*'name: spark_app_jvm_memory_usagelabels:application: $1executor_id: $2mem_type: $3qty: $4
- match: '*.*.executor.jvmGCTime.count'name: spark_app_jvm_gcTime_countlabels:application: $1executor_id: $2
- match: '*.*.jvm.pools.*.*'name: spark_app_jvm_memory_poolslabels:application: $1executor_id: $2mem_type: $3qty: $4
- match: '*.*.executor.threadpool.*'name: spark_app_executor_taskslabels:application: $1executor_id: $2qty: $3
- match: '*.*.BlockManager.*.*'name: spark_app_block_managerlabels:application: $1executor_id: $2type: $3qty: $4
- match: '*.*.DAGScheduler.*.*'name: spark_app_dag_schedulerlabels:application: $1executor_id: $2type: $3qty: $4
- match: '*.*.CodeGenerator.*.*'name: spark_app_code_generatorlabels:application: $1executor_id: $2type: $3qty: $4
- match: '*.*.HiveExternalCatalog.*.*'name: spark_app_hive_external_cataloglabels:application: $1executor_id: $2type: $3qty: $4
- match: '*.*.*.StreamingMetrics.*.*'name: spark_app_streaming_metricslabels:application: $1executor_id: $2app_name: $3type: $4qty: $5

1.2 启动graphite_exporter

./graphite_exporter --graphite.mapping-config=graphite_exporter_mapping

Spark应用监控解决方案–使用Prometheus和Grafana监控Spark应用——
graphite_exporter_mapping格式:

mappings:
- match: '*.*.executor.filesystem.*.*'name: filesystem_usagelabels:application: $1executor_id: $2fs_type: $3qty: $4- match: '*.*.executor.threadpool.*'name: executor_taskslabels:application: $1executor_id: $2qty: $3- match: '*.*.executor.jvmGCTime.count'name: jvm_gcTime_countlabels:application: $1executor_id: $2- match: '*.*.executor.*.*'name: executor_infolabels:application: $1executor_id: $2type: $3qty: $4- match: '*.*.jvm.*.*'name: jvm_memory_usagelabels:application: $1executor_id: $2mem_type: $3qty: $4- match: '*.*.jvm.pools.*.*'name: jvm_memory_poolslabels:application: $1executor_id: $2mem_type: $3qty: $4- match: '*.*.BlockManager.*.*'name: block_managerlabels:application: $1executor_id: $2type: $3qty: $4- match: '*.driver.DAGScheduler.*.*'name: DAG_schedulerlabels:application: $1type: $2qty: $3- match: '*.driver.*.*.*.*'name: task_infolabels:application: $1task: $2type1: $3type2: $4qty: $5

二、Spark配置Graphite metrics

Spark 是自带 Graphite Sink 的,只需要配置一下metrics.properties;
进入到spark安装目录下,进入到conf目录下,找到metrics.properties

cd /spark/conf/
vi metrics.properties

在最下面更新如下内容:

*.source.jvm.class=org.apache.spark.metrics.source.JvmSource
master.source.jvm.class=org.apache.spark.metrics.source.JvmSource
worker.source.jvm.class=org.apache.spark.metrics.source.JvmSource
driver.source.jvm.class=org.apache.spark.metrics.source.JvmSource
executor.source.jvm.class=org.apache.spark.metrics.source.JvmSource*.sink.graphite.class=org.apache.spark.metrics.sink.GraphiteSink
*.sink.graphite.protocol=tcp
*.sink.graphite.host=spark-ip
*.sink.graphite.port=9109
*.sink.graphite.period=1
*.sink.graphite.unit=seconds

graphite_exporter 接收数据端口为9109
Prometheus接收数据端口开发说明

三、启动Spark程序

启动spark程序时,需要加上–files /usr/etc/spark/conf/metrics.properties参数。
例如:

nohup ./spark-submit --class StreamingInput --master spark://master:7077 --supervise --num-executors 3 --total-executor-cores 3 --executor-memory 2g --files /usr/etc/spark/conf/metrics.properties /root/StreamingInput.jar > /root/logs/StreamingInput.log.txt 2>&1 &
  • 将应用程序的 metric 固定为静态的应用程序名称:
--conf spark.metrics.namespace=my_application_name
  •  

四、配置Prometheus

scrape_configs:- job_name: 'spark'static_configs:- targets: ['spark-ip:9108']

重启Prometheus。

4.1 查看Prometheus是否收集到metrics数据

curl spark-ip:9108/metrics    
  •  

若成功,则会收到如下数据:

# HELP go_gc_duration_seconds A summary of the GC invocation durations.
# TYPE go_gc_duration_seconds summary
go_gc_duration_seconds{quantile="0"} 3.5844e-05
go_gc_duration_seconds{quantile="0.25"} 7.1282e-05
go_gc_duration_seconds{quantile="0.5"} 9.674e-05
go_gc_duration_seconds{quantile="0.75"} 0.0001363.................................此处略过很多行spark_app_jvm_memory_usage{application="application_1556625797222_0045",executor_id="driver",mem_type="total",qty="max"} 1.050673151e+09
spark_app_jvm_memory_usage{application="application_1556625797222_0045",executor_id="driver",mem_type="total",qty="used"} 1.114036792e+09
  •  

五、Metrics分析

Spark 会从 Driver 和 executors 生成大量指标。 如果我选择最重要的一个,那将是最后收到的 batch 的信息。 当StreamingMetrics.streaming.lastReceivedBatch_records == 0时,这可能意味着 Spark Streaming 作业已停止或失败。

下面列出了其他重要的 metrics:

  • 当总延迟大于批处理间隔时,处理延迟将会增加。
driver.StreamingMetrics.streaming.lastCompletedBatch_totalDelay
  • 1
  • 当运行的 task 数低于 number of executors * number of cores 时,YARN 分配的资源未充分利用。
executor.threadpool.activeTasks
  • 1
  • RDD的缓存使用了多少内存。
driver.BlockManager.memory.memUsed_MB
  • 1
  • 当 RDD 缓存没有足够的内存时,有多少数据 spilled 到磁盘。 你应该增加executor 内存或更改 spark.memory.fraction 的Spark参数以避免性能下降。
driver.BlockManager.disk.diskSpaceUsed_MB
  • 1
  • Spark Driver 上的 JVM 内存利用率是多少
driver.jvm.heap.used
driver.jvm.non-heap.used
driver.jvm.pools.G1-Old-Gen.used
driver.jvm.pools.G1-Eden-Space.used
driver.jvm.pools.G1-Survivor-Space.used
  • 1
  • 2
  • 3
  • 4
  • 5
  • 在Spark Driver上的 GC 花费了多少时间
driver.jvm.G1-Old-Generation.time
driver.jvm.G1-Young-Generation.time
  • 1
  • 2
  • Spark executors 上的 JVM 内存利用率是多少
[0-9]*.jvm.heap.used
[0-9]*.jvm.non-heap.used
[0-9]*.jvm.pools.G1-Old-Gen.used
[0-9]*.jvm.pools.G1-Survivor-Space.used
[0-9]*.jvm.pools.G1-Eden-Space.used
  • 1
  • 2
  • 3
  • 4
  • 5
  • 在Spark executors上的 GC 花费了多少时间
[0-9]*.jvm.G1-Old-Generation.time
[0-9]*.jvm.G1-Young-Generation.time
  • 1
  • 2

六、Grafana模板

在Grafana官网,没有找到合适的dashboard,貌似得自己手写了。需要自己研究手写搞一套了。。
DASHBOARD 配置:
将 application label 加入 Variables 用于筛选不同的应用:
在这里插入图片描述
配置相应的图表:
在这里插入图片描述

七、进程监控失败重启和告警模块

监控yarn上指定的Spark应用是否存在,不存在则发出告警。

使用Python脚本查看yarn状态,指定监控应用,应用中断则通过webhook发送报警信息到钉钉群,并且自动重启。

#!/usr/bin/python3.5
# -*- coding: utf-8 -*-
import os
import json
import requests'''
Yarn应用监控:当配置的应用名不在yarn applicaition -list时,钉钉告警
'''def yarn_list(applicatin_list):yarn_application_list = os.popen('yarn application -list').read()result = ""for appName in applicatin_list:if appName in yarn_application_list:print("应用:%s 正常!" % appName)else:result += ("告警--应用:%s 中断!" % appName)if "应用名1" == appName:os.system('重启命令')return resultdef dingding_robot(data):# 机器人的webhooK 获取地址参考:https://open-doc.dingtalk.com/microapp/serverapi2/qf2nxqwebhook = "https://oapi.dingtalk.com/robot/send?access_token" \"=你的token "headers = {'content-type': 'application/json'}  # 请求头r = requests.post(webhook, headers=headers, data=json.dumps(data))r.encoding = 'utf-8'return r.textif __name__ == '__main__':applicatin_list = ["应用名1", "应用名2", "应用名3"]output = yarn_list(applicatin_list)print(output)if len(output) > 0:# 请求参数 可以写入配置文件中data = {"msgtype": "text","text": {"content": output},"at": {"atMobiles": ["xxxxxxx"],"isAtAll": False}}res = dingding_robot(data)print(res)  # 打印请求结果else:print("一切正常!")

http://chatgpt.dhexx.cn/article/YnM6YFjx.shtml

相关文章

Graphite系统监控

转载至 : http://my.oschina.net/fufangchun/blog/232895?p1 目录[-] 一、简介&#xff1a; 二、Graphite的安装及配置 0.Graphite目录 1.安装环境 2.所需软件 3.安装依赖 4.安装Graphite组件 ①.检查依赖&#xff1a; ②.安装graphite-web&#xff1a; ②.安装whisper&#x…

【大数据监控】Prometheus、Node_exporter、Graphite_exporter安装部署详细文档

目录 Prometheus简介下载软件包安装部署创建用户创建Systemd服务修改配置文件prometheus.yml启动Prometheus node exporter下载软件包安装部署创建systemd服务启动node_exporter graphite_exporter下载软件包安装部署创建systemd服务启动 graphite_exporter Prometheus 简介 P…

docker部署grafana graphite stastd实时监控告警配置_亲测成功

docker部署grafana graphite stastd实时监控告警配置_亲测成功 实时监控请求的次数和响应时间及异常报警 项目中需要监控API接口的调用情况,如:调用次数,每次调用耗时,调用高峰期,异常报警等 grafana graphite stastd这一套对代码没有侵入,也不会影响接口性能 安装docker环…

graphite安装笔记

0.Graphite目录 Graphite安装之后&#xff0c;在安装位置(默认为/opt/graphite)的文件布局如下&#xff1a; 目录介绍/opt/graphite/bin二进制文件目录/opt/graphite/conf配置文件目录/opt/graphite/lib库目录/opt/graphite/storage数据存放目录&#xff0c;包括log&#xff0c…

graphite 数据库_大数据存储和分析-IBM DB2和Graphite

在本文中,我们将结合IBM™Persistence API使用IBM DB2作为数据源,描述PCC系统中的数据存储。 此外,我们讨论了如何使用Graphite来检测代码库和工作负载。 最后,我们描述了用于分析数据的工具。 成绩单 IBM DB2和Java Persistence API DB2是IBM关系数据库服务器,已在整个…

graphite安装(一键搞定版)

一、python部分&#xff1a; 0、系统&#xff1a; $ cat /etc/redhat-release CentOS Linux release 7.2.1511 (Core) 1、检查系统python是否2.7以上&#xff08;最新graphite需要python至少2.7&#xff09;&#xff1a; $ python -V Python 2.7.5 2、安装pip&#xff1a;…

graphite http api

Render API Graphite web 提供了/render API用来生成图片和获取原始数据。这个API通过查询字符串支持各种参数。参数之间通过&进行分割&#xff0c;如下所示&#xff1a; &namevalue 你可以通过访问 http://GRAPHITE_HOST:GRAPHITE_PORT/render 这个url来确认这个A…

sitespeed+graphite+grafana

最近在看性能UI performance testing 的工具 其中一个是 sitespeed。 sitespeed.io 是 一款可监视和衡量网站前端性能的开源工具。 1. 开 源 2 . 支持事务模 拟 3 . 自动性能分析&#xff0c;形成可视化报 告 4 . 提供的 docker 镜像已搭建完成监控系统&#xff0c;满足…

在Ubuntu18.04使用Docker安装graphite

安装docker apt install docker.io 参照graphite官网&#xff0c;运行docker docker run -d \--name graphite \--restartalways \-p 80:80 \-p 2003-2004:2003-2004 \-p 2023-2024:2023-2024 \-p 8125:8125/udp \-p 8126:8126 \graphiteapp/graphite-statsd 查看docker&am…

graphite

Graphite 是一个用于采集网站实时信息并进行统计的开源项目&#xff0c;可用于采集多种网站服务运行状态信息。Graphite服务平均每分钟有4800次更新操作。实践已经 证实要监测网站发发生什么是非常有用的&#xff0c;它的简单文本协议和绘图功能可以方便地即插即 用的方式用于任…

Graphite详解

Graphite详解 作者&#xff1a;chszs&#xff0c;未经博主允许不得转载。经许可的转载需注明作者和博客主页&#xff1a;http://blog.csdn.net/chszs Graphite是一个开源实时的、显示时间序列度量数据的图形系统。Graphite并不收集度量数据本身&#xff0c;而是像一个数据库&…

时序数据库-Graphite

Graphite就属于一种时序数据库&#xff0c;作用是存储和聚合监控数据并绘制图标&#xff0c;不负责数据的收集。之所以想写一篇关于Graphite的博文主要是因为这是我接触到的另一种新型数据库&#xff0c;其特点和功能让人眼前一亮。但是需要强调的是&#xff0c;这里所谓的时序…

Graphite介绍

Graphite详解 https://www.2cto.com/kf/201603/494435.html Graphite是一个开源实时的、显示时间序列度量数据的图形系统。Graphite并不收集度量数据本身&#xff0c;而是像一个数据库&#xff0c;通过其后端接收度量数据&#xff0c;然后以实时方式查询、转换、组合这些度量数…

http中的XFF(X-Forwarded-For)

详细知识请移步大佬网页

攻防世界-xff_referer

题目 访问题目场景 抓包看看&#xff0c;打开场景&#xff0c;页面提示我们ip必须是123.123.123.123&#xff0c;我们就想到burpsuite抓包&#xff0c;添加上X-Forwarded-For:123.123.123.123 GET / HTTP/1.1 Host: 223.112.5.156:54671 X-Forwarded-For:123.123.123.123 User-…

XCTF2-web xff_referer

xff_referer 题目描述 X老师告诉小宁其实xff和referer是可以伪造的。 进入场景 提示对ip地址进行了限制 根据题目的描述&#xff0c;可以推测是伪造xff和referer。 根据要求构造xff和referer 轻松获得flag xff x-forwarded-for简称XFF&#xff0c;是http协议的一个扩展…

攻防世界-WEB:xff_referer

题目&#xff1a;https://adworld.xctf.org.cn/challenges/problem-set-index?id25&rwNmOdr1679149714756 题目描述&#xff1a;X老师告诉小宁其实xff和referer是可以伪造的。 根据题目描述&#xff0c;那就是考验xff和referer知识。 知识补充&#xff1a; XFF X-Forwarde…

day28 SQL注入HTTP头XFFCOOKIEPOST请求

前言 #知识点&#xff1a; 1、数据请求方式-GET&POST&COOKIE等 2、常见功能点请求方式-用户登录&IP记录等 3、黑盒白盒注入测试要点-SQLMAP注入参数 #补充点&#xff1a; 黑盒测试&#xff1a;功能点分析 1、后台要记录操作访问IP IP要进行代码的获取&#…

NGINX动态XFF黑名单配置

通过XFF地址动态限制访问 方案特点&#xff1a; 无需reloadAPI管理 NGINX PLUS的KEYVAL是可以通过API进行管理的内部可持久化kv存储。 KEYVAL查找XFF地址是否在黑白名单中&#xff0c;来实现访问控制。 KEYVAL存放黑白名单列表&#xff1a; 定义键值为1为白名单定义键值为…

xff-referer伪造ip地址和域名

layout: post title: “xff-referer伪造ip地址和域名” categories: [ctf] tags: [xff referer] 最新版的BurpSuite与以前版本不同&#xff0c;将raw headers hex这些二级导航栏去掉&#xff0c;改在了右侧显示&#xff0c;需要Add伪造ip和域名的时候&#xff0c;在该部分右侧底…