具有巨大状态的 Flink 恢复/重启作业

时间:2021-02-24 06:29:31

标签: apache-flink flink-streaming

我正在 K8 上运行 flink 集群,状态约为 1TB。

我面临的一个问题是获取保存点并恢复工作。现在,这些更新有时是简单的代码更新,而不是并行性更改。但是获取保存点然后使用旧状态恢复新作业的时间相当长。

有没有办法对作业进行就地更新,以便本地状态和作业 ID 不会改变,从而避免执行保存点+恢复所消耗的时间?

1 个答案:

答案 0 :(得分:1)

在许多情况下,您可以使用 retained (externalized) checkpoints 代替保存点。这有效,但在以下情况下除外:

  • 使用未对齐的检查点重新缩放(此限制将消失;请参阅 FLINK-17979
  • 涉及状态的作业拓扑发生了变化
  • 需要状态迁移的类型发生了变化

您可能会发现拓扑更改和状态迁移在某些情况下起作用,但这不能保证。

对于 RocksDB 上的大型状态,您将需要使用增量检查点。完整检查点和保存点需要很长时间,但增量检查点要快得多。

如果你确实想重新调整规模,增加 RocksDB 可用的线程数是有益的,更像这样:


func onTest() {
      
        let content = UNMutableNotificationContent()
        content.title = "Weekly Staff Meeting"
        content.body = "Every Tuesday at 2pm"
        // Configure the recurring date.
        var dateComponents = DateComponents()
        dateComponents.calendar = Calendar.current

        dateComponents.hour = 16    // 14:00 hours
        dateComponents.minute = 11
           
        // Create the trigger as a repeating event.
        let trigger = UNCalendarNotificationTrigger(
                 dateMatching: dateComponents, repeats: true)
        
        // Create the request
        let uuidString = UUID().uuidString
        let request = UNNotificationRequest(identifier: uuidString,
                    content: content, trigger: trigger)

        // Schedule the request with the system.
        let notificationCenter = UNUserNotificationCenter.current()
        notificationCenter.add(request) { (error) in
           if error != nil {
              // Handle any errors.
           }
        }
    }