如何有效地使用Spark(使用Scala)阅读Kafka主题中的每条消息?

时间:2019-04-08 10:00:00

标签: scala apache-spark apache-kafka

我的任务是读取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中每条消息的有效方法?

0 个答案:

没有答案