在Apache Flink中从Kafka头读取数据的方法

时间:2017-11-29 17:19:52

标签: java apache-kafka apache-flink

我有一个项目,我从Kafka消费数据。显然,有几个字段将包含在标题中,我还需要为每条消息阅读。有没有办法在Flink目前这样做?

谢谢!

3 个答案:

答案 0 :(得分:2)

@Jicaar,实际上Kafka自版本Header以来添加了0.11.0.0概念。 https://issues.apache.org/jira/browse/KAFKA-4208

问题是flink-connector-kafka-0.11_2.11附带flink-1.4.0,据说支持kafka-0.11.0.0只是在从kafka读取时忽略了邮件标头。

所以很遗憾,除非你在flin中实现自己的KafkaConsumer,否则无法读取这些标题。

我也对kafka邮件标题中的readin感兴趣,并希望Flink团队将为此添加支持。

答案 1 :(得分:1)

我遇到了类似的问题,并在Flink 1.8中找到了解决此问题的方法。这是我写的:

FlinkKafkaConsumer<ObjectNode> consumer = new FlinkKafkaConsumer("topic", new JSONKeyValueDeserializationSchema(true){
    ObjectMapper mapper = new ObjectMapper();
    @Override
    public ObjectNode deserialize(ConsumerRecord<byte[], byte[]> record) throws Exception {
        ObjectNode result = super.deserialize(record);
        if (record.headers() != null) {
            Map<String, JsonNode> headers = StreamSupport.stream(record.headers().spliterator(), false).collect(Collectors.toMap(h -> h.key(), h -> (JsonNode)this.mapper.convertValue(new String(h.value()), JsonNode.class)));
            result.set("headers", mapper.convertValue(headers, JsonNode.class));
        }

        return result;
    }
}, kafkaProps);

希望这会有所帮助!

答案 2 :(得分:0)

在更多地观察卡夫卡时,卡夫卡实际上并没有头球。你可以看到元数据,但它不是一回事。