【问题标题】:Kafka Interactive Queries - Accessing large data across instancesKafka 交互式查询 - 跨实例访问大数据
【发布时间】:2017-12-19 10:18:27
【问题描述】:

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

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

建议的解决方案: 我们正在考虑为这两个实例提供一个共享位置(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
    }

问题: 上述解决方案是否可以正常工作?如果没有,是否有任何替代解决方案?

请提出建议。提前致谢

【问题讨论】:

    标签: apache-kafka apache-kafka-streams kafka-interactive-queries


    【解决方案1】:

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

    想到的另一种选择确实是按需在节点之间流式传输数据。这很有意义,尤其是在创建报表的操作不常见或数据集无法容纳单个节点的情况下。基本上,您可以在此处按照文档指南查询远程 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

    【讨论】:

      【解决方案2】:

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

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

      【讨论】:

        猜你喜欢
        • 2019-06-05
        • 2021-01-24
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2016-09-09
        • 2021-08-25
        相关资源
        最近更新 更多