现象:
仿真环境flink集群中,flinkcdc任务同步不了数据
排查过程
一:
查看flinkcdc任务所在机器,发现cpu占用居高不下。先启动同步任务,cpu占用不高,开启join任务后,cpu拉满。
二:
减少同步任务,减少join任务,多次尝试,问题仍然存在
三:
用jstack工具查看线程栈信息,发现占用资源的线程为logmainer同步Oracle归档日志的线程。
四:
分析所在的代码信息,判断logmainer维护的事务的缓冲区(recentlyCommittedTransactionIds)太大,循环里一直占用资源;
五:
多次修改debezium中间件的相关优化参数后(lob.enable参数没有影响),cpu资源占用问题消失,flink作业正常执行(同一台taskmanager跑了5个cdc同步任务和16个join任务)。
以下为关键参数配置:
properties.setProperty("log.mining.transaction.retention.hours", "1");
properties.setProperty("heartbeat.interval.ms", "60000");
properties.setProperty("log.mining.batch.size.default", "100000");
properties.setProperty("log.mining.batch.size.min", "10000");
properties.setProperty("log.mining.batch.size.max", "1000000");
properties.setProperty("log.mining.sleep.time.min.ms", "1000");
properties.setProperty("log.mining.sleep.time.max.ms", "60000");
properties.setProperty("log.mining.sleep.time.default.ms", "3000");
properties.setProperty("log.mining.sleep.time.increment.ms", "1000");
所用的一些关键命令
查看Java进程:jps
监控java进程(线程占用资源):top -p [pid] -H
栈信息快照:jstack [pid] > stack.log
快照里查线程状态:cat -n stack.log | grep [16进制的线程id] -C10