Flink CDC为什么作业会一直打印这个日志?
版权声明:本文内容由阿里云实名注册用户自发贡献,版权归原作者所有,阿里云开发者社区不拥有其著作权,亦不承担相应法律责任。具体规则请查看《阿里云开发者社区用户服务协议》和《阿里云开发者社区知识产权保护指引》。如果您发现本社区中有涉嫌抄袭的内容,填写侵权投诉表单进行举报,一经查实,本社区将立刻删除涉嫌侵权内容。
Flink CDC作业一直打印某些日志,可能与以下几个原因相关。以下是详细分析及解决方案:
Flink CDC在运行过程中会定期记录Checkpoint的位点信息,尤其是MySQL CDC源表会在每次Checkpoint时打印当前Binlog的消费位点。例如:
Binlog offset on checkpoint {checkpoint-id}: file=mysql-bin.000003, position=12345
原因:这是Flink CDC的正常行为,用于记录当前消费的Binlog位点,以便在作业重启时能够从正确的位点恢复。
解决方案: - 如果这些日志过于频繁且影响排查其他问题,可以调整Checkpoint间隔时间(checkpoint.interval
),减少Checkpoint频率。 - 将日志级别从INFO
调整为WARN
或ERROR
,以减少不必要的日志输出。
如果使用了Debezium作为底层连接器,可能会打印一些与Schema解析、数据变更处理相关的日志。例如:
Encountered change event for table xxx.xxx whose schema isn't known to this connector
原因: - 数据库用户权限不足,导致无法读取某些表的Schema信息。 - 配置了'debezium.snapshot.mode'='never'
,导致Debezium未正确初始化Schema。 - Binlog中包含无法解析的变更事件。
解决方案: 1. 确保数据库用户具有对所有相关表的读取权限。 2. 避免使用'debezium.snapshot.mode'='never'
,改为默认的initial
模式。 3. 配置'debezium.inconsistent.schema.handling.mode' = 'warn'
,避免因Schema不一致导致报错。
如果Binlog格式设置为Mixed
,或者Binlog中包含无法解析的事件,可能会打印类似以下日志:
binlog probably contains events generated with statement or mixed based replication format
原因: - MySQL的Binlog格式未设置为ROW
,导致CDC工具无法正确解析变更事件。 - Binlog中包含非法或不支持的事件类型。
解决方案: 1. 检查并确保MySQL的Binlog格式为ROW
:
show variables like "binlog_format";
set global binlog_format=ROW;
'debezium.event.deserialization.failure.handling.mode'='warn'
,将脏数据打印到WARN日志中。如果是Postgres CDC作业,可能会打印与TOAST数据相关的日志。例如:
TOAST data is not transmitted in the WAL log
原因: - TOAST数据较大,为了节省WAL日志大小,Postgres未将未发生变化的TOAST数据写入WAL日志。 - 配置了'debezium.schema.refresh.mode'='columns_diff_exclude_unchanged_toast'
,导致wal2json插件未传输TOAST数据。
解决方案: - 确保副本身份是完整的。 - 如果需要TOAST数据,可以调整'debezium.schema.refresh.mode'
参数,改为columns_diff
模式。
如果作业存在慢Checkpoint或反压问题,可能会打印大量与Task Managers(TM)相关的日志。例如:
Checkpoint took longer than expected
原因: - Checkpoint耗时过长,可能是由于状态过大、下游I/O压力过高或网络延迟导致。 - 反压问题可能导致数据处理速度变慢,进而引发Checkpoint超时。
解决方案: 1. 检查慢Checkpoint的具体原因,查看关联的TM日志。 2. 调整Checkpoint间隔时间,优化状态存储。 3. 如果状态过大,考虑启用增量Checkpoint或优化状态算子(如ChangelogNormalize)。
如果日志级别被设置为DEBUG
,可能会打印大量细粒度的运行状态信息,导致日志量激增。
原因: - 日志级别设置过高,导致DEBUG级别的日志被打印。
解决方案: - 将日志级别调整为INFO
,仅保留重要信息的输出。
如果全量阶段读取时间过长,可能会打印与内存溢出(OOM)相关的日志。例如:
OutOfMemoryError: Java heap space
原因: - 全量阶段数据量过大,导致内存不足。 - 并发度设置不合理,导致单个分片数据量过大。
解决方案: - 增加MySQL Source端的并发度,加快全量读取速度。 - 调整JVM堆内存大小,避免内存不足。
如果Binlog文件被清理,可能会打印类似以下日志:
The connector is trying to read binlog starting at GTIDs ..., but this is no longer available on the server
原因: - MySQL服务器上设置的Binlog文件过期时间太短。 - CDC作业处理Binlog的速度过慢。
解决方案: 1. 增加Binlog的保留时间,例如设置为保留7天:
set global expire_logs_days=7;
Flink CDC作业打印日志的原因多种多样,通常与Checkpoint、Debezium、Binlog格式、慢Checkpoint、DEBUG日志级别等因素相关。根据具体日志内容,结合上述分析和解决方案进行排查和优化,可以有效减少不必要的日志输出并提升作业稳定性。
实时计算Flink版是阿里云提供的全托管Serverless Flink云服务,基于 Apache Flink 构建的企业级、高性能实时大数据处理系统。提供全托管版 Flink 集群和引擎,提高作业开发运维效率。