用Scala编写的快照作业会异常终止: java.lang.ClassCastException:com ..... $ Class1无法转换为com ..... $ Class1。
Class1是自定义类,存储在RDD中。有趣的是,在投射相同的类时会抛出此错误。到目前为止,尚未找到任何模式。
在这项工作中,我们从hbase获取数据,使用数据框使用分析元数据丰富数据,并将其推入SnappyData中的表。我们正在使用Snappydata 1.2.0.1。
不确定为什么会这样。
下面是堆栈跟踪: 作业由于阶段失败而中止:阶段42.0中的任务76失败了4次,最近一次失败:阶段42.0中的任务76.3丢失(TID 3550,HostName,执行者XX.XX.x.xxx(10360):7872):java.lang .ClassCastException:无法转换为 在org.apache.spark.sql.catalyst.expressions.GeneratedClass $ GeneratedIterator.processNext(Generated.java:86) 在org.apache.spark.sql.execution.BufferedRowIterator.hasNext(BufferedRowIterator.java:43) 在org.apache.spark.sql.execution.WholeStageCodegenRDD $$ anon $ 2.hasNext(WholeStageCodegenExec.scala:571) 在org.apache.spark.sql.execution.WholeStageCodegenRDD $$ anon $ 1.hasNext(WholeStageCodegenExec.scala:514) 在org.apache.spark.sql.execution.columnar.InMemoryRelation $$ anonfun $ 1 $$ anon $ 1.hasNext(InMemoryRelation.scala:132) 在org.apache.spark.storage.memory.MemoryStore.putIteratorAsValues(MemoryStore.scala:233) 在org.apache.spark.storage.BlockManager $$ anonfun $ doPutIterator $ 1.apply(BlockManager.scala:1006) 在org.apache.spark.storage.BlockManager $$ anonfun $ doPutIterator $ 1.apply(BlockManager.scala:997) 在org.apache.spark.storage.BlockManager.doPut(BlockManager.scala:936) 在org.apache.spark.storage.BlockManager.doPutIterator(BlockManager.scala:997) 在org.apache.spark.storage.BlockManager.getOrElseUpdate(BlockManager.scala:700) 在org.apache.spark.rdd.RDD.getOrCompute(RDD.scala:335) 在org.apache.spark.rdd.RDD.iterator(RDD.scala:286) 在org.apache.spark.rdd.MapPartitionsRDD.compute(MapPartitionsRDD.scala:41) 在org.apache.spark.rdd.RDD.computeOrReadCheckpoint(RDD.scala:324) 在org.apache.spark.rdd.RDD.iterator(RDD.scala:288) 在org.apache.spark.sql.execution.WholeStageCodegenRDD.computeInternal(WholeStageCodegenExec.scala:557) 在org.apache.spark.sql.execution.WholeStageCodegenRDD $$ anon $ 1。(WholeStageCodegenExec.scala:504) 在org.apache.spark.sql.execution.WholeStageCodegenRDD.compute(WholeStageCodegenExec.scala:503) 在org.apache.spark.rdd.RDD.computeOrReadCheckpoint(RDD.scala:324) 在org.apache.spark.rdd.RDD.iterator(RDD.scala:288) 在org.apache.spark.rdd.MapPartitionsRDD.compute(MapPartitionsRDD.scala:41) 在org.apache.spark.rdd.RDD.computeOrReadCheckpoint(RDD.scala:324) 在org.apache.spark.rdd.RDD.iterator(RDD.scala:288) 在org.apache.spark.scheduler.ShuffleMapTask.runTask(ShuffleMapTask.scala:103) 在org.apache.spark.scheduler.ShuffleMapTask.runTask(ShuffleMapTask.scala:58) 在org.apache.spark.scheduler.Task.run(Task.scala:126) 在org.apache.spark.executor.Executor $ TaskRunner.run(Executor.scala:326) 在java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1149) 在java.util.concurrent.ThreadPoolExecutor $ Worker.run(ThreadPoolExecutor.java:624) 在org.apache.spark.executor.SnappyExecutor $$ anon $ 2 $$ anon $ 3.run(SnappyExecutor.scala:57) 在java.lang.Thread.run(Thread.java:748)
答案 0 :(得分:1)
类在名称上不是唯一的。它们在名称和类加载器上是唯一的。
当您在应用的各个部分之间传递数据时,您会看到这种类型的ClassCastException,其中一个或两个部分都在单独的类加载器中加载。
您可能需要清理类路径,可能需要从同一类加载器解析类,或者可能必须序列化数据(特别是如果您具有依赖于在运行时重新加载代码的功能)。