Kafka Streams - Streams App中存储在内存和磁盘中的内容

edd*_*P23 5 apache-kafka apache-kafka-streams

我是Kafka Streams的新手,我一直在阅读有关如何设置Kafka Streams应用程序的文档.

我不清楚,数据是如何处理的 - 存储在内存中的内容以及存储在磁盘上的内容.我已经看到RocksDB在某处提到过,但在流文档中却没有.

我试图解决的问题如下.我有2个Kafka主题,这两个键值存储类型都保留了每个键的最旧值.在我的流应用程序中,我想要加入这两个主题并将连接输出回kafka,以后可以被某个接收器使用.我担心的是,不清楚联接的执行方式.这两个主题都有GB数据,因此不可能适合Streams App内存.

Mat*_*Sax 5

您可以将每个主题读取为 aKTable并执行表-表连接:

KTable table1 = builder.table("topic-1");
KTable table2 = builder.table("topic-2");

KTable joinResult = table1.join(table2, ...);
joinResult.to("output-topic");
Run Code Online (Sandbox Code Playgroud)

有关更多详细信息,请参阅: http://docs.confluence.io/current/streams/developer-guide.html#ktable-ktable-join 另请查看示例: https: //github.com/confluenceinc/examples/tree/ 3.3.0-post/kafka-streams

对于运行时,这两个主题都将在 RocksDB 状态存储中具体化。RocksDB 能够溢出到磁盘。另请注意,单个 RocksDB 实例仅需要保存单个输入分区的数据。比较http://docs.confluence.io/current/streams/architecture.html#parallelism-model

  • 所有处理都发生在应用程序节点X上(即RocksDB将在X上,并且连接计算发生在X上)。代理(A、B、C)不参与连接(他们甚至不知道有 Kafka Streams 应用程序——对于代理来说,它看起来就像任何其他消费者)。顺便说一句:RocksDB 不需要保存“所有”数据:因为两个主题都应该是压缩主题,RocksDB 只需保存每个键的最新键值对。 (3认同)
  • 状态也由主题代理方支持以保证容错性。如果您崩溃并且任务被移动到另一个实例,则将从主题重新创建状态。StandbyTasks 不提供容错功能,但可以让您更快地恢复。 (3认同)