如何使用FlinkKafkaConsumer分别解析键<k,v>而不是<t>

时间:2018-11-15 17:12:20

标签: apache-kafka apache-flink avro flink-streaming

据我所知,通过Flink的AVRO反序列化,您可以创建Avro对象流,这很好,但是似乎存在一个问题,其中Flink的kafka使用者仅创建单个对象流: FlinkKafkaConsumerBase<T>,而不是默认的Kafka API及其KafkaConsumer。

在我的情况下,键和值都是独立的符合AVRO模式的对象,合并它们的架构可能是一场噩梦...

另外看来,使用Flink API我无法检索ConsumerRecord信息?...

1 个答案:

答案 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;
    ...
  }
}