本文作者:BYD信息中心-数据中心管理部-董睿
这里打一个小广告,手动狗头
比亚迪西安研发中心(与深圳协同办公),base西安。招聘大数据平台运维方向工程师,实时计算方向工程师,感兴趣的小伙伴请投递简历至dong.rui@byd.com
1.文档编写目的
Prometheus 是一款基于时序数据库的开源监控告警系统,Prometheus的基本原理是通过HTTP协议周期性抓取被监控组件的状态,任意组件只要提供对应的HTTP接口就可以接入监控。Grafana是一款采用 Go语言编写的开源应用,是一个跨平台的开源的度量分析和可视化工具,可以通过将采集的数据查询然后可视化的展示,并及时通知。本文主要介绍通过Prometheus和Grafana对CDP中的Flink进行监控和告警。
- 测试环境
1.操作系统CentOS7.9
2.操作系统: CentOS Linux release 7.9.2009 (Core)
3.JDK: jdk1.8.0_232-cloudera
4.CM: 7.4.4
5.CDH: 7.1.7
6.Flink: 1.13.2-CSA1.5.3.0
7.Prometheus: 2.32.1
8.Grafana: 8.3.3
9.pushgateway: 1.4.2
10.node_exporter: 1.3.1
11.集群已开启kerberos认证
2.MetricReportersia Tesla T4
2.1Metrics介绍
由于实时任务运行后很难发现内部的实际状况,跑得慢或快,是否异常等,开发人员无法实时查看所有的 Task 日志,比如作业很大或者有很多作业的情况下,该如何处理?此时 Metrics 可以很好的帮助开发人员了解作业的当前状况。Flink 提供的 Metrics 可以在Flink 内部收集一些指标,通过这些指标让开发人员更好地理解作业或集群的状态。
官网地址:
https://nightlies.apache.org/flink/flink-docs-release-1.13/docs/deployment/metric_reporters/
2.2 Metric Types
Metrics 的类型如下:
1.常用的如 Counter,写过 mapreduce 作业的开发人员就应该很熟悉 Counter,其实含义都是一样的,就是对一个计数器进行累加,即对于多条数据和多兆数据一直往上加的过程。
2.Gauge,Gauge 是最简单的 Metrics,它反映一个值。比如要看现在 Java heap 内存用了多少,就可以每次实时的暴露一个 Gauge,Gauge 当前的值就是heap使用的量。
3.Meter,Meter 是指统计吞吐量和单位时间内发生“事件”的次数。它相当于求一种速率,即事件次数除以使用的时间。
4.Histogram,Histogram 比较复杂,也并不常用,Histogram 用于统计一些数据的分布,比如说 Quantile、Mean、StdDev、Max、Min 等。Metric 在 Flink 内部有多层结构,以 Group 的方式组织,它并不是一个扁平化的结构,MetricGroup Metric Name 是 Metrics 的唯一标识。
2.3Flink支持的Reporter
JMX(org.apache.flink.metrics.jmx.JMXReporter)Graphite(org.apache.flink.metrics.graphite.GraphiteReporter)InfluxDB(org.apache.flink.metrics.influxdb.InfluxdbReporter)Prometheus(org.apache.flink.metrics.prometheus.PrometheusReporter)StatsD(org.apache.flink.metrics.statsd.StatsDReporter)Datadog(org.apache.flink.metrics.datadog.DatadogHttpReporter)Slf4j(org.apache.flink.metrics.slf4j.Slf4jReporter)
2.4PrometheusPushGateway
Pushgateway作为独立的服务,位于被采集监控指标的应用程序和Prometheus之间,应用程序主动推送指标到Pushgateway,然后Pushgateway作为target被prometheus抓取这些指标。
3.PushGateway与CDP Flink进行集成
进入此次任务的正题,本次我们通过目前各类优秀开源工具组合使用,作为CDP集群实时任务运维监控,探索测试的一种方向。Prometheus和Grafana安装使用,这里就不再过多赘述。
Prometheus在正常情况下是采用拉模式从产生metric的作业或者exporter(比如专门监控主机的NodeExporter)拉取监控数据。但是我们要监控的是Flink on YARN作业,想要让Prometheus自动发现作业的提交、结束以及自动拉取数据显然是比较困难的。PushGateway就是一个中转组件,通过配置Flink on YARN作业将metric推到PushGateway,Prometheus再从PushGateway拉取就可以了。
3.1PushGateway启动
在启动pushgateway前,需要修改prometheus配置文件 prometheus.yml并重启服务,使其监控pushgateway
scrape_configs: ... # 添加PushGateway 监控配置 -job_name: 'pushgateway' static_configs: -targets: ['pushgateway_host:9091'] labels: instance: pushgateway ...
进入pushgateway解压后的安装包,启动进程
nohup ./pushgateway --web.listen-address :9091> ./pushgateway.log 2>&1 &
启动后在prometheus界面出现pushgateway监控项,并且为up状态
3.2flink-metrics-prometheus jar包
从Apache Flink的源码结构我们可以看到,Flink官方支持Prometheus,并且提供了对接Prometheus的jar包,很方便就可以集成。
开源包中plugins目录是包含此jar包的。CSA plugins目录默认是没有的,我们从Cloudera仓库下载或者通过IDE下载都可以。另外CSA从1.3之后Scala版本都是2.12,注意下载2.12版的jar包。
https://repository.cloudera.com/artifactory/cloudera-repos/org/apache/flink/
把下载之后的jar包,上传同步至所有节点。
如果使用flink run模式提交任务则需要上传至所有节点本地目录/opt/cloudera/parcels/FLINK/lib/flink lib或plugins目录下
如果使用flink run-application模式,则把jar上传至-Dyarn.provided.lib.dirs指定的HDFS目录即可。
3.3Flink配置修改
打开CM,进入Flink服务,搜索flink-conf.yaml配置项
增加flink与pushgateway相关配置
##### 与Prometheus集成配置 #####metrics.reporter.promgateway.class:org.apache.flink.metrics.prometheus.PrometheusPushGatewayReporter# PushGateway的主机名与端口号metrics.reporter.promgateway.host:pushgateway_hostmetrics.reporter.promgateway.port: 9091# Flink metric在前端展示的标签(前缀)与随机后缀metrics.reporter.promgateway.jobName:flink-metrics-ppgmetrics.reporter.promgateway.randomJobNameSuffix:truemetrics.reporter.promgateway.deleteOnShutdown:falsemetrics.reporter.promgateway.interval: 30SECONDS
官网demo如下:
https://nightlies.apache.org/flink/flink-docs-release-1.13/docs/deployment/metric_reporters/#prometheuspushgateway
3.4验证与测试
我们随便提交一个测试任务
flink run -m yarn-cluster -ys 2 -p 10 -ynm testapp -yjm 2048 -ytm 2048 -yD security.kerberos.login.keytab=/xxx.keytab -yDsecurity.kerberos.login.principal=xxx@BYD.COM -c com.byd.flink.app.FileSinkBulkApp -d ./flink-hdfs-bulk-apache.jar --fileNum 3--ckTime 1800 --pathFormat yyyy-MM-dd--HH
打开prometheus搜索flink相关指标
到此,Flink任务与prometheus集成完毕。
4.Grafana模版和一些简单指标设计
4.1Grafana Flink模版
让我们手动一个个添加Dashboard那肯定是不科学的,我们肯定是更愿意使用模版。官方也比较建议大家基于模版进行更多的创造。
官方模版仓库:
https://grafana.com/dashboards
搜索flink,会出现非常多的模版,笔者使用的是下图中模版。这里有一个问题就是,这些模版开发时间都比较早,随着flink版本的迭代,有一些指标名称进行过更改,对于没有图表显示的需要自行查找指标,并进行修改。
把模版导入Grafana后大概就是这个样子,笔者进行过二次设计,后边介绍。
4.2Flink任务存活/失败监控
这个指标监控主要是基于flink_jobmanager_job_uptime 这个指标进行了监控。原理是在job任务存活时,会按照配置metrics.reporter.promgateway.interval上报频率递增。基于这个特点,当任务失败后这个数值就不会改变,就能监控到任务失败。
添加一个新的监控项
编辑该图表
1m为数据上报到 promgateway 频率,可以除以100为了数据好看,当job任务失败后数 flink上报的promgateway 的 flink_jobmanager_job_uptime指标值不会变化。((flink_jobmanager_job_uptime)-(flink_jobmanager_job_uptime offset 1m))/100 值就会是0,可以配置告警。
配置告警
这里主要是条件的配置,在什么情况下进行告警。
还有更多的一些指标如任务重启、网络延迟、任务反压等重要指标,这里不再过多写了。
在告警通知中可以邮件和webhook,webhook可以调用相关接口,执行一些动作。webhook需要提前配置,在这里配置告警时就可以直接引入。
5.Grafana告警配置
5.1安装alertmanager
5.2 钉钉机器人告警
可以使用dingtalk,dingtalk是一个用来发送钉钉告警通知的prometheus插件
github地址
https://github.com/timonwong/prometheus-webhook-dingtalk
5.3企业微信群机器人
企业微信群机器人与钉钉机器人类似,都是webhook类,我们可以自定义python脚本,用来接收alertmanager的告警信息,然后发送至机器人。
5.4一些收费的第三方监控运维平台,如睿象云可以直接接入Grafana实现电话、短信告警
关于Prometheus Grafana告警这块内容,各路大神都研究测试的非常透彻,合理利用搜索引擎即可。
6.存在的一些问题
任务在高负载、反压的时候,pushgateway经常会有read time out现象
不能直接监控到被采集监控指标应用程序的健康状态,且一些指标非常的奇葩
存在单点故障问题,如果Pushgateway从许多不同的来源收集指标时宕机,用户将失去对这些来源的监控
Pushgateway不会自动删除推送给它的任何指标数据,因此,必须使用Pushgateway的API从推送网关中删除过期的指标
生产环境Grafana模版图表需要深度优化定制,用来测试没有问题
告警信息的优化和降噪等
社区对于metric指标之类的内容不够重视,相关内容非常少,基本都需要自己研究测试和大牛的分享,而且Flink版本迭代经常有变动,这块需要特别注意