Flink写Kafka任务异常报错

背景

有一个经过Flink处理数据然后输出到kafka的任务。在运行了一段时间后,突然开始报错,然后任务频繁重启,具体的报错信息如下:

Caused by: org.apache.flink.util.SerializedThrowable: Failed to send data to Kafka: Expiring xxx record(s) for XXXXXXX:120000 ms has passed since batch creation
    at org.apache.flink.streaming.connectors.kafka.FlinkKafkaProducer.checkErroneous(FlinkKafkaProducer.java:1392) 
    at org.apache.flink.streaming.connectors.kafka.FlinkKafkaProducer.flush(FlinkKafkaProducer.java:1095) 
    at org.apache.flink.streaming.connectors.kafka.FlinkKafkaProducer.preCommit(FlinkKafkaProducer.java:1002) 
    at org.apache.flink.streaming.connectors.kafka.FlinkKafkaProducer.preCommit(FlinkKafkaProducer.java:99) 
    at org.apache.flink.streaming.api.functions.sink.TwoPhaseCommitSinkFunction.snapshotState(TwoPhaseCommitSinkFunction.java:320)
    at org.apache.flink.streaming.connectors.kafka.FlinkKafkaProducer.snapshotState(FlinkKafkaProducer.java:1100)
    at org.apache.flink.streaming.util.functions.StreamingFunctionUtils.trySnapshotFunctionState(StreamingFunctionUtils.java:118)
    at org.apache.flink.streaming.util.functions.StreamingFunctionUtils.snapshotFunctionState(StreamingFunctionUtils.java:99) 
    at org.apache.flink.streaming.api.operators.AbstractUdfStreamOperator.snapshotState(AbstractUdfStreamOperator.java:89) 
    at org.apache.flink.streaming.api.operators.StreamOperatorStateHandler.snapshotState(StreamOperatorStateHandler.java:205) 
    at org.apache.flink.streaming.api.operators.StreamOperatorStateHandler.snapshotState(StreamOperatorStateHandler.java:162)
    at org.apache.flink.streaming.api.operators.AbstractStreamOperator.snapshotState(AbstractStreamOperator.java:371)
    at org.apache.flink.streaming.runtime.tasks.SubtaskCheckpointCoordinatorImpl.checkpointStreamOperator(SubtaskCheckpointCoordinatorImpl.java:685)
    at org.apache.flink.streaming.runtime.tasks.SubtaskCheckpointCoordinatorImpl.buildOperatorSnapshotFutures(SubtaskCheckpointCoordinatorImpl.java:606)
    at org.apache.flink.streaming.runtime.tasks.SubtaskCheckpointCoordinatorImpl.takeSnapshotSync(SubtaskCheckpointCoordinatorImpl.java:571)
    at org.apache.flink.streaming.runtime.tasks.SubtaskCheckpointCoordinatorImpl.checkpointState(SubtaskCheckpointCoordinatorImpl.java:298)
    at org.apache.flink.streaming.runtime.tasks.StreamTask.lambda$performCheckpoint$9(StreamTask.java:1003) 
    at org.apache.flink.streaming.runtime.tasks.StreamTaskActionExecutor$1.runThrowing(StreamTaskActionExecutor.java:50)
    at org.apache.flink.streaming.runtime.tasks.StreamTask.performCheckpoint(StreamTask.java:993) 
    at org.apache.flink.streaming.runtime.tasks.StreamTask.triggerCheckpointOnBarrier(StreamTask.java:951) 

问题定位

1. 异常堆栈信息分析

根据堆栈信息分析这个问题,是因为kafka在使用事务的过程中出现了异常导致提交失败的问题。
但是实际上我们并没有打算去使用kafka的事务功能,这个异常不符合预期,需要进行排查。

经过排查发现,在Flink任务中Checkpoint的任务中由于默认没有指定CHECKPOINT_MODE,系统使用了默认的MODE,就是exactly once模式。
当前是Flink 1.12.1版本,在使用exactly once模式模式的时候,默认启用了kafka的事务。

image.png
2. 为什么突然开始抛异常

在了解为什么出现这个异常之后,还有另外一个问题需要搞清楚。
即使启用了kafka的事务功能,但是为什么以前没问题,但是突然开始出现问题了呢。
因为跟kakfa集群有关系,开始排查集群负载、QPS等指标。


image.png

结果发现kafka集群上topic内的流量突然增长了很多倍。

由于这个kafka属于写少读多的场景。这个时候kafka流量突增,导致写流量骤然增大m倍数。同样,topic上consumer group本身就比较多(假设有n个),读流量就会方法m倍。实际上是m*n的消费压力。

kafka集群本身是需要在磁盘进行数据存储的。这个时候读流量急速扩大导致磁盘的利用率变为100%,触发超时。表现为producer写数据异常,consumer消费kafka的时候也出现了异常。

解决办法

1.临时给集群扩容,减小集群本身的压力
2.找到数据突然增加的原因进行针对应的优化或者处理

你可能感兴趣的:(Flink写Kafka任务异常报错)