gpt4 book ai didi

apache-flink - 管理具有大量内存使用的状态 - 从存储中查询

转载 作者:行者123 更新时间:2023-12-04 10:38:29 26 4
gpt4 key购买 nike

抱歉,如果这听起来很愚蠢!我们正在与 flink 合作进行异步 IO 调用。很多时候,IO 调用是重复的(相同的参数集),并且我们调用的大约 80% 的 API 针对相同的参数返回相同的响应。因此,我们希望避免再次调用电话。我们认为我们可以使用状态来存储以前的响应并再次使用它们。问题是,虽然我们的响应可以再次使用,但此类响应的数量巨大,因此需要大量内存。有没有办法在需要时坚持这个驱动和查询?

最佳答案

根本不是一个愚蠢的问题!

一些事实揭示了为什么这并不简单:

  • Flink 状态对于单个运算符(operator)来说是严格本地的。您无法访问其他运算符中的状态。
  • Flink 提供了一种可以溢出到磁盘的状态后端,即 RocksDB。只有键控状态存储在 RocksDB 中——非键控状态总是存在于堆中。
  • 异步 i/o 运算符不能用于键控流——它只能在非键控上下文中使用。
  • 将迭代(作业图中的循环连接)与 DataStream API 一起使用是一个非常糟糕的主意(因为它会破坏检查点)。

  • 当然,缓存可能没有必要处于 Flink 的托管状态。

    一些选项:
  • 不要对缓存使用键控状态。您可以使用单独的 RocksDB 实例作为缓存,并直接在异步 i/o 运算符中实现缓存。如果缓存适合内存,我建议使用 Guava。
  • 不要使用异步 i/o。按照@YuvalItzchakov 的建议,在 ProcessFunction 中自己进行获取和缓存。
  • 您可以使用 Stateful Functions反而。这是一个新的库和 API,它位于 Flink 之上,克服了上面列出的一些限制。
  • 您可以构建如下图所示的内容。这里缓存在 CoProcessFunction 中保持键控状态。如果缓存未命中,则使用下游异步 i/o 运算符来获取丢失的数据。然后必须使用外部队列(例如 Kafka、Kinesis 或 Pulsar)将其循环回缓存。
  •                     +---------------------+                                       +------+
    | +--results from cache+---------------^--> SINK |
    +--requests+------> | CoProcessFunction | | +------+
    | | |
    +--cache misses+--> | cache in RocksDB | +-----------+ |
    | +--side output: | fetch via +---+-> loop back
    SOURCES +---------------------+ cache misses+---> | async i/o | as 2nd input
    +-----------+ to fill cache

    关于apache-flink - 管理具有大量内存使用的状态 - 从存储中查询,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/60040596/

    26 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com