我正在尝试使用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)
答案 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() {
}
}
在消费者端属性中设置此自定义类。