Spark Streaming - 如何从foreachRDD函数中获得结果?

时间:2017-07-12 00:21:34

标签: scala apache-spark spark-streaming dstream

我尝试使用Spark Streaming阅读Kafka消息,进行一些计算并将结果发送到另一个进程。

val jsonObject = new JSONObject

val stream = KafkaUtils.createDirectStream[String, String, StringDecoder, StringDecoder](
  ssc, kafkaParams, topicsSet)

stream.foreachRDD { rdd => {
  val jsonDF = spark.read.json(rdd.map(_._2))
  val res = jsonDF.groupBy("artist").count.sort(col("count").desc).take(10)
  /*Some Transformations => create jsonArray*/
  jsonObject.put("Key", jsonArray)
}}

ssc.start()

我需要为我的需求积累JSONObject(全局变量)。 put操作会抛出NotSerializable异常。

  

java.io.NotSerializableException:org.apache.spark.streaming.kafka.DirectKafkaInputDStream的对象$ MappedDStream可能作为RDD操作关闭的一部分进行序列化。这是因为正在从闭包内引用DStream对象。请在此DStream中重写RDD操作以避免这种情况。这已被强制执行,以避免使用不必要的对象使Spark任务膨胀。

是否可以将此jsonArray发送出此foreahRDD块?我不想写入文件或数据库。

0 个答案:

没有答案