我们计划在两台机器上运行kafka streams应用程序。每个示例将其ktable数据存储在自己的机器上。我们面临的挑战是,
我们有一百万张唱片被推到了ktable。我们需要迭代整个ktable(rocksdb)数据并生成报告。
假设每个示例中存储了500k条记录。不可能在一个get over http中从其他示例获取所有记录(除非有任何流式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
}
问题:上述解决方案是否能解决任何问题?如果没有,是否有其他解决方案?
请建议。提前谢谢
2条答案
按热度按时间xmakbtuz1#
globalktable是最自然的首选,但它意味着定义全局表的每个节点都包含整个数据集。
想到的另一种方法是按需在节点之间传输数据。这很有意义,尤其是在创建报表的操作不频繁或数据集无法容纳单个节点时。基本上,您可以按照文档指南在此处查询远程kafka streams节点:
http://kafka.apache.org/0110/documentation/streams/developer-guide#streams_developer-交互式查询指南
对于rpc,使用支持流的框架,例如akkahttp。
服务器端流媒体:
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-流式http实体的侧面处理
46scxncf2#
这行不通。即使你有一个共同的
state.dir
,每个示例只加载自己的数据共享/碎片,而不知道其他数据。我认为您应该使用globalktable来获取数据的完整本地副本。