据我所知,通过Flink的AVRO反序列化,您可以创建Avro对象流,这很好,但是似乎存在一个问题,其中Flink的kafka使用者仅创建单个对象流:
FlinkKafkaConsumerBase<T>
,而不是默认的Kafka API及其KafkaConsumer。
在我的情况下,键和值都是独立的符合AVRO模式的对象,合并它们的架构可能是一场噩梦...
另外看来,使用Flink API我无法检索ConsumerRecord信息?...
答案 0 :(得分:2)
基于Flink Kafka Consumer,有一个构造函数:
public FlinkKafkaConsumer(String topic, KeyedDeserializationSchema<T> deserializer, Properties props) {
this(Collections.singletonList(topic), deserializer, props);
}
第二个参数-KeyedDeserializationSchema
用于反序列化Kafka记录。它包括消息密钥,消息值,偏移量,主题等。因此,您可以使用Avro密钥和其中的Avro值来实现自己的名为MyKafkaRecord
的类型为T。然后将MyKafkaRecord
作为T
传递到KeyedDeserializationSchema
的实现中。请以TypeInformationKeyValueSerializationSchema
为例。
例如从卡夫卡阅读更多信息:
class KafkaRecord<K, V> {
private K key;
private V value;
private long offset;
private int partition;
private String topic;
...
}
class MySchema<K, V> implements KeyedDeserializationSchema<KafkaRecord<K, V>> {
KafkaRecord<K, V> deserialize(byte[] messageKey, byte[] message, String topic, int partition, long offset) {
KafkaRecord<K, V> rec = new KafkaRecord<>();
rec.key = KEY_DESERIaLISER.deserialize(messageKey);
rec.value = ...;
rec.topic = topic;
...
}
}