【问题标题】:Handling "state refresh" in Flink ConnectedStream在 Flink ConnectedStream 中处理“状态刷新”
【发布时间】:2019-01-31 05:20:00
【问题描述】:

我们正在构建一个有两个流的应用程序:

  1. 大量消息流
  2. 我们将一个大型静态流(源自我们周围的一些 parquet 文件)输入 Flink,只是为了让该数据集进入保存状态

我们想连接两个流以获得共享状态,以便第一个流可以使用第二个状态进行丰富。

每天左右,parquet 文件(第二个流的源)都会更新,这将需要我们清除第二个流的状态并重建它(可能需要大约 2 分钟)。

问题是,我们能否在该进程运行时阻止/延迟来自第一个流的消息?

谢谢。

【问题讨论】:

    标签: apache-flink flink-streaming


    【解决方案1】:

    不幸的是,目前没有直接/简单的方法来阻止另一个流上的一个流。典型的解决方案是在加载(或重新加载)扩充流时缓冲摄取流。

    您可以尝试的一种方法是将您的摄取流包装在自定义SourceFunction 中,该SourceFunction 基于某些外部触发器知道何时不生成数据(这与您用来知道您拥有 Parquet 数据的信号相同)重新加载)。

    【讨论】:

    • 我尝试编写一个“RichParallelSourceFunction”,结果证明它比最初预期的要复杂一些,因为每个 parquet 文件似乎都被一遍又一遍地读取。缓冲的想法似乎是一个很好的方法,我可能会在不久的将来使用窗口来探索这个,但是现在,我们决定从尽可能简单的东西开始,即使这意味着我们会有每当我们启动工作时,我们自己手动启动 Kafka 流。谢谢。
    • 我不知道为什么每个 Parquet 文件会被读取多次。每个文件都会从中读取多个拆分,所以也许这就是您所看到的?
    【解决方案2】:

    听起来你的情况有点像Flip-23,它探索了 Apache Flink 中的模型服务。

    我认为这一切都归结为您的静态流如何(以及是否)被键控:

    • 如果它以与您的快速数据类似的方式键入,那么您可以键入两个流,连接它们,然后可以访问键入的上下文。
    • 如果静态流事件未以类似方式键入,则您应该考虑发出控制事件,这将触发从外部源(例如 s3)刷新这些静态文件。这说起来容易做起来难,因为没有简单的方法可以保证快速流的所有并行实例都将获得控制事件。 您可以使用 ListState 作为缓冲区,但如何访问它取决于数据的形状。

    如果您分享一些有关数据形状的更多信息(例如,您是否加入密钥?您只是为模型提供服务?其他?),这可能会有所帮助。

    【讨论】:

    • 两个流都由 IP 前缀键控,其中一个流使用 ListState。我将看一下服务模型,因为与该用例有相似之处。谢谢。
    猜你喜欢
    • 1970-01-01
    • 2021-03-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-12-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多