我们都知道 Flink 任务是一个 7*24 小时不停运行的任务,所以对于任务的实时监控就显得尤为重要,因为任务运行的状态对于我们来说是一个黑盒,比如任务是否挂掉,是否存在反压,使用的内存,CPU 等情况我们是不知道的,虽然 Flink 的 UI 上面可以添加相关的 metrics 来查看,但是需要手动的一个一个添加,还是比较麻烦的,特别是在任务非常多的情况下.所以就需要有一种统一的监控方案来解决这个问题.Flink 本身提供了非常丰富的 Metric Reporters,比如 JMX InfluxDB Graphite Prometheus 等等,生产环境上用的比较多的是 InfluxDB 和 Prometheus ,我这里选择的是 Prometheus 来上报 Flink 的 metrics 然后通过 Grafana 进行展示.
Grafana 可以说是为监控而生的,是一个颜值非常高的可视化工具.Grafana 支持比较多的数据源格式,比如 InfluxDB 、OpenTSDB Prometheus 等等,并且使用起来非常简单,那 Prometheus 和 Grafana 的结合会擦出怎样的火花呢?下面就一起来看下.
我们先来看一下 Prometheus 和 Grafana 结合的架构图,如下所示:
可以发现里面还需要一个组件 PushGateway ,这是因为 Prometheus 正常是从 Flink 任务拉取数据的,但是我们的 Metric Reporter 是像外部系统推送数据的,所以这两者是存在冲突的,所以就需要有一个中间组件,首先通过 Metric Reporter 把数据推送到 PushGateway ,Prometheus 再从PushGateway 拉取数据,最后展示在 Grafana 上.
下载
下载我这里就省略了,自己到官网下载就行,因为我的机器上之前已经安装过这些组件了,为了演示,所以这次直接下载的最新版本. prometheus-2.28.1 pushgateway-1.4.1 grafana-8.0.6.
安装配置
Prometheus 配置
tar -zxvf prometheus-2.28.1.linux-amd64.tar.gz mv prometheus-2.28.1.linux-amd64 prometheus-2.28.1 cd prometheus-2.28.1 vi prometheus.yml
主要添加 PushGateway 和 PushGateway 的监控配置,这里还修改了 prometheus 抓取数据的间隔,可以不用改.
# my global config global: scrape_interval: 15s # Set the scrape interval to every 15 seconds. Default is every 1 minute. evaluation_interval: 15s # Evaluate rules every 15 seconds. The default is every 1 minute. # scrape_timeout is set to the global default (10s). # Alertmanager configuration alerting: alertmanagers: - static_configs: - targets: # - alertmanager:9093 # Load rules once and periodically evaluate them according to the global 'evaluation_interval'. rule_files: # - "first_rules.yml" # - "second_rules.yml" # A scrape configuration containing exactly one endpoint to scrape: # Here it's Prometheus itself. scrape_configs: - job_name: 'prometheus' static_configs: - targets: ['storm1:9090'] labels: instance: 'prometheus' - job_name: 'pushgateway' static_configs: - targets: ['storm1:9091'] labels: instance: 'pushgateway'
启动
nohup ./prometheus --config.file=prometheus.yml --storage.tsdb.retention=1d & nohup ./pushgateway &
然后访问一下 prometheus 的 http://storm1:9090/targets 页面,如下图所示如果 state 显示为 up 就说明配置成功了.
image-20210808163920891
pushgateway 不需要任何配置,直接启动即可,访问 http://storm1:9091/# 可以看到已经收到了 Flink Metric Reporter 推送过来的数据.
image-20210808174025532
Grafana 安装配置
tar -zxvf grafana-8.0.6.linux-amd64.tar.gz cd grafana-8.0.6 nohup ./grafana-server start &
Grafana 可以不做任何配置直接拉起来就行,然后直接访问 http://storm1:3000/ 页面如下所示:
image-20210808164707918
然后直接添加 prometheus 数据源,配置也非常简单,如下图所示:
image-20210808164838805
只需要添加 prometheus 的地址即可,其他的选项默认就行,然后点击 save & test 按钮,出现 Data source is working 说明数据源添加成功了.然后就可以开始创建 DashBoard 了.
flink-conf.yaml 配置
metrics.reporter.promgateway.class: org.apache.flink.metrics.prometheus.PrometheusPushGatewayReporter metrics.reporter.promgateway.host: storm1 metrics.reporter.promgateway.port: 9091 metrics.reporter.promgateway.jobName: flink metrics.reporter.promgateway.randomJobNameSuffix: true metrics.reporter.promgateway.deleteOnShutdown: true
提交 Flink 任务
flink run -d -yqu flink -m yarn-cluster \ -nm test10 \ -p 4 \ -yD metrics.reporter.promgateway.groupingKey="jobname=test10" \ -yD metrics.reporter.promgateway.jobName=test10 \ -c flink.streaming.FlinkStreamingFlatMapDemoNew \ /home/jason/bigdata/jar/flink-1.13.0-1.0-SNAPSHOT.jar
添加 DashBoard
image-20210808173546499
这个是新版本的页面和之前版本的布局还是有很大的不同,不过配置上和之前的大同小异,先选择数据源为 Prometheus 然后输入想要展示的 metrics 会自动提示出完成的 metrics 名称选择确认后页面上方会显示出监控数据,如上图所示.
在这个 DashBoard 的设置里面添加两个变量,一个是数据源,一个是任务的名称,然后就可以根据 Flink 的任务名来切换到不同的任务.
image-20210808175338177
DashBoard 的配置虽然简单,但是需要配置的指标非常多,还是非常累人的,我就不再一一展示了,配置的方式都是一样的.我这里主要分为下面几大类,大家可以根据自己的需要去配置.
image-20210808175756903
完整的展示如下:
image-20210808175854480