SqlServer FlinkCDC同步到Paimon一直卡在Busy100%的问题处理: Failed to convert value xxx to type TINYINT

本文介绍了在使用Flink CDC从SqlServer同步数据到Paimon时遇到的问题,即作业卡在CDC MultiplexWriter, Busy 100%。原因是Paimon在处理TINYINT类型时的类型转换错误,导致越界异常。解决方案是修改Paimon的源码,将TINYINT处理方式改为与SMALLINT相同,重新编译并替换jar文件,最后重启Flink作业。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

解决FlinkCDC流作业卡住问题

问题描述

通过FlinkCDC启动流式数据同步,将SqlServer数据同步到Paimon数据湖中,在Flink管理里界面发现同步状态异常:卡在CDC MultiplexWriter,一直处于Busy 100%。如图:
Flink同步作业状态异常
当Flink作业卡住一段时间之后,Flink Dashboard Exceptions页面可以看到以下异常信息:

org.apache.flink.util.FlinkRuntimeException: Exceeded checkpoint tolerable failure threshold. The latest checkpoint failed due to Checkpoint expired before completing., view the Checkpoint History tab or the Job Manager log to find out why continuous checkpoints failed.
	at org.apache.flink.runtime.checkpoint.CheckpointFailureManager.checkFailureAgainstCounter(CheckpointFailureManager.java:212)
	at org.apache.flink.runtime.checkpoint.CheckpointFailureManager.handleJobLevelCheckpointException(CheckpointFailureManager.java:169)
	at org.apache.flink.runtime.checkpoint.CheckpointFailureManager.handleCheckpointException(CheckpointFailureManager.java:122)
	at org.apache.flink.runtime.checkpoint.CheckpointCoordinator.abortPendingCheckpoint(CheckpointCoordinator.java:2155)
	at org.apache.flink.runtime.checkpoint.CheckpointCoordinator.abortPendingCheckpoint(CheckpointCoordinator.java:2134)
	at org.apache.flink.runtime.checkpoint.CheckpointCoordinator.access$700(CheckpointCoordinator.java:101)
	at org.apache.flink.runtime.checkpoint.CheckpointCoordinator$CheckpointCanceller.run(CheckpointCoordinator.java:2216)
	at java.util.concurrent.Executors$RunnableAdapter.call(Executors.java:511)
	at java.util.concurrent.FutureTask.run(FutureTask.java:266)
	at java.util.concurrent.ScheduledThreadPoolExecutor$ScheduledFutureTask.access$201(ScheduledThreadPoolExecutor.java:180)
	at java.util.concurrent.ScheduledThreadPoolExecutor$ScheduledFutureTask.run(ScheduledThreadPoolExecutor.java:293)
	at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1149)
	at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:624)
	at java.lang.Thread.run(Thread.java:750)

问题原因

打开Task Managers日志界面,或者到hadoop的日志目录下查找taskmanager.log日志,定位到异常错误位置:

2024-06-11 18:17:52,318 INFO  org.apache.paimon.flink.sink.cdc.CdcRecordUtils     [] - Failed to convert value 162 to type TINYINT. Waiting for schema update. 
java.lang.NumberFormatException: Value out of range. Value:"162" Radix:10
        at java.lang.Byte.parseByte(Byte.java:151) ~[?:1.8.0_371]
        at java.lang.Byte.valueOf(Byte.java:205) ~[?:1.8.0_371]
        at java.lang.Byte.valueOf(Byte.java:231) ~[?:1.8.0_371]
        at org.apache.paimon.utils.TypeUtils.castFromStringInternal(TypeUtils.java:125) ~[paimon-flink-1.17-0.5.jar:0.5]
        at org.apache.paimon.utils.TypeUtils.castFromCdcValueString(TypeUtils.java:60) ~[paimon-flink-1.17-0.5.jar:0.5]
        at org.apache.paimon.flink.sink.cdc.CdcRecordUtils.toGenericRow(CdcRecordUtils.java:103) ~[paimon-flink-1.17-0.5.jar:0.5]
        at org.apache.paimon.flink.sink.cdc.CdcRecordUtils.toGenericRow(CdcRecordUtils.java:103) ~[paimon-flink-1.17-0.5.jar:0.5]
        at org.apache.paimon.flink.sink.cdc.CdcRecordStoreMultiWriteOperator.processElement(CdcRecordStoreMultiWriteOperator.java:153) ~[paimon-flink-1.17-0.5.jar:0.5]
        at org.apache.flink.streaming.runtime.tasks.OneInputStreamTask$StreamTaskNetworkOutput.emitRecord(OneInputStreamTask.java:237) ~[flink-dist-1.17.1.jar:1.17.1]
        at org.apache.flink.streaming.runtime.io.AbstractStreamTaskNetworkInput.processElement(AbstractStreamTaskNetworkInput.java:146) ~[flink-dist-1.17.1.jar:1.17.1]
        at org.apache.flink.streaming.runtime.io.AbstractStreamTaskNetworkInput.emitNext(AbstractStreamTaskNetworkInput.java:110) ~[flink-dist-1.17.1.jar:1.17.1]
        at org.apache.flink.streaming.runtime.io.StreamOneInputProcessor.processInput(StreamOneInputProcessor.java:65) ~[flink-dist-1.17.1.jar:1.17.1]
        at org.apache.flink.streaming.runtime.tasks.StreamTask.processInput(StreamTask.java:550) ~[flink-dist-1.17.1.jar:1.17.1]
        at org.apache.flink.streaming.runtime.tasks.mailbox.MailboxProcessor.runMailboxLoop(MailboxProcessor.java:231) ~[flink-dist-1.17.1.jar:1.17.1]
        at org.apache.flink.streaming.runtime.tasks.StreamTask.runMailboxLoop(StreamTask.java:839) ~[flink-dist-1.17.1.jar:1.17.1]
        at org.apache.flink.streaming.runtime.tasks.StreamTask.invoke(StreamTask.java:788) ~[flink-dist-1.17.1.jar:1.17.1]
        at org.apache.flink.runtime.taskmanager.Task.runWithSystemExitMonitoring(Task.java:952) [flink-dist-1.17.1.jar:1.17.1]
        at org.apache.flink.runtime.taskmanager.Task.restoreAndInvoke(Task.java:931) [flink-dist-1.17.1.jar:1.17.1]
        at org.apache.flink.runtime.taskmanager.Task.doRun(Task.java:745) [flink-dist-1.17.1.jar:1.17.1]
        at org.apache.flink.runtime.taskmanager.Task.run(Task.java:562) [flink-dist-1.17.1.jar:1.17.1]
        at java.lang.Thread.run(Thread.java:750) [?:1.8.0_371]

