我能够以String的形式将我的数据保存到Kafka:
val producerSettings = ProducerSettings(actorSystem, new StringSerializer, new StringSerializer)
.withBootstrapServers("localhost:9092")
def kafkaSink(source: Source[ModbusMessage, NotUsed]) = source.map(a => s"Id:${a.sensorId}:Values:${a.values.mkString(",")}").map { m =>
new ProducerRecord[String, String]("sampleData", m)
}.
runWith(Producer.plainSink(producerSettings))
,但有没有办法将我的case类直接保存到Kafka中。就像我想以My case类ModbusMessage的形式保存我的数据。
如果有人可以为我提供一个很棒的例子,那就很棒!
感谢。 感谢帮助!
答案 0 :(得分:2)
Kafka的数据消息模型(由消息密钥和消息值组成)基于密钥和值的原始字节(byte[]
)。因此,您需要提供一个序列化程序,将您的案例类转换为byte[]
。在上面的示例中,您已为键和值配置了使用StringSerializer
,序列化程序会转换String -> byte[]
。
但有没有办法将我的case类直接保存到Kafka中。就像我想以My case类ModbusMessage的形式保存我的数据。
如果您有案例类ModbusMessage
,则需要实施+配置ModbusMessage -> byte[]
序列化程序。您可以自己实现这样的序列化程序,但正如其他人对您的问题发表评论一样,您也可以选择序列化框架,例如Avro或Protobuf。您可能还想查看例如https://github.com/scala/pickling
我是否需要使用类似liftJson的库将其转换为Json,然后将其保存为Kafka中的String?
不,你不需要。您可以 - 并且很可能也应该 - 直接从您的案例类ModbusMessage
转换为byte[]
(并且,对于反序列化,在相反的方向)。将您的案例类首先转换为JSON没有意义,因为JSON表示也必须序列化为byte[]
,以便可以将其发送到Kafka(因此您需要两次这里的转换成本。)