Kafka交互式查询 - 跨实例访问大型数据

时间:2017-07-14 10:35:46

标签: apache-kafka apache-kafka-streams

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

  1. 我们有一百万条记录被推送到Ktable。我们需要迭代 整个Ktable(RocksDB)数据并生成报告。
  2. 让我们说每个实例中存储500K条记录。通过http在单个GET中获取来自其他实例的所有记录是不可能的 (除非有任何流式TCP技术可用)。基本上 我们在一次调用中需要两个实例数据并生成报告。
  3. 建议的解决方案: 我们正在考虑为这两个实例建立一个共享位置(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
        }
    

    问题: 以上解决方案是否可以正常运行?如果没有,有没有替代方案呢?

    请建议。在此先感谢

2 个答案:

答案 0 :(得分:2)

这不起作用。即使您有共享state.dir,每个实例也只加载自己的数据共享/分片,并且不知道其他数据。

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

答案 1 :(得分:2)

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

另一个想到的选择是确实按需在节点之间传输数据。这是有道理的,特别是如果创建报告是一种不频繁的操作或者数据集不能适合单个节点。基本上,您可以按照文档指南来查询远程Kafka Streams节点:

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

并且对于RPC使用支持流式传输的框架,例如阿卡-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