我正在使用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()
答案 0 :(得分:3)
简短回答:消息是使用commons-lang3
JAR版本序列化的,
答案很长:如果您刚刚使用Google搜索了该错误消息,那么搜索Apache Commons源代码,您就会发现...
FastDateFormat
的源代码,说明serialVersionUID = 1L
到V3.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>