Flink CDC这种join,延迟比较高,有没有什么方案能降低延迟的呢,现在大概10几秒?
版权声明:本文内容由阿里云实名注册用户自发贡献,版权归原作者所有,阿里云开发者社区不拥有其著作权,亦不承担相应法律责任。具体规则请查看《阿里云开发者社区用户服务协议》和《阿里云开发者社区知识产权保护指引》。如果您发现本社区中有涉嫌抄袭的内容,填写侵权投诉表单进行举报,一经查实,本社区将立刻删除涉嫌侵权内容。
在Flink CDC场景中,如果Join操作导致延迟较高(如当前延迟为十几秒),可以通过以下方案进行优化。这些方案基于知识库中的内容进行了整理和总结:
检查currentFetchEventTimeLag
和currentEmitEventTimeLag
指标
根据监控指标说明,currentFetchEventTimeLag
表示从Binlog读取数据的延迟,而currentEmitEventTimeLag
表示作业处理数据的延迟。如果这两个指标数值偏高,可能的原因包括:
调整Debezium参数以加速增量数据读取
在MySQL CDC连接器中,可以通过调整Debezium相关参数来优化Binlog解析性能。例如:
'debezium.max.queue.size' = '162580',
'debezium.max.batch.size' = '40960',
'debezium.poll.interval.ms' = '50',
'scan.only.deserialize.captured.tables.changelog.enabled' = 'true',
'scan.parallel-deserialize-changelog.enabled' = 'true'
这些参数可以减少Binlog解析的延迟,从而降低整体作业延迟。
table.exec.mini-batch.enabled: true
table.exec.mini-batch.allow-latency: 5s
注意:实时计算引擎VVR已对Mini-Batch机制进行了优化,建议不设置table.exec.mini-batch.size
参数。
开启PartialFinal优化
如果Join操作中存在COUNT DISTINCT等热点问题,可以通过开启table.optimizer.distinct-agg.split.enabled
参数来优化:
table.optimizer.distinct-agg.split.enabled: true
该参数会将COUNT DISTINCT操作拆分为Partial和Final两阶段,从而缓解热点问题。
启用State KV分离优化
对于双流Join类型的作业,建议开启State KV分离优化功能。该功能在实时计算引擎VVR 6.0.1及以上版本中默认支持,可以通过以下参数显式控制:
table.exec.join.kv-separate: AUTO
开启后,可以显著提升双流Join作业的性能,典型场景下性能提升可达40%以上。
table.exec.async-lookup.key-ordered-enabled: true
应用场景:当流上相同更新键的消息量较少时,该优化可以保证基于更新键的数据处理顺序。
SinkUpsertMaterializer
算子并且状态较大,可能会影响读取性能。建议:
SinkUpsertMaterializer
算子。 注意:去掉SinkUpsertMaterializer
算子时,需要无状态启动,因为作业拓扑发生改变,原有状态可能无法兼容。合理设置Watermark策略
如果数据乱序严重,可能导致窗口计算延迟。可以通过调整Watermark生成策略来处理乱序数据。例如:
Watermark = Event time - 5s
注意:建议以整天整时整分开窗求聚合,避免因乱序严重而导致数据丢失。
检查网络I/O和上游系统
如果currentFetchEventTimeLag
较高,可能是网络I/O或上游系统的问题。建议检查网络带宽和上游系统的处理能力。
通过上述优化方案,您可以有效降低Flink CDC Join操作的延迟。具体优化效果需结合实际作业场景和监控指标进行验证。
实时计算Flink版是阿里云提供的全托管Serverless Flink云服务,基于 Apache Flink 构建的企业级、高性能实时大数据处理系统。提供全托管版 Flink 集群和引擎,提高作业开发运维效率。