我的kafka消费者代码中有以下行。
val lines = KafkaUtils.createStream(ssc, zkQuorum, group, topicpMap).map(_._2)
如何对此流进行反序列化" line"成原始对象?通过将类扩展为serialisable,可以在kafka生成器中实现Serialisability。我正在使用scala在spark中实现它。
答案 0 :(得分:1)
您需要实现自定义Decoder,并将期望的类型信息与解码器一起提供给createStream函数。
KafkaUtils.createStream[KeyType, ValueType, KeyDecoder, ValueDecoder] (...)
例如,如果您使用String
作为键,CustomContainer
作为值,则您的流创建将如下所示:
val stream = KafkaUtils.createStream[String, CustomContainer, StringDecoder, CustomContainerDecoder](...)
鉴于您正在将消息作为new KeyedMessage[String,String]
附加到kafka,正确的解码器就是这样的字符串解码器:
KafkaUtils.createStream[String, String, StringDecoder, StringDecoder](topic,...)
将为您提供DStream[String,String]
作为处理的基础。
如果您想发送/接收特定的对象类型,则需要为其实施Kafka Encoder和Decoder。
幸运的是,PcapPacket
已经实现了您执行此操作所需的方法:
PcapPacket - > byte []:public int transferStateAndDataTo(byte[] buffer)
byte [] - > PcapPacket:public PcapPacket(byte[] buffer)
其余部分是用于实现Kafka所需的编码器/解码器接口的样板代码。