将 Kafka 输入流动态连接到多个输出流
Dynamically connecting a Kafka input stream to multiple output streams
Kafka Streams 是否内置了允许将单个输入流动态连接到多个输出流的功能? KStream.branch
允许基于 true/false 谓词的分支,但这不是我想要的。我希望每个传入的日志都确定它将在运行时流式传输到的主题,例如,日志 {"date": "2017-01-01"}
将流式传输到主题 topic-2017-01-01
并且日志 {"date": "2017-01-02"}
将流式传输进入主题 topic-2017-01-02
.
我可以在流上调用 forEach
,然后写入 Kafka 生产者,但这似乎不太优雅。在 Streams 框架内有没有更好的方法来做到这一点?
如果您想根据您的数据动态创建主题,您目前在 Kafka 的 Streaming API(v0.10.2
及更早版本)中得不到任何支持。您将需要创建一个 KafkaProducer
并自行实现动态 "routing"(例如使用 KStream#foreach()
或 KStream#process()
)。请注意,您需要进行同步写入以避免数据丢失(不幸的是,这不是很高效)。有计划使用动态主题路由扩展 Streaming API,但目前还没有此功能的具体时间表。
您还应该考虑另一件事。如果您事先不知道您的目标主题而只是依赖 so-called "topic auto creation" 功能,您应该确保这些主题是使用所需的配置设置创建的(例如,数字分区或复制因子)。
作为 "topic auto creation" 的替代方法,您还可以使用管理客户端(自 v0.10.1
起可用)来创建具有正确配置的主题。参见 https://cwiki.apache.org/confluence/display/KAFKA/KIP-4+-+Command+line+and+centralized+administrative+operations
Kafka Streams 是否内置了允许将单个输入流动态连接到多个输出流的功能? KStream.branch
允许基于 true/false 谓词的分支,但这不是我想要的。我希望每个传入的日志都确定它将在运行时流式传输到的主题,例如,日志 {"date": "2017-01-01"}
将流式传输到主题 topic-2017-01-01
并且日志 {"date": "2017-01-02"}
将流式传输进入主题 topic-2017-01-02
.
我可以在流上调用 forEach
,然后写入 Kafka 生产者,但这似乎不太优雅。在 Streams 框架内有没有更好的方法来做到这一点?
如果您想根据您的数据动态创建主题,您目前在 Kafka 的 Streaming API(v0.10.2
及更早版本)中得不到任何支持。您将需要创建一个 KafkaProducer
并自行实现动态 "routing"(例如使用 KStream#foreach()
或 KStream#process()
)。请注意,您需要进行同步写入以避免数据丢失(不幸的是,这不是很高效)。有计划使用动态主题路由扩展 Streaming API,但目前还没有此功能的具体时间表。
您还应该考虑另一件事。如果您事先不知道您的目标主题而只是依赖 so-called "topic auto creation" 功能,您应该确保这些主题是使用所需的配置设置创建的(例如,数字分区或复制因子)。
作为 "topic auto creation" 的替代方法,您还可以使用管理客户端(自 v0.10.1
起可用)来创建具有正确配置的主题。参见 https://cwiki.apache.org/confluence/display/KAFKA/KIP-4+-+Command+line+and+centralized+administrative+operations