我尝试使用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块?我不想写入文件或数据库。