我想将DStream发送给Kafka,但它仍然没有用。
searchWordCountsDStream.foreachRDD(rdd =>
rdd.foreachPartition(
partitionOfRecords =>
{
val props = new HashMap[String, Object]()
props.put(ProducerConfig.BOOTSTRAP_SERVERS_CONFIG, outbroker)
props.put(ProducerConfig.VALUE_SERIALIZER_CLASS_CONFIG,
"org.apache.kafka.common.serialization.StringSerializer")
props.put(ProducerConfig.KEY_SERIALIZER_CLASS_CONFIG,
"org.apache.kafka.common.serialization.StringSerializer")
val producer = new KafkaProducer[String,String](props)
partitionOfRecords.foreach
{
case (x:String,y:String)=>{
println(x)
val message=new ProducerRecord[String, String](outtopic,null,x)
producer.send(message)
}
}
producer.close()
})
)
这是一些错误信息:
16/10/31 14:44:15错误StreamingContext:启动上下文时出错, 将其标记为已停止java.io.NotSerializableException:DStream 检查点已启用,但DStreams具有其功能 不可序列化的spider.app.job.MeetMonitor序列化堆栈: - 对象不可序列化(类:spider.app.job.MeetMonitor,值:spider.app.job.MeetMonitor@433c6abb) - field(类:spider.app.job.MeetMonitor $$ anonfun $ createContext $ 2,name:$ outer,type:class spider.app.job.MeetMonitor) - object(类spider.app.job.MeetMonitor $$ anonfun $ createContext $ 2,) - field(类:org.apache.spark.streaming.dstream.DStream $$ anonfun $ foreachRDD $ 1 $$ anonfun $ apply $ mcV $ sp $ 3, name:cleaningF $ 1,输入:interface scala.Function1) - object(类org.apache.spark.streaming.dstream.DStream $$ anonfun $ foreachRDD $ 1 $$ anonfun $ apply $ mcV $ sp $ 3, ) - writeObject数据(类:org.apache.spark.streaming.dstream.DStream) - object(类org.apache.spark.streaming.dstream.ForEachDStream,org.apache.spark.streaming.dstream.ForEachDStream@3ac3f6f) - writeObject数据(类:org.apache.spark.streaming.dstream.DStreamCheckpointData) - object(类org.apache.spark.streaming.dstream.DStreamCheckpointData,[0 检查点文件
]) - writeObject数据(类:org.apache.spark.streaming.dstream.DStream) - object(类org.apache.spark.streaming.dstream.ForEachDStream,org.apache.spark.streaming.dstream.ForEachDStream@6f9c5048) - 数组元素(索引:0) - array(class [Ljava.lang.Object;,size 16) - field(类:scala.collection.mutable.ArrayBuffer,name:array,type:class [Ljava.lang.Object;) - object(类scala.collection.mutable.ArrayBuffer,ArrayBuffer(org.apache.spark.streaming.dstream.ForEachDStream@6f9c5048, org.apache.spark.streaming.dstream.ForEachDStream@3ac3f6f)) - writeObject数据(类:org.apache.spark.streaming.dstream.DStreamCheckpointData) - object(类org.apache.spark.streaming.dstream.DStreamCheckpointData,[0 检查点文件
])
答案 0 :(得分:1)
我遇到了同样的问题并在这里找到了答案
https://forums.databricks.com/questions/382/why-is-my-spark-streaming-application-throwing-a-n.html
似乎使用带有foreachRDD的检查点会导致问题。在我的代码中删除检查点后,一切都很好。
P / S。我只是想发表评论,但我没有足够的声誉这样做。
答案 1 :(得分:0)
我一直在使用Spark 2.3.0版本并遇到同样的问题,我只是通过为它抛出错误的类实现Serializable接口来解决它。
在你的情况下,spider.app.job.MeetMonitor应该实现它:。
公共类MeetMonitor实现了Serializable {
// ... }
如果您在课堂上使用Logger,请注意,它的实例也不可序列化,因此可能导致同样的问题。 这也可以通过将其定义为:
来解决private static final Logger logger = Logger.getLogger(.class);