在错误栈中注意到org.apache.paimon.utils.TypeUtils,查看其源码:

private static Object castFromStringInternal(String s, DataType type, boolean isCdcValue) {
   
   
        BinaryString str = BinaryString.
### FlinkCDCBusy100问题及解决方案 FlinkCDC 在运行过程中可能会出现任务Busy100% 的状态,这种现象通常与数据流的处理能力、背压以及任务间的协调机制有关。以下是对该问题的分析和解决方案: #### 问题原因分析 Busy100%问题通常表明 Flink 作业中的某些任务或线程处于高负载状态,无法及时处理流入的数据,从而导致整个系统进入高负载循环。具体原因可能包括以下几个方面: - **背压问题**:当下游任务处理速度慢于上游任务时,会导致数据堆积,形成背压。这会进一步影响 checkpoint 的生成效率,甚至导致超时[^2]。 - **缓冲区管理**:如果 Task 1 和 Task 2 运行在同一节点上,且 Task 2 的消费速度慢于 Task 1 的生产速度,可能导致缓冲池中的 buffer 被快速耗尽,Task 1 因等待可用 buffer 而降速[^3]。 - **数据转换异常**:在使用 FlinkCDC 同步数据到 Paimon 时,可能出现数据类型不匹配的问题,例如 `Failed to convert value xxx to type ...`,这会导致任务停滞或频繁重试,最终表现为 Busy100% 状态[^4]。 #### 解决方案 针对上述问题,可以采取以下措施进行优化和解决: 1. **调整 Checkpoint 超时时间** 如果 checkpoint 超时时间设置过短(如默认值),可能会导致频繁的 checkpoint 失败。建议根据实际业务需求适当延长 checkpoint 超时时间,例如从默认的 1 分钟增加到 30 分钟或更长时间,以减少因超时引发的任务重启。 2. **优化背压问题** - **增加并行度**:通过提高任务的并行度来分散计算压力,避免单个任务成为瓶颈。可以通过配置 `parallelism` 参数实现。 - **调整 Buffer Size**:增大网络缓冲区大小,允许更多的数据在缓冲区中暂存,缓解瞬时的流量高峰。可以在 Flink 配置文件中设置 `taskmanager.network.memory.fraction` 或 `taskmanager.network.memory.min` 等参数[^3]。 - **启用 Backpressure Monitoring**:通过 Flink Web UI 或其他监控工具实时观察背压情况,定位具体的瓶颈任务,并针对性地优化。 3. **修复数据转换异常** - 检查源数据和目标表的字段类型是否匹配。如果不匹配,可以通过重新编译相关模块(如 `paimon-flink-common` 和 `paimon-flink-1.17`)并替换对应的 JAR 包来解决类型转换问题[^4]。 - 示例代码如下: ```bash # 重新编译模块 mvn clean package -DskipTests # 替换 JAR 包 cp target/paimon-flink-1.17-0.5.jar $FLINK_HOME/lib/ # 重启 YARN Session flink stop-yarn-session flink start-yarn-session ``` 4. **优化任务调度和资源分配** - 确保每个 TaskManager 的资源(CPU、内存)充足,避免因资源不足导致任务性能下降。 - 使用动态分配策略(Dynamic Allocation),根据实际负载动态调整资源分配。 5. **监控和日志分析** - 定期检查 Flink 日志,定位潜在的异常或错误信息。 - 使用 Prometheus、Grafana 等工具对作业的性能指标进行监控,及时发现和解决问题。 --- ### 注意事项 - 在调整参数或重新编译模块时,务必备份原有配置,以防出现问题时能够快速恢复。 - 如果问题仍然存在,可以尝试升级 Flink 或相关组件版本,以获取最新的功能改进和 bug 修复。 ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值