【问题标题】:Apache Flink checkpointing stuckApache Flink 检查点卡住
【发布时间】:2020-09-16 09:07:50
【问题描述】:

我们正在运行一个 ListState 介于 300GB 和 400GB 之间的作业,有时该列表可能会增长到数千。在我们的用例中,每个项目都必须有自己的 TTL,因此我们为这个 ListState 的每个新项目创建一个新的 Timer,并在 S3 上使用 RocksDB 后端。

目前大约有 140+ 百万个计时器(将在 event.timestamp + 40 天 触发)。

我们的问题是,作业的检查点突然卡住了,或者非常慢(比如几个小时内 1%),直到最终超时。它通常会在一段非常简单的代码上停止(flink 仪表板显示0/12 (0%),而前几行显示12/12 (100%)):

[...]
    val myStream = env.addSource(someKafkaConsumer)
      .rebalance
      .map(new CounterMapFunction[ControlGroup]("source.kafkaconsumer"))
      .uid("src_kafka_stream")
      .name("some_name")

      myStream.process(new MonitoringProcessFunction()).uid("monitoring_uuid").name(monitoring_name)
        .getSideOutput(outputTag)
        .keyBy(_.name)
        .addSink(sink)
[...]

更多信息:

  • AT_LEAST_ONCE 检查点模式似乎比 EXACTLY_ONCE 更容易卡住
  • 几个月前,该州的数据量达到了 1.5TB,我认为数十亿个计时器没有任何问题。
  • 运行两个任务管理器的机器上的 RAM、CPU 和网络看起来正常
  • state.backend.rocksdb.thread.num = 4
  • 第一个事件发生在我们收到大量事件(大约数百万分钟)时,但不是在前一个事件中发生。
  • 所有事件都来自 Kafka 主题。
  • 在 AT_LEAST_ONCE 检查点模式下,作业仍然正常运行和消耗。

这是我们第二次遇到拓扑运行良好,每天有几百万个事件并突然停止检查点。我们不知道是什么原因造成的。

任何人都可以想到什么会突然导致检查点卡住?

【问题讨论】:

    标签: apache-flink flink-streaming rocksdb


    【解决方案1】:

    一些想法:

    如果您有许多计时器或多或少同时触发,那么这场计时器风暴将阻止其他任何事情发生——任务将循环调用 onTimer 直到没有更多计时器被触发,在此期间它们的输入队列将被忽略,检查点屏障不会进行。

    如果这是您遇到麻烦的原因,您可能会在计时器中添加一些随机抖动,这样事件风暴以后就不会变成计时器风暴。重新组织事物以使用 State TTL 可能是另一种选择。

    如果堆上有很多计时器,这会导致非常高的 GC 开销。这不一定会使工作失败,但会使检查点不稳定。在这种情况下,将计时器移至 RocksDB 可能会有所帮助。

    另外:由于您使用的是 RocksDB,从 ListState 切换到 MapState,以时间为键,可以让您删除单个条目,而无需在每次更新后重新序列化整个列表。 (对于 RocksDB,MapState 中的每个键/值对都是一个单独的 RocksDB 对象。)以这种方式提高清理效率可能是最好的补救措施。

    【讨论】:

    • 嘿,谢谢你的回答!我将我的问题定位在计时器上,因为我认为这可能是问题所在,很高兴读到您正在确认它。然后我们将使用 TTL 重新实现它,并且由于我们使用的是 RocksDB 后端,因此我们正在考虑使用“cleanupInRocksDbCompactFilter”和 1_000 的“过滤器”而不是其他配置。你能确认这是正确的选择吗?增加 1_000 会影响检查点时间吗?
    • 另外,MapState 及其独立的 RocksDB 对象如何提高检查点时间和效率?
    • 如果我正确理解了您当前的实现,因为每个计时器触发您修改列表以删除相应的元素。这需要反序列化整个列表,然后重新序列化更新的列表。有 1000 个条目,这会很慢。而对于 MapState,所要做的就是删除一个键/值对,这可以在不触及 Map 的其余部分的情况下完成(假设您使用计时器的时间戳作为键)。现在,您正在做大量工作来处理每个计时器触发,这会阻止检查点。
    • 我对状态 TTL 没有任何经验;我只是猜测。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-01-06
    • 1970-01-01
    • 1970-01-01
    • 2017-02-03
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多