什么是 Metrics ?
Flink 提供的 Metrics 可以在 Flink 内部收集一些指标,通过这些指标让开发人员更好地理解作业或集群的状态。由于集群运行后很难发现内部的实际状况,跑得慢或快,是否异常等,开发人员无法实行查看所有的 Task 日志,比如作业很大或者有很多作业的情况下,该如何处理?此时 Metrics 可以很好的帮助开发人员了解作业的当前状况。
Metric Types
Metrics 的类型如下:
- 首先,常用的如 Counter,写过 mapreduce 作业的开发人员就应该很熟悉 Counter,其实含义都是一样的,就是对一个计数器进行累加,即对于多条数据一直往上加的过程。
- 第二,Gauge,Gauge 是最简单的 Metrics,它反映一个值。比如要看现在 Java heap 内存用了多少,就可以每次实时的暴露一个 Gauge,Gauge 当前的值就是 heap 使用的量。
- 第三,Meter,Meter 是指统计吞吐量和单位时间内发生“事件”的次数。它相当于求一种速率,即事件次数除以使用的时间。
- 第四,Histogram,Histogram 比较复杂,也并不常用,Histogram 用于统计一些数据的分布,比如说 Quantile、Mean、StdDev、Max、Min 等。
Metric Group
Metric 在 Flink 内部有多层结构,以 Group 的方式组织,它并不是一个扁平化的结构,Metric Group + Metric Name 是 Metrics 的唯一标识。
Metric Group 的层级有 TaskManagerMetricGroup 和 TaskManagerJobMetricGroup,每个 Job 具体到某一个 task 的 group,task 又分为 TaskIOMetricGroup 和 OperatorMetricGroup。Operator 下面也有 IO 统计和一些 Metrics,整个层级大概如下图所示。Metrics 不会影响系统,它处在不同的组中,并且 Flink 支持自己去加 Group,可以有自己的层级。
- TaskManagerMetricGroup
- TaskManagerJobMetricGroup
- TaskMetricGroup
- TaskIOMetricGroup
- OperatorMetricGroup
- ${
User-defined Group} / ${
User-defined Metrics}
- OperatorIOMetricGroup
- JobManagerMetricGroup
- JobManagerJobMetricGroup
JobManagerMetricGroup 相对简单,相当于 Master,它的层级也相对较少。
Metrics 定义还是比较简单的,即指标的消息可以自己收集,自己统计,在外部系统能够看到 Metrics 的消息,并能够对其进行聚合计算。
如何使用 Metrics ?
System Metrics
System Metrics,将整个集群的状态已经涵盖得非常详细。具体包括以下方面:
- Master 级别和 Work 级别的 JVM 参数,如 load 和 time;其 Memory 划分也很详细,包括 heap 的使用情况、non-heap 的使用情况,direct 的使用情况,以及 mapped 的使用情况;Threads 可以看到具体有多少线程;还有非常实用的 Garbage Collection。
- Network 使用比较广泛,当需要解决一些性能问题的时候,Network 非常实用。Flink 不只是网络传输,还是一个有向无环图的结构,可以看到它的每个上下游都是一种简单的生产者消费者模型。Flink 通过网络相当于标准的生产者和消费者中间通过有限长度的队列模型。如果想要评估定位性能,中间队列会迅速缩小问题的范围,能够很快的找到问题瓶颈。
- 运维集群的人会比较关心 Cluster 的相关消息,如果作业太大,则需要非常关注 Checkpointing,它有可能会在一些常规的指标上无法体现出潜在问题。比如 Checkpointing 长时间没有工作,数据流看起来没有延迟,此时可能会出现作业一切正常的假象。另外,如果进行了一轮 failover 重启之后,因为