Java 从ApacheFlink中的Kafka头读取数据的方法

Java 从ApacheFlink中的Kafka头读取数据的方法,java,apache-kafka,apache-flink,Java,Apache Kafka,Apache Flink,我有一个项目,我正在使用卡夫卡的数据。显然,有几个字段将包含在标题中,我也需要为每条消息阅读这些字段。目前在弗林克有没有办法做到这一点 谢谢 @Jicaar,实际上,卡夫卡从版本0.11.0.0开始就添加了Header概念 问题在于flink-1.4.0附带的flink-connector-kafka-0.11_2.11,据说它支持kafka-0.11.0从kafka读取时忽略消息头 所以不幸的是,除非您在flin中实现自己的KafkaConsumer,否则无法读取这些标题 我对卡夫卡消息头中的

我有一个项目,我正在使用卡夫卡的数据。显然,有几个字段将包含在标题中,我也需要为每条消息阅读这些字段。目前在弗林克有没有办法做到这一点


谢谢

@Jicaar,实际上,卡夫卡从版本
0.11.0.0
开始就添加了
Header
概念

问题在于
flink-1.4.0
附带的
flink-connector-kafka-0.11_2.11
,据说它支持
kafka-0.11.0
从kafka读取时忽略消息头

所以不幸的是,除非您在flin中实现自己的KafkaConsumer,否则无法读取这些标题


我对卡夫卡消息头中的readin也很感兴趣,希望Flink团队能对此提供支持

我也遇到了类似的问题,并在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);
flinkkafaconsumer=新的flinkkafaconsumer(“主题”,新的JSONKeyValueDeserializationSchema(true){
ObjectMapper mapper=新的ObjectMapper();
@凌驾
public ObjectNode反序列化(ConsumerRecord记录)引发异常{
ObjectNode结果=超级。反序列化(记录);
if(record.headers()!=null){
Map headers=StreamSupport.stream(record.headers().spliterator(),false).collect(Collectors.toMap(h->h.key(),h->(JsonNode)this.mapper.convertValue(新字符串(h.value()),JsonNode.class));
set(“headers”,mapper.convertValue(headers,JsonNode.class));
}
返回结果;
}
},卡夫卡普洛斯);

希望这有帮助

您也可以自己实现
KafkaDeserializationSchema
而不是重写
JSONKeyValueDeserializationSchema