一、Flink 专栏
Flink 专栏系统介绍某一知识点,并辅以具体的示例进行说明。
1、Flink 部署系列
本部分介绍Flink的部署、配置相关基础内容。
2、Flink基础系列
本部分介绍Flink 的基础部分,比如术语、架构、编程模型、编程指南、基本的datastream api用法、四大基石等内容。
3、Flik Table API和SQL基础系列
本部分介绍Flink Table Api和SQL的基本用法,比如Table API和SQL创建库、表用法、查询、窗口函数、catalog等等内容。
4、Flik Table API和SQL提高与应用系列
本部分是table api 和sql的应用部分,和实际的生产应用联系更为密切,以及有一定开发难度的内容。
5、Flink 监控系列
本部分和实际的运维、监控工作相关。
二、Flink 示例专栏
Flink 示例专栏是 Flink 专栏的辅助说明,一般不会介绍知识点的信息,更多的是提供一个一个可以具体使用的示例。本专栏不再分目录,通过链接即可看出介绍的内容。
两专栏的所有文章入口点击:Flink 系列文章汇总索引
本文介绍了Flink的指标报告的类型以及几种发送器的示例配置,特别是针对jmx和slf4j给出了具体的实现示例及验证结果。由于本文是介绍flink的指标数据可以给哪些系统发送数据,至于具体实现算是各自的应用,故没有深入的展示。
本文依赖flink集群能正常使用。
本文分为5个部分,即Metric Reporters概述、入门示例、格式、推拉和8种发送器,其中两种给出了具体的示例。
本文的示例是在Flink 1.17版本中运行。
Flink 支持用户将 Flink 的各项运行时指标发送给外部系统。 了解更多指标方面信息可查看 45、Flink 的指标体系介绍及验证(3)- 完整版。
你可以通过 conf/flink-conf.yaml 文件来配置一种或多种发送器,将运行时指标暴露给外部系统。 发送器会在 TaskManager、Flink 作业启动时进行实例化。
下面列出了所有发送器都适用的参数,可以通过配置文件中的 metrics.reporter.
每种发送器的配置需要有 factory.class 属性。 有些基于定时调度的发送器还可以通过 interval 来配置发送间隔。
Flink 在启动时必须能访问到发送器所属的 jar 包,发送器会被加载为 plugins,Flink 自带的发送器(文档中已经列出的发送器)无需做其他配置,开箱即用。
[root@1049 plugins]# ll
drwxr-xr-x 2 501 games 114 5月 19 2023 external-resource-gpu
drwxr-xr-x 2 501 games 46 5月 19 2023 metrics-datadog
drwxr-xr-x 2 501 games 47 5月 19 2023 metrics-graphite
drwxr-xr-x 2 501 games 47 5月 19 2023 metrics-influx
drwxr-xr-x 2 501 games 42 5月 19 2023 metrics-jmx
drwxr-xr-x 2 501 games 49 5月 19 2023 metrics-prometheus
drwxr-xr-x 2 501 games 44 5月 19 2023 metrics-slf4j
drwxr-xr-x 2 501 games 45 5月 19 2023 metrics-statsd
你可以实现 org.apache.flink.metrics.reporter.MetricReporter 接口来自定义发送器,并实现 Scheduled 接口让发送器周期性地将运行时指标发送出去。 需要注意 report() 方法不应该阻塞太长的时间,所有用时很长的操作应该异步执行。 另外也可以实现 MetricReporterFactory 接口,让发送器作为插件被 Flink 导入。
想要同时配置多个发送器,可参考以下示例。
env.java.opts: "-Dcom.sun.management.jmxremote -Dcom.sun.management.jmxremote.authenticate=false -Dcom.sun.management.jmxremote.ssl=false -Dcom.sun.management.jmxremote.local.only=false -Dcom.sun.management.jmxremote.port=1099 -Dcom.sun.management.jmxremote.rmi.port=1099 -Djava.rmi.server.hostname=192.168.10.49"
本示例配置将指标写入jmx和日志中(将指标每分钟写入一次日志文件中)
metrics.reporters: alan_jmx_reporter,alan_slf4j_reporter
metrics.reporter.alan_jmx_reporter.factory.class: org.apache.flink.metrics.jmx.JMXReporterFactory
metrics.reporter.alan_jmx_reporter.port: 9020-9040
metrics.reporter.alan_jmx_reporter.scope.variables.excludes: job_id;task_attempt_num
metrics.reporter.alan_jmx_reporter.scope.variables.additional: cluster_name:alan_test_cluster,tag_name:alan_tag_value
metrics.reporter.alan_slf4j_reporter.factory.class: org.apache.flink.metrics.slf4j.Slf4jReporterFactory
metrics.reporter.alan_slf4j_reporter.interval: 60 SECONDS
2023-11-28 14:22:40,280 INFO org.apache.flink.metrics.slf4j.Slf4jReporter [] -
=========================== Starting metrics report ===========================
-- Gauges ---------------------------------------------------------------------
192_168_10_49.jobmanager.Status.JVM.ClassLoader.ClassesLoaded: 9047
192_168_10_49.jobmanager.Status.JVM.Memory.Mapped.MemoryUsed: 0
192_168_10_49.jobmanager.Status.JVM.Memory.NonHeap.Committed: 82313216
192_168_10_49.jobmanager.numRunningJobs: 0
192_168_10_49.jobmanager.Status.JVM.Memory.Metaspace.Used: 58573704
192_168_10_49.jobmanager.Status.JVM.Memory.Mapped.Count: 0
192_168_10_49.jobmanager.Status.JVM.ClassLoader.ClassesUnloaded: 0
192_168_10_49.jobmanager.Status.JVM.Memory.Heap.Used: 69453280
192_168_10_49.jobmanager.Status.JVM.CPU.Load: 2.887393783748263E-7
192_168_10_49.jobmanager.Status.JVM.GarbageCollector.G1 Young Generation.Count: 3
192_168_10_49.jobmanager.Status.JVM.Memory.Metaspace.Committed: 60817408
192_168_10_49.jobmanager.Status.JVM.GarbageCollector.G1 Young Generation.Time: 27
192_168_10_49.jobmanager.numRegisteredTaskManagers: 0
192_168_10_49.jobmanager.Status.JVM.GarbageCollector.G1 Old Generation.Count: 0
192_168_10_49.jobmanager.Status.JVM.GarbageCollector.G1 Old Generation.Time: 0
192_168_10_49.jobmanager.Status.JVM.Memory.Direct.Count: 10
192_168_10_49.jobmanager.Status.JVM.Memory.Metaspace.Max: 268435456
192_168_10_49.jobmanager.taskSlotsTotal: 0
192_168_10_49.jobmanager.Status.JVM.Memory.NonHeap.Used: 76532504
192_168_10_49.jobmanager.Status.JVM.Memory.Heap.Committed: 1530920960
192_168_10_49.jobmanager.Status.JVM.Memory.NonHeap.Max: 780140544
192_168_10_49.jobmanager.Status.JVM.Memory.Direct.MemoryUsed: 532481
192_168_10_49.jobmanager.taskSlotsAvailable: 0
192_168_10_49.jobmanager.Status.JVM.Memory.Heap.Max: 1530920960
192_168_10_49.jobmanager.Status.JVM.Memory.Direct.TotalCapacity: 532480
192_168_10_49.jobmanager.Status.JVM.Memory.Mapped.TotalCapacity: 0
192_168_10_49.jobmanager.Status.JVM.Threads.Count: 69
192_168_10_49.jobmanager.Status.JVM.CPU.Time: 9960000000
=========================== Finished metrics report ===========================
2023-11-28 14:23:40,281 INFO org.apache.flink.metrics.slf4j.Slf4jReporter [] -
=========================== Starting metrics report ===========================
-- Gauges ---------------------------------------------------------------------
192_168_10_49.jobmanager.Status.JVM.ClassLoader.ClassesLoaded: 9121
192_168_10_49.jobmanager.Status.JVM.Memory.Mapped.MemoryUsed: 0
192_168_10_49.jobmanager.Status.JVM.Memory.NonHeap.Committed: 83361792
192_168_10_49.jobmanager.numRunningJobs: 0
192_168_10_49.jobmanager.Status.JVM.Memory.Metaspace.Used: 59044888
192_168_10_49.jobmanager.Status.JVM.Memory.Mapped.Count: 0
192_168_10_49.jobmanager.Status.JVM.ClassLoader.ClassesUnloaded: 0
192_168_10_49.jobmanager.Status.JVM.Memory.Heap.Used: 73647584
192_168_10_49.jobmanager.Status.JVM.CPU.Load: 0.005763448045439359
192_168_10_49.jobmanager.Status.JVM.GarbageCollector.G1 Young Generation.Count: 3
192_168_10_49.jobmanager.Status.JVM.Memory.Metaspace.Committed: 61472768
192_168_10_49.jobmanager.Status.JVM.GarbageCollector.G1 Young Generation.Time: 27
192_168_10_49.jobmanager.numRegisteredTaskManagers: 0
192_168_10_49.jobmanager.Status.JVM.GarbageCollector.G1 Old Generation.Count: 0
192_168_10_49.jobmanager.Status.JVM.GarbageCollector.G1 Old Generation.Time: 0
192_168_10_49.jobmanager.Status.JVM.Memory.Direct.Count: 10
192_168_10_49.jobmanager.Status.JVM.Memory.Metaspace.Max: 268435456
192_168_10_49.jobmanager.taskSlotsTotal: 0
192_168_10_49.jobmanager.Status.JVM.Memory.NonHeap.Used: 78078760
192_168_10_49.jobmanager.Status.JVM.Memory.Heap.Committed: 1530920960
192_168_10_49.jobmanager.Status.JVM.Memory.NonHeap.Max: 780140544
192_168_10_49.jobmanager.Status.JVM.Memory.Direct.MemoryUsed: 532481
192_168_10_49.jobmanager.taskSlotsAvailable: 0
192_168_10_49.jobmanager.Status.JVM.Memory.Heap.Max: 1530920960
192_168_10_49.jobmanager.Status.JVM.Memory.Direct.TotalCapacity: 532480
192_168_10_49.jobmanager.Status.JVM.Memory.Mapped.TotalCapacity: 0
192_168_10_49.jobmanager.Status.JVM.Threads.Count: 63
192_168_10_49.jobmanager.Status.JVM.CPU.Time: 11330000000
=========================== Finished metrics report ===========================
。。。。。。。。。。。。。。
2023-11-28 13:42:26,246 INFO org.apache.flink.metrics.slf4j.Slf4jReporter [] -
=========================== Starting metrics report ===========================
-- Gauges ---------------------------------------------------------------------
localhost.taskmanager.localhost:46098-60172b.Status.JVM.Memory.Metaspace.Committed: 54468608
localhost.taskmanager.localhost:46098-60172b.Status.Shuffle.Netty.TotalMemory: 359694336
localhost.taskmanager.localhost:46098-60172b.Status.JVM.CPU.Time: 9470000000
localhost.taskmanager.localhost:46098-60172b.Status.JVM.ClassLoader.ClassesLoaded: 7916
localhost.taskmanager.localhost:46098-60172b.Status.JVM.Threads.Count: 51
localhost.taskmanager.localhost:46098-60172b.Status.Network.AvailableMemorySegments: 10977
localhost.taskmanager.localhost:46098-60172b.Status.JVM.GarbageCollector.G1 Old Generation.Count: 0
localhost.taskmanager.localhost:46098-60172b.Status.JVM.Memory.Mapped.Count: 0
localhost.taskmanager.localhost:46098-60172b.Status.JVM.Memory.Mapped.MemoryUsed: 0
localhost.taskmanager.localhost:46098-60172b.Status.JVM.Memory.NonHeap.Committed: 73748480
localhost.taskmanager.localhost:46098-60172b.Status.JVM.GarbageCollector.G1 Young Generation.Count: 3
localhost.taskmanager.localhost:46098-60172b.Status.JVM.CPU.Load: 2.748870782605016E-7
localhost.taskmanager.localhost:46098-60172b.Status.JVM.Memory.Metaspace.Max: 268435456
localhost.taskmanager.localhost:46098-60172b.Status.JVM.GarbageCollector.G1 Young Generation.Time: 63
localhost.taskmanager.localhost:46098-60172b.Status.JVM.Memory.Mapped.TotalCapacity: 0
localhost.taskmanager.localhost:46098-60172b.Status.Flink.Memory.Managed.Total: 1438814063
localhost.taskmanager.localhost:46098-60172b.Status.Network.TotalMemorySegments: 10977
localhost.taskmanager.localhost:46098-60172b.Status.JVM.Memory.Heap.Committed: 1665138688
localhost.taskmanager.localhost:46098-60172b.Status.JVM.Memory.Direct.TotalCapacity: 360426496
localhost.taskmanager.localhost:46098-60172b.Status.Shuffle.Netty.AvailableMemory: 359694336
localhost.taskmanager.localhost:46098-60172b.Status.JVM.Memory.Direct.MemoryUsed: 360426497
localhost.taskmanager.localhost:46098-60172b.Status.JVM.Memory.Heap.Used: 38173672
localhost.taskmanager.localhost:46098-60172b.Status.JVM.Memory.Metaspace.Used: 52683336
localhost.taskmanager.localhost:46098-60172b.Status.JVM.GarbageCollector.G1 Old Generation.Time: 0
localhost.taskmanager.localhost:46098-60172b.Status.Flink.Memory.Managed.Used: 0
localhost.taskmanager.localhost:46098-60172b.Status.Shuffle.Netty.RequestedMemoryUsage: 0
localhost.taskmanager.localhost:46098-60172b.Status.JVM.Memory.NonHeap.Used: 69118632
localhost.taskmanager.localhost:46098-60172b.Status.Shuffle.Netty.TotalMemorySegments: 10977
localhost.taskmanager.localhost:46098-60172b.Status.Shuffle.Netty.UsedMemorySegments: 0
localhost.taskmanager.localhost:46098-60172b.Status.JVM.Memory.Heap.Max: 1665138688
localhost.taskmanager.localhost:46098-60172b.Status.Shuffle.Netty.AvailableMemorySegments: 10977
localhost.taskmanager.localhost:46098-60172b.Status.Shuffle.Netty.UsedMemory: 0
localhost.taskmanager.localhost:46098-60172b.Status.JVM.ClassLoader.ClassesUnloaded: 0
localhost.taskmanager.localhost:46098-60172b.Status.JVM.Memory.Direct.Count: 10993
localhost.taskmanager.localhost:46098-60172b.Status.JVM.Memory.NonHeap.Max: 780140544
=========================== Finished metrics report ===========================
1、自定义指标参考文章:45、Flink 的指标体系介绍及验证(1)-指标类型及指标实现示例
2、将实现的自定义指标打包,并放在flink的lib目录下,确保Flink 在启动时必须能访问到发送器所属的 jar 包,发送器会被加载为 plugins
3、配置flink-conf.yaml文件
metrics.reporters: alan-reporter
metrics.reporter.alan-reporter.class: com.alan.AlanReporter
metrics.reporter.alan-reporter.class.host: 192.168.10.49
metrics.reporter.alan-reporter.port: 8789
一般而言,不需要自己开发,除非有特殊需求一般的开源不能满足。
发送器发送运行指标时有以下两种格式:
第一种是基于标志符的格式,这种格式将指标所属的详细范围信息与该指标名称连在一起,组成一个长字符串标志符。 比如 job.MyJobName.numRestarts 就是这样的格式。
第二种是基于 tags 的格式,这种格式由指标的逻辑范围和该指标名称组成,代表某一类通用的指标,比如 job.numRestarts。 这类格式描述的特定指标实例会以“键值对”的方式体现出来,即所谓的标签或变量,比如 “jobName=MyJobName”。
发送器通过 Pull 或 Push 的方式将指标发送出去。
基于 Push 的发送器一般实现了 Scheduled 接口,周期性地将当前运行指标信息汇总,发送给外部系统存储。
基于 Pull 的发送器一般是由外部系统主动发起查询将指标信息拉走。
接下来的部分列出了 Flink 支持的发送器。
参考本文的入门示例,不再赘述。
metrics.reporter.alan_jmx_reporter.factory.class: org.apache.flink.metrics.jmx.JMXReporterFactory
类型: pull/基于 tags 格式
参数:
port -(可选的)JMX 监听的端口。 如果需要在一台机器上运行多个发送器示例进行监控时(比如 TaskManger 与 JobManager 在一台机器上运行时),建议将端口号配置为 9250-9260 这样的区间, 实际使用的端口会在相关作业 或 TaskManger 的日志中显示。如果设置了这个选项,Flink 会按照配置的端口号或端口区间开启 JMX 发送器, 这些运行时指标可以通过本地的 JMX 默认接口访问到。
metrics.reporter.jmx.factory.class: org.apache.flink.metrics.jmx.JMXReporterFactory
metrics.reporter.jmx.port: 8789
# 或,下面例子重命名/并增加了其他属性配置
metrics.reporters: alan_jmx_reporter,alan_slf4j_reporter
metrics.reporter.alan_jmx_reporter.factory.class: org.apache.flink.metrics.jmx.JMXReporterFactory
metrics.reporter.alan_jmx_reporter.port: 9020-9040
metrics.reporter.alan_jmx_reporter.scope.variables.excludes: job_id;task_attempt_num
metrics.reporter.alan_jmx_reporter.scope.variables.additional: cluster_name:alan_test_cluster,tag_name:alan_tag_value
通过 JMX 发送的指标由“域”和“key-properties”列表组成,“域”总以 org.apache.flink 开头,后跟一个“通用指标标识符”。
“通用指标标识符”不像一般系统的指标度量那样按照所度量范围的形式进行命名,而是不包含任何变量,如同常量一样,每个作业都有。 例如,org.apache.flink.job.task.numBytesOut 就是一个“域”。
“key-property”列表包含所有指标的具体变量值,无论配置的度量范围格式如何,都能关联到指定的指标。
例如host=localhost,job_name=MyJob,task_name=MyTask 就是一个“key-property”列表。
总结来说,“域”标注出了某个指标的类,“key-property”列表标注出了该指标的一个(或者多个)实例。
关于Graphite 请参考官方文档,不再赘述。
metrics.reporter.grph.factory.class: org.apache.flink.metrics.graphite.GraphiteReporterFactory
类型:push/基于标志符格式
参数:
host - Graphite 服务的地址。
port - Graphite 服务的端口。
protocol - 使用的协议(TCP/UDP)。
配置示例:
metrics.reporter.grph.factory.class: org.apache.flink.metrics.graphite.GraphiteReporterFactory
metrics.reporter.grph.host: localhost
metrics.reporter.grph.port: 2003
metrics.reporter.grph.protocol: TCP
metrics.reporter.grph.interval: 60 SECONDS
关于 InfluxDB 请参考其官网介绍。
metrics.reporter.influxdb.factory.class: org.apache.flink.metrics.influxdb.InfluxdbReporterFactory
metrics.reporter.influxdb.factory.class: org.apache.flink.metrics.influxdb.InfluxdbReporterFactory
metrics.reporter.influxdb.scheme: http
metrics.reporter.influxdb.host: localhost
metrics.reporter.influxdb.port: 8086
metrics.reporter.influxdb.db: flink
metrics.reporter.influxdb.username: flink-metrics
metrics.reporter.influxdb.password: qwerty
metrics.reporter.influxdb.retentionPolicy: one_hour
metrics.reporter.influxdb.consistency: ANY
metrics.reporter.influxdb.connectTimeout: 60000
metrics.reporter.influxdb.writeTimeout: 60000
metrics.reporter.influxdb.interval: 60 SECONDS
InfluxDB 发送器会使用 http 协议按照将指标发送到 InfluxDB 服务器。指标的保留策略可通过配置指定,或按照 InfluxDB 服务端的保留策略决定。 所有的 Flink 运行指标变量(见 List of all Variables)都会按照 tag 形式上报给 InfluxDB。
关于Prometheus请参考官网信息。
metrics.reporter.prom.factory.class: org.apache.flink.metrics.prometheus.PrometheusReporterFactory
类型: pull/基于 tags 格式
参数:
1、port - (可选的)Prometheus 发送器监听的端口,默认为 9249。如果需要在一台机器上运行多个发送器示例进行监控时(比如 TaskManger 与 JobManager 在一台机器上运行时),建议将端口号配置为 9250-9260 这样的区间。
2、filterLabelValueCharacters -(可选的)指定是否过滤 label 中的非法字符。如果设置过滤,所有没有按照 [a-zA-Z0-9:_] 匹配的字符都会被过滤掉,如果设置不过滤,则不会有字符被过滤掉。设置不过滤前,请确保你的 label 符合 Prometheus 的 lable 命名规范。
配置示例:
metrics.reporter.prom.factory.class: org.apache.flink.metrics.prometheus.PrometheusReporterFactory
Flink 指标类型与 Prometheus 指标类型对应关系如下:
所有的 Flink 运行指标变量(见 List of all Variables)都会按照 label 形式上报给 Prometheus。
关于PrometheusPushGateway请参考官网信息。
metrics.reporter.promgateway.factory.class: org.apache.flink.metrics.prometheus.PrometheusPushGatewayReporterFactory
metrics.reporter.promgateway.factory.class: org.apache.flink.metrics.prometheus.PrometheusPushGatewayReporterFactory
metrics.reporter.promgateway.hostUrl: http://localhost:9091
metrics.reporter.promgateway.jobName: myJob
metrics.reporter.promgateway.randomJobNameSuffix: true
metrics.reporter.promgateway.deleteOnShutdown: false
metrics.reporter.promgateway.groupingKey: k1=v1;k2=v2
metrics.reporter.promgateway.interval: 60 SECONDS
PrometheusPushGatewayReporter 发送器将运行指标发送给 Pushgateway,Prometheus 再从 Pushgateway 拉取、解析运行指标。
更多使用方法可查看 Prometheus 的文档
关于StatsD请参考官网信息。
metrics.reporter.stsd.factory.class: org.apache.flink.metrics.statsd.StatsDReporterFactory
类型: push/基于标志符格式
参数:
host - StatsD 的服务器地址。
port - StatsD 的服务器端口。
配置示例:
metrics.reporter.stsd.factory.class: org.apache.flink.metrics.statsd.StatsDReporterFactory
metrics.reporter.stsd.host: localhost
metrics.reporter.stsd.port: 8125
metrics.reporter.stsd.interval: 60 SECONDS
关于 Datadog官网了解更多的信息。
metrics.reporter.dghttp.factory.class: org.apache.flink.metrics.datadog.DatadogHttpReporterFactory
按照 Datadog 的 Histograms 命名约定,Histograms 类的运行指标会作为一系列 gauges 显示(
.)。 默认情况下 min 即最小值被发送到 Datadog,sum 不会被发送。 与 Datadog 提供的 Histograms 相比,Histograms 类的运行指标不会按照指定的发送间隔进行聚合计算。
参数:
apikey - Datadog 的 API KEY。
proxyHost - (可选的)发送到 Datadog 时使用的代理主机。
proxyPort - (可选的)发送到 Datadog 时使用的代理端口,默认为 8080。
dataCenter - (可选的)要连接的数据中心(EU/US),默认为 US。
maxMetricsPerRequest - (可选的)每次请求携带的最大运行指标个数,默认为 2000。
useLogicalIdentifier -> (optional) Whether the reporter uses a logical metric identifier, defaults to false.
配置示例:
metrics.reporter.dghttp.factory.class: org.apache.flink.metrics.datadog.DatadogHttpReporterFactory
metrics.reporter.dghttp.apikey: xxx
metrics.reporter.dghttp.proxyHost: my.web.proxy.com
metrics.reporter.dghttp.proxyPort: 8080
metrics.reporter.dghttp.dataCenter: US
metrics.reporter.dghttp.maxMetricsPerRequest: 2000
metrics.reporter.dghttp.interval: 60 SECONDS
metrics.reporter.dghttp.useLogicalIdentifier: true
本部分可以参考入门示例中的slf4j的例子。
metrics.reporter.slf4j.factory.class: org.apache.flink.metrics.slf4j.Slf4jReporterFactory
类型: push/基于标志符格式
配置示例
每分钟将指标写入到日志文件中
flink-conf.yaml配置文件内容增加
metrics.reporter.slf4j.factory.class: org.apache.flink.metrics.slf4j.Slf4jReporterFactory
metrics.reporter.slf4j.interval: 60 SECONDS
以上,本文介绍了Flink的指标报告的类型以及几种发送器的示例配置,特别是针对jmx和slf4j给出了具体的实现示例及验证结果。由于本文是介绍flink的指标数据可以给哪些系统发送数据,至于具体实现算是各自的应用,故没有深入的展示。