如何反序列化kafka内部主题__consumer_offsets数据

时间:2018-04-21 14:01:39

标签: python deserialization kafka-consumer-api

我正在尝试使用kafka-python客户端从Kafka内部主题__consumer_offsets读取数据。我创建消费者并成功获取数据,但问题是数据被序列化并且看起来像有线格式,我想将这些数据反序列化为一些可读格式,我发现kafka消费者api中有key_deserialize和value_deserialize选项但是问题是我无法弄清楚应该给这些领域带来什么价值,有人可以帮助我吗?

我的消费者代码看起来像

 consumer = KafkaConsumer(bootstrap_servers=Settings.instance().kafka_server,
                                     consumer_timeout_ms=2000,
                                     enable_auto_commit="False",
                                     exclude_internal_topics="False",
                                     value_deserializer = bytes.decode, # not working•
                                     group_id=self._group_id
                                    )

消耗的消息看起来像::

ConsumerRecord(topic='__consumer_offsets', partition=26, offset=12983, timestamp=1520765864606, timestamp_type=0, key=b'
\x00\x01\x00\x16console-consumer-56707\x00\x06events\x00\x00\x00\x00', value=b'\x00\x01\x00\x00\x00\x00\x00\x00\x00\xb6\x00\x00\x00\x00\x01b\x14\xb5\x8a\x9d\x00\x00\x01b\x19\xdb\
xe6\x9d', checksum=-1872169212, serialized_key_size=38, serialized_value_size=28)

1 个答案:

答案 0 :(得分:0)

好吧,你需要实现自定义Serializer(在生产者端)和反序列化器(在消费者端)。确保在消费者端的类路径上放置与生产者类相同的自定义值类。

public class CustomDeserializer implements Deserializer<ValueClass> {
    public CustomDeserializer() {
    }

    public void configure(Map<String, ?> map, boolean b) {
    }

    public ValueClass deserialize(String s, byte[] MessageBytes) {
        ValueClass eEventMessage = null;
        ObjectMapper objectMapper = new ObjectMapper();

        try {
            eEventMessage = (ValueClass)objectMapper.readValue(MessageBytes, ValueClass.class);
        } catch (IOException ex) {
  //               your stuffs
        }

        return eEventMessage;
    }

    public void close() {
    }
}

在消费者端属性中设置此自定义类。