Flink Checkpoint超时问题

Flink Checkpoint超时问题

问题现象

业务部门最近使用Flink来做数据实时同步,通过同步工具把CDC消息接入Kafka,其中上百张表同步到单个topic里,然后通过Flink来消费Kafka,做数据解析、数据分发、然后发送到目标数据库(mysql/oracle),整个链路相对比较简单,之前通过Jstorm来实现,最近才迁移到Flink,通过Flink DataStream API来实现。代码里仅用到Kafka Source、Map、Process几个简单的算子,发送目标库的逻辑在Process的逻辑里实现,因此process的逻辑里涉及数据库连接的创建与清理、通过队列来缓存数据,创建额外线程来启动发送和消费队列的逻辑,先不说整个逻辑是否合理,本文主要基于此案例来阐述遇到的问题和排查思路以及解决方法。
在这里插入图片描述

业务部门使用的Flink版本为1.11.2,部署模式采用Standalone。出问题的是单机环境,即有一个JobManager进程和一个TaskManager进程。

问题现象是通过web页面观察发现启动任务后很短时间任务就发生重启,同时还会出现重启去Cancel任务的时候无法Cancel,一直处于CANCELING状态(正常会很快变成CANCELED)。并且过一段时候后TaskManager进程挂掉,导致任务一直处于无法申请Slot的状态,最终导致数据无法正常同步。因此,问题主要有以下几个现象:

  1. Checkpoint超时
  2. 子任务长时间处于CANCELING,任务长时间处于RESTARTING状态
  3. 一段时间后TaskManager进程挂掉
  4. 数据无法正常同步

问题分析

问题1:TaskManager进程挂掉

看到问题的第一反应是首先看TaskManager进程为什么会挂掉,这个问题比较严重,因为涉及到集群层面而不单单是任务了。查看Taskmanager日志,发现有以下片段:

// 日志1
ERROR org.apache.flink.runtime.taskexecutor.TaskExecutor           [] - Task did not exit gracefully within 180 + seconds.
org.apache.flink.util.FlinkRuntimeException: Task did not exit gracefully within 180 + seconds.
	at org.apache.flink.runtime.taskmanager.Task$TaskCancelerWatchDog.run(Task.java:1572) [flink-dist_2.11-1.11.2.jar:1.11.2]
	at java.lang.Thread.run(Thread.java:748) [?:1.8.0_181]
2021-03-05 04:09:30,816 ERROR org.apache.flink.runtime.taskexecutor.TaskManagerRunner      [] - Fatal error occurred while executing the TaskManager. Shutting it down...
org.apache.flink.util.FlinkRuntimeException: Task did not exit gracefully within 180 + seconds.
	at org.apache.flink.runtime.taskmanager.Task$TaskCancelerWatchDog.run(Task.java:1572) [flink-dist_2.11-1.11.2.jar:1.11.2]
	at java.lang.Thread.run(Thread.java:748) [?:1.8.0_181]
// 日志2
WARN  org.apache.flink.runtime.taskmanager.Task                    [] - Task 'Source: Custom Source -> Map -> Process (1/1)' did not react to cancelling signal for 30 seconds, but is stuck in method:
 org.apache.flink.streaming.runtime.tasks.StreamTaskActionExecutor$SynchronizedStreamTaskActionExecutor.runThrowing(StreamTaskActionExecutor.java:91)
org.apache.flink.streaming.runtime.tasks.mailbox.Mail.run(Mail.java:78)
org.apache.flink.streaming.runtime.tasks.mailbox.MailboxProcessor.
Flink CDC(Change Data Capture)是一种用于捕获数据变化的机制,可以将数据变化以事件流的形式传输给Flink流处理程序。而checkpointFlink用来保证数据一致性和容错性的机制,它可以保存流处理程序在某个时刻的状态,以便在发生故障时进行恢复。 在使用Flink CDC时,可能会遇到checkpoint恢复问题。这些问题通常包括如何有效地设置CDC和checkpoint的配置参数,以及如何正确地处理状态恢复过程中的数据变化。例如,在进行checkpoint恢复时,可能会遇到数据重放、状态丢失或者状态不一致等问题。 为了解决这些问题,可以考虑以下几个方面: 1. 合理设置CDC和checkpoint的参数。需要根据具体的业务需求和数据特点来设置CDC和checkpoint的参数,例如并行度、checkpoint间隔、超时时间等。 2. 确保数据源的幂等性。通过保证数据源的幂等性,可以避免在数据重放时导致数据错误的问题。 3. 使用恰当的状态后端。Flink提供了不同的状态后端,如RocksDB和MemoryStateBackend,不同的状态后端对于checkpoint的恢复速度和性能有着不同的影响。 除此之外,还可以通过详细的日志记录和监控来及时发现问题和进行调优。此外,也可以参考Flink的官方文档和社区讨论,获取更多关于CDC和checkpoint的最佳实践和经验分享。通过这些方法,可以更好地解决Flink CDC checkpoint恢复问题,提高流处理程序的稳定性和性能。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值