Hazelcast Jet是否支持以Kafka为来源的滚动号作为IMap密钥?

时间:2019-05-02 07:01:32

标签: hazelcast hazelcast-imap hazelcast-jet

我前一段时间使用过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;
    }

好吧,我没有主题的钥匙。我应该可以选择将滚动编号指定为密钥吗?如果是这样,请帮助我进行这项技术。谢谢。

1 个答案:

答案 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))

如果只有一个主题,则可以省略该主题。