翻译:陆离
校对:杨乾坤(欧文) 本文描述了程序开发人员如何使用 Apache Flink 内置的 M etrics 系统 和 Prometheus结合的方式,有效的观测和监控流式应用程序。本文将介绍 Prometheus 的基本概念,适合于监控 Apache Flink 的流处理作业的原因,并通过实例来说明如何利用 Prometheus 来深入了解应用程序,对 Flink 作业的潜在问题作出告警。 为什么选择 Prometheus? Prometheus 是一个基于指标的监测系统,最初创建于 2012 年,它是完全开源的(Apache License 2),并且背后有着一个活跃的技术社区支持,去年从云原生基金会(Cloud Native Foundation)毕业,这标志着产品的成熟、稳定和生产可用。Prometheus 系统是基于度量指标的,被设计用来衡量服务的整体健康状况、行为和性能。Prometheus 具备多维的数据模型和灵活的查询语言,并且是为可靠性而设计的,可以很容易地部署在传统的或容器化的环境之中。以下是它所涉及到的一些重要概念:- Metrics: Prometheus 将 Metrics 定义为随时间变化的信息流,这些时间序列具有毫秒级的精确度;
- Labels:是与支持 Prometheus 的数据模型的时间序列相关联的键值对,这与传统的度量系统可能遇到的分层数据结构不太相同;
- Scrape: Prometheus 是一个基于“拉取”的系统,它从指定的数据源中主动获取(“scrapes”)度量数据,这些数据源以基于文本的格式在 HTTP 协议的地址上进行暴露;
- PromQL:是 Prometheus 的查询语言,它既可用于创建仪表盘,也可用于设置在满足特定条件时触发的告警规则;
./gradlew composeUp
首先利用工具
Gradle
创建一个 Flink 作业,并基于
Docker Compose
启动一个本地的环境,Docker Compose 启动一个运行在
Flink 作业集群
(可在http://localhost:8081上访问)中的作业和一个 Prometheus 实例(http://localhost:9090)。
![b432156b67ea78910f15e015d1f1a335.png](https://i-blog.csdnimg.cn/blog_migrate/b0f7aa58df113f09ef06a8fd72b36809.png)
class FlinkMetricsExposingMapFunction extends RichMapFunction<Integer, Integer> {
private transient Counter eventCounter;
@Override
public void open(Configuration parameters) {
eventCounter = getRuntimeContext().getMetricGroup().counter("events");
}
@Override
public Integer map(Integer value) {
eventCounter.inc();
return value;
}
}
上述代码从 FlinkMetricsExposingMapFunction.java 文件中摘录的,演示了自定义的 Flink 度量指标
在Flink中配置Prometheus监控
开始用Prometheus监控Flink的时候,必须要执行以下的步骤:
1. 首先让PrometheusReporter的jar文件放在Flink集群的安装路径里(jar包是随Flink一起发布的);
cp/opt/flink/opt/flink-metrics-prometheus-1.7.2.jar /opt/flink/lib
2. 在Flink的flink-conf.yaml文件中
配置报告(reporter)参数
。所有的作业管理器和任务管理器都将公开已配置端口的度量指标;
metrics.reporters: prom
metrics.reporter.prom.class: org.apache.flink.metrics.prometheus.PrometheusReporter
metrics.reporter.prom.port: 9999
3. Prometheus需要知道从哪里获取到度量指标。在一个静态的场景中,只需在prometheus.yml文件中配置Prometheus,请看下面的代码:
scrape_configs:
- job_name: 'flink'
static_configs:
- targets: ['job-cluster:9999', 'taskmanager1:9999','taskmanager2:9999']
在一些动态的场景中,我们建议使用Prometheus提供给不同平台(如Kubernetes、AWS EC2等等)的服务发现支持机制。
Prometheus现在有两个自定义的度量指标,见下图:
![303c7e08a541075fa6fc112071f10d2a.png](https://i-blog.csdnimg.cn/blog_migrate/614e6f243f47cdf6c3835dae1060b641.png)
docker killtaskmanager1
我们的 Flink 作业可以通过
检查点
机制快速地从局部的失败中恢复。不过,大约在一分钟之后(如果告警规则中配置过了),下图中的告警将会被触发:
![a80b21161ac28560fc8284e7b8163952.png](https://i-blog.csdnimg.cn/blog_migrate/a15064891eeb258d93f15417ae8269c7.png)
./gradlewcomposeDown
结论
将 Prometheus 和 Flink 结合使用,可以为有效的监测和预警 Flink 作业提供一种简洁的方法。这两个技术背后都有着非常活跃的社区,并在即将发布的版本里做了完善以及添加了新的功能。我们鼓励大家一起尝试着使用这两项技术,这可以极大地促进大家对在生产中运行的 Flink 作业的了解。
作者:Maximilian Bode
https://flink.apache.org/features/2019/03/11/prometheus-monitoring.html
1、基于 Flink SQL 构建实数据仓库在 OPPO 的实战
2、深入理解Flink核心技术
3、Flink 在饿了么的应用与实战
4、Uber 大数据平台的演进(2014~2019)
![ceceaa3090eac9ef13a1509cd827a10a.gif](https://i-blog.csdnimg.cn/blog_migrate/1bb3839929c9b8c03a0cb42363e85603.gif)