我前一段时间使用过Hazelcast,而且我是第一次使用Hazelcast Jet,对于处理一些实时流媒体,进行探索似乎很有趣。
在这种情况下,我正在使用以下方法将Kafka topic
拉到IMap
:
private static Pipeline buildPipelineForClientDataa() {
Pipeline p = Pipeline.create();
p.drawFrom(KafkaSources.kafka(
props("bootstrap.servers", BOOTSTRAP_SERVERS,
"key.deserializer", StringDeserializer.class.getCanonicalName(),
"value.deserializer", StringDeserializer.class.getCanonicalName(),
"auto.offset.reset", AUTO_OFFSET_RESET),
KAFKA_TOPIC))
.withoutTimestamps()
.drainTo(Sinks.map(SINK_CLINET_DATA));
return p;
}
好吧,我没有主题的钥匙。我应该可以选择将滚动编号指定为密钥吗?如果是这样,请帮助我进行这项技术。谢谢。
答案 0 :(得分:0)
使用递增编号不是Jet的理想选择,因为它是分布式系统。它适用于分区流,每个流分区都应独立。您将需要通过非并行处理器路由所有项目。
您可以使用UUID
或Hazelcast的FlakeIdGenerator
作为键,但是如果作业重新启动并从快照偏移量重新处理Kafka主题,则相同的项目将分配不同的键,并且将在目标地图中出现两次。
如果要在地图中包含每个项目,则可以使用Kafka的topic + partitionId + offset组合作为键:
p.drawFrom(KafkaSources.kafka(
props(...),
record -> Util.entry(
Tuple3.tuple3(record.topic(), record.partition(), record.offset()),
record.value()),
KAFKA_TOPIC))
如果只有一个主题,则可以省略该主题。