在研究了许多SO帖子甚至JIRA问题之后,我不知道该去哪里了。 Flink中的每个检查点都因超时而失败,在作业的异常部分中,它显示以下错误,但是作业本身不会失败:
org.apache.kafka.common.errors.TimeoutException: Timeout expired after 600000milliseconds while awaiting InitProducerId
在禁用检查点时,有关Kafka的所有操作均按预期方式工作,因此我认为可能与检查点等待Kafka提交以便被确认有关({Semantic
设置为{{1} })。我记得曾读过有关导致问题的超时不匹配的信息,所以我将FlinkKafkaProducer中的EXACTLY_ONCE
调整为TRANSACTION_TIMEOUT_CONFIG
毫秒。
我还根据this问题中的建议对TransactionTimeout和MaxBlockMS进行了调整,该问题现在就这个完全相同的错误进行了很多讨论,但显然没有解决办法。
Flink的“使用Apache Flink进行流处理”一书建议仔细修改Kafka配置,例如900000
,acks
,log.flush.interval.messages
和log.flush.interval.ms
。虽然我们已经在Flink 1.9.1下进行了此工作,但是由于我们已升级到1.11.1,因此不再起作用。同时,我不知道是否有人触摸过Kafka设置,但据我所知,除log.flush.*
以外,大多数设置都保留为默认设置。我们像以前一样使用Confluent log.flush.interval=10000
,这意味着Kafka 5.3.3
。
此外,Flink作业部署在单节点环境中,因此它应该有权访问文件系统,整个目录归运行Flink服务的用户所有(这是另一个SO线程中的建议解决方案)。
有人知道导致这些检查点失败的原因吗?
答案 0 :(得分:0)
在对此感到头疼之后,我终于找到了一个问题:实际上,由于transaction.state.log.replication.factor
低于transaction.state.log.min.isr
,Kafka设置实际上已经改变了,导致没有交易真正成功,因为Kafka主题的同步副本永远不够。