Kafka Interactive Queries - 跨实例访问大数据

Kafka Interactive Queries - Accessing large data across instances

我们计划运行 kafka streams 应用分布在两台机器上。每个实例都将其 Ktable 数据存储在自己的机器上。 我们在这里面临的挑战是,

  1. 我们有一百万条记录被推送到 Ktable。我们需要迭代 整个 Ktable (RocksDB) 数据并生成报告。
  2. 假设每个实例中存储了 500K 条记录。不可能通过 http 在单个 GET 中从其他实例获取所有记录 (除非有任何可用的流式 TCP 技术)。基本上 我们在一次调用中需要两个实例数据并生成报告。

建议的解决方案: 我们正在考虑为这两个 instances.So 设置一个共享位置 (state.dir),这两个实例会将 Ktable 数据存储在同一目录中,并且想法是从单个实例获取所有数据而无需交互式查询只需致电,

final ReadOnlyKeyValueStore<Key, Result> allDataFromTwoInstance =
        streams.store("result",
            QueryableStoreTypes.<Key, Result>keyValueStore())

    KeyValueIterator<Key, ReconResult> iterator = allDataFromTwoInstance.all();
    while (iterator.hasNext()) {
       //append to excel report
    }

问题: 上述解决方案是否可以正常工作?如果没有,是否有其他解决方案?

求推荐。提前致谢

这行不通。即使您有一个共享的 state.dir,每个实例也只加载自己的 share/shard 数据而不知道其他数据。

我认为您应该使用 GlobalKTable 获取数据的完整本地副本。

GlobalKTable 是最自然的首选,但这意味着定义全局 table 的每个节点都包含整个数据集。

想到的另一种选择确实是按需在节点之间流式传输数据。这很有意义,尤其是当创建报告的操作不频繁或数据集无法容纳单个节点时。基本上,您可以在此处按照文档指南查询远程 Kafka Streams 节点:

http://kafka.apache.org/0110/documentation/streams/developer-guide#streams_developer-guide_interactive-queries_discovery

对于 RPC,使用支持流式传输的框架,例如akka-http.

服务器端流:

http://doc.akka.io/docs/akka-http/current/java/http/routing-dsl/source-streaming-support.html

正在使用流响应:

http://doc.akka.io/docs/akka-http/current/java/http/implications-of-streaming-http-entity.html#client-side-handling-of-streaming-http-entities