我的流式flink作业的检查点时间平均为2-3s(15-20%的时间)和3-4分钟(8-12%的时间)和2分钟。我们有两个操作符,它们是有状态的。第一个是kafka的消费者作为源(FlinkKafkaConsumer010),另一个是hdfs宿(CustomBucketingSink)。这两种方法使保存点的状态约为1-1.5 3gb,检查点的状态约为800MB-6 3gb(平均为3 3gb)。我们有30秒的翻滚处理窗口。检查点持续时间和两个检查点之间的最小停顿时间为3分钟。我的工作平均每分钟消耗大约300万条记录,高峰期消耗大约2000万条记录。对于flink来说,有足够的cpu和内存。
下面是我的疑虑:
1)即使与其他检查点状态相比,较少的检查点状态大小更小(减少70-80%),也需要几分钟(15-20%的时间),而其他检查点状态需要5-10秒。
2)缓冲区对齐大小有时会增加到7-8 1gb,而平均为800MB-1 1gb,但检查点时间不受此影响。我猜它应该需要更多的时间,因为它应该等待检查点屏障。
3)如果我们增加翻滚窗口大小,是否会影响检查响应时间。我认为它不应该影响保存点时间和检查点时间。
4)进入hdfs的子任务很少需要2-3分钟(5-10%的时间)。因此,虽然98%的子任务在30-50秒内完成。1-2(95%的时间,只有一个)子任务需要2-3分钟。这会延迟整个检查点时间。问题不在于正在运行此子任务的节点,因为它有时发生在某个节点上,有时发生在另一个节点上。
5)我们每隔6-8小时就会得到一个重新启动作业的异常。org.apache.flink.streaming.runtime.tasks.SystemProcessingTimeService$TriggerTask.run(SystemProcessingTimeService.java:288)上的TimerException{java.nio.channels.ClosedByInterruptException}
6)如何最小化对齐缓冲时间。
7)保存点时间随输入速率或状态大小的增加或减少而增加或减少,但检查点时间并不相同。检查点时间有时与状态大小成反比关系,或者我们可以看到它不受状态大小的影响。
8)每当我们重新启动作业时,所有子任务在所有节点上都需要2-3天的统一时间,但之后1-2个子任务需要2-3分钟,而其他任务需要15-30秒。在这种行为上,我可能是错的,但据我观察,这也是一个例子。
发布于 2020-03-12 17:20:34
请注意,窗口是有状态的,除非您正在执行增量聚合,否则较长的窗口具有更多状态,这反过来会影响检查点大小和持续时间。
知道你正在使用哪个状态后端,以及你是否在使用增量检查点,这将是有帮助的。
首先,我会尝试找出导致反压的缓慢接收子任务的原因,这反过来又会导致痛苦的检查点。例如,可能是数据倾斜或资源匮乏。一些常见原因包括CPU、网络或磁盘带宽不足,或者AWS (或其他API)速率限制。例如,您可能看起来有足够的CPU,但一个热键可能会将过多的负载放在一个线程上,从而阻碍整个集群。
如果您找到了纠正接收器不平衡的方法,那么检查点对齐问题应该会平息下来。(请注意,如果您可以容忍重复的结果,则可以通过选择CheckpointingMode.AT_LEAST_ONCE
禁用检查点屏障对齐。)
https://stackoverflow.com/questions/60643106
复制相似问题