我的任务是读取Kafka主题中具有3个分区的每条消息。我有Spark和Scala作为实现此目的的工具。
到目前为止,我有以下代码:
val kafkaStream = KafkaUtils.createDirectStream[String, String](ssc, LocationStrategies.PreferConsistent, ConsumerStrategies.Subscribe
[String, String](cdrTopic, kafkaParams))
kafkaStream.foreachRDD { rdd => {
if (!rdd.isEmpty()) {
rdd.foreachPartition(iterator => {
while (iterator.hasNext) {
val partition = iterator.next().value().split("\\n")
if (!partition.isEmpty) {
partition.foreach(string => {
if (!string.isEmpty) {
//process every message here
}
})
}
println("no partition data")
}
})
}
println("no rdd data to process")
}
}
每条消息都是我需要解析并保存到db的tsv(制表符分隔的值)字符串。
我认为这是非常低效的,因为我正在使用4个循环,并且由于写入db的消息数量非常低,我认为某些数据正在丢失。
我使用的是Scala 2.11.12版,spark-streaming 2.4.0,spark-streaming-kafka 2.4.0。
是否有使用Spark读取和解析kafka中每条消息的有效方法?