由于InvalidClassException,Spark Kafka Streaming作业失败

时间:2016-12-14 14:58:12

标签: apache-spark apache-kafka spark-streaming cloudera apache-spark-2.0

我正在使用Kafka客户端0.8在Spark 2,CDH 5.9中运行流媒体作业。简单的目标是将信息保存在Impala中,记录下来。

我无法摆脱这个错误,因为我不知道它来自哪里:

16/12/14 08:43:28 ERROR scheduler.JobScheduler: Error running job streaming
job 1481726608000 ms.0
org.apache.spark.SparkException: Job aborted due to stage failure: Task 0 in
stage 25.0 failed 4 times, most recent failure: Lost task 0.3 in stage 25.0
(TID 132, datanode1, executor 1):
java.io.InvalidClassException: org.apache.commons.lang3.time.FastDateFormat;
local class incompatible: stream classdesc serialVersionUID = 1, 
local class serialVersionUID = 2

Direct Kafka Stream简单地由

创建
val streamingContext = new StreamingContext(spark.sparkContext, Seconds(2))
val kafkaParams = Map[String, String](
  "bootstrap.servers" -> "datanode1:9092,datanode2:9092,datanode3:9092",
  "group.id" -> "myconsumergroup",
  "auto.offset.reset" -> "largest")
val topics:Set[String] = Set("kafkatest")
val directKafkaStream  = KafkaUtils.createDirectStream[String, String, StringDecoder, StringDecoder] (streamingContext, kafkaParams, topics)

由以下人员处理:

val deviceMap = spark.read.parquet("/user/admin/temp/joinData.parquet").cache()

directKafkaStream.foreachRDD { rdd =>
  val avgData = spark.read.schema(jsonDatastruct).json(rdd.map(i => i._2)).select("data.*").as[JsonInfo]

  val deviceEnriched = avgData.join(deviceMap,Seq("COMMON_KEY"),"left")

    deviceEnriched.show(false)
    spark.sql("use my_database")
      deviceEnriched.write.mode("append").saveAsTable("tbl_persisted_kafka_stream")
}

streamingContext.start()
streamingContext.awaitTermination()

1 个答案:

答案 0 :(得分:3)

简短回答:消息是使用commons-lang3 JAR版本序列化的,与您在Spark中使用的JAR

答案很长:如果您刚刚使用Google搜索了该错误消息,那么搜索Apache Commons源代码,您就会发现...

  • this post深入研究Java“类不兼容”序列化问题,一般来说
  • FastDateFormat的源代码,说明serialVersionUID = 1LV3.1,但用V3.2切换到serialVersionUID = 2L(因为当时二进制结构发生了变化)

顺便说一句,我刚检查过,CDH 5.9在 V3.1 中附带commons-lang3(适用于Hive,Impala,Sentry,Hive-in-Oozie,Sqoop-in-Oozie )和 V3.3.2 (适用于Spark-in-Oozie)和 V3.4 (适用于Sqoop),而Spark本身根本不需要它。去图。
由于CDH尚未附带Spark 2,我猜你要么下载了“beta”包裹或Apache版本 - 我检查过,Apache版本(V2.0.2)附带commons-lang3 V3 .3.2

我的2美分:只需在你的Spark 2命令行强制--jars /opt/cloudera/parcels/CDH/jars/commons-lang3-3.1.jar,看看这是否足以解决你的问题。

编辑 额外增加2美分,确保您的“自定义”JAR优先于YARN类路径中已有的任何JAR,--conf spark.yarn.user.classpath.first=true < / p>