Flink 应用中的延迟监控

Latency Monitoring in Flink application

我正在寻求有关延迟监控 (flink 1.8.0) 的帮助。

假设我有一个简单的流式数据流,其中包含以下运算符: FlinkKafkaConsumer -> Map -> print.

如果我想测量数据流中记录处理的延迟,最好的机会是什么? 我想获得处理在源中接收到的输入的持续时间,直到它被 sink/finished 接收器操作接收到为止。

我添加了我的代码:env.getConfig().setLatencyTrackingInterval(100);

然后,可以使用以下延迟指标:

但我不明白他们到底在测量什么?此外,在我看来,延迟平均值似乎与延迟无关。

我也尝试过使用 codahale 指标来获取某些方法的持续时间,但这并不能帮助我获取在我的整个管道中处理的记录的延迟。

解决方案与LatencyMarker相关吗?如果是,我怎样才能在我的接收器操作中到达它以便检索它?

谢谢, 罗伊.

-- 从邮件列表中复制我的回答以备将来参考

嗨,罗伊,

使用延迟跟踪,您将获得 LatencyMarkers 从每个源操作员传输到每个下游操作员所花费的时间的分布(每个 non-source 操作员中每个源操作员默认一个直方图,请参阅 metrics.latency.granularity).

LatencyMarkers 定期注入源中并流经拓扑。他们无法超越常规记录。 LatencyMarkers 通过函数(用户代码)没有任何延迟。这意味着延迟跟踪测量的延迟将仅反映 end-to-end 延迟的一部分,特别是在 non-backpressure 场景中。在背压场景中,延迟标记将在最慢的操作符之前排队(因为它们不能超过记录)并且延迟将更好地反映管道中的真实延迟。在我看来,延迟标记不是衡量 Flink 应用程序中 "user-facing/end-to-end latency" 的正确工具。对我来说,这是一个调试工具,用于查找延迟或拥塞通道的来源。

我建议,不要使用延迟跟踪,而是在接收器操作符中自己添加一个直方图指标,它描述了当前处理时间和事件时间之间的差异,以获得源的事件时间延迟分布.如果您在源代码(以及任何其他兴趣点)中执行相同操作,您将清楚地了解 even-time 滞后如何随时间变化。

希望这对您有所帮助。

干杯,

康斯坦丁