我正在学习Kafka Streams并尝试实现以下目标:
创建了2个Kafka主题(比如topic1,topic2),其中null为键,JSONString为value。来自topic1的数据(无重复项)在topic2中具有多个匹配条目。即topic1有一些主流数据在与topic2结合时生成新的多数据流。
示例:
topic1={"name": "abc", "age":2}, {"name": "xyz", "age":3} and so on.
topic2={"name": "abc", "address"="xxxxxx"}, {"name": "abc", "address"="yyyyyy"}, {"name": "xyz", "address"="jjjjjj"}, {"name": "xyz", "address"="xxxkkkkk"}
预期输出:{"name": "abc", "age":2, "address"="xxxxxx"}, {"name": "abc", "age":2, "address"="yyyyyy"}, {"name": "xyz", "age":3, "address"="jjjjjj"}, {"name": "xyz", "age":3, "address"="xxxkkkkk"}
想要保留/保存来自topic1的数据流以供将来引用,而来自topic2的数据流仅用于实现上述用例,并且不需要任何持久性/阻止。
我几乎没有问题: 1)应该保存/存储topic1数据流几天(可能?),以便可以连接来自topic2的传入数据流。可能吗? 2)我应该用什么来实现这个目标,KStream或KTable? 3)这被称为背压机制吗?
Kafka Stream是否支持此用例,还是应该注意其他用途?请注意,建议。
我用KStream尝试了一段代码,窗口是5分钟,但看起来我无法在流中保存topic1数据。
请帮助我做出正确的选择并加入。我正在使用Confluent中的Kafka和Docker实例。
public void run() {
final StreamsBuilder builder = new StreamsBuilder();
final Serde<JsonNode> jsonSerde = Serdes.serdeFrom(new JsonSerializer(), new JsonDeserializer());
final Consumed<String, JsonNode> consumed = Consumed.with(Serdes.String(), jsonSerde);
// Hold data from this topic to 30 days
KStream<String, JsonNode> cs = builder.stream("topic1", consumed);
cs.foreach((k,v) -> {
System.out.println( k + " --->" + v);
});
// Data is involved in one time process.
KStream<String, JsonNode> css = builder.stream("topic2", consumed);
css.foreach((k,v) -> {
System.out.println( k + " --->" + v);
});
KStream<String, JsonNode> resultStream = cs.leftJoin(css,
valueJoiner,
JoinWindows.of(TimeUnit.MINUTES.toMillis(5)),
Joined.with(
Serdes.String(), /* key */
jsonSerde, /* left value */
jsonSerde) /* right value */
);
resultStream.foreach((k, v) -> {
System.out.println("JOIN STREAM: KEY="+k+ ", VALUE=" + v);
});
KafkaStreams streams = new KafkaStreams(builder.build(), properties);
streams.start();
}
答案 0 :(得分:3)
加入卡夫卡总是基于钥匙。因此,要使任何连接起作用,您需要在执行实际连接之前将要加入的字段提取到键中(唯一的部分例外是KStream-GlobalKTable连接)。在您的代码示例中,您不会获得任何结果,因为所有记录都有Select *, (SELECT count(EmployeeID) as Count WHERE Employee.CompanyID = CompanyID) as employeeCount from Company
密钥,因此无法加入。
对于连接本身,似乎KStream-KTable连接对于您的用例来说是正确的选择。要完成这项工作,您需要:
null
正确设置了加入密钥,并将数据写入其他主题(让我们称之为topic1
)topic1Keyed
作为表格topic1Keyed
topic2
topic2
醇>
有关加入语义的完整详细信息,请查看此博文:https://www.confluent.io/blog/crossing-streams-joins-apache-kafka/