0880-7.1.7-如何在CDP中使用Prometheus&Grafana对Flink任务进行监控和告警

2022-05-09 15:11:42 浏览数 (1)

本文作者: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 内部收集一些指标,通过这些指标让开发人员更好地理解作业或集群的状态。

官网地址:

代码语言:javascript复制
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

代码语言:javascript复制
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

代码语言:javascript复制
scrape_configs:  ...  # 添加PushGateway 监控配置  -job_name: 'pushgateway'   static_configs:    -targets: ['pushgateway_host:9091']     labels:       instance: pushgateway  ...

进入pushgateway解压后的安装包,启动进程

代码语言:javascript复制
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包。

代码语言:javascript复制
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相关配置

代码语言:javascript复制
##### 与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如下:

代码语言:javascript复制
https://nightlies.apache.org/flink/flink-docs-release-1.13/docs/deployment/metric_reporters/#prometheuspushgateway

3.4验证与测试

我们随便提交一个测试任务

代码语言:javascript复制
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那肯定是不科学的,我们肯定是更愿意使用模版。官方也比较建议大家基于模版进行更多的创造。

官方模版仓库:

代码语言:javascript复制
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地址

代码语言:javascript复制
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版本迭代经常有变动,这块需要特别注意

0 人点赞