【问题标题】:java.lang.ClassCastException: cannot assign instance of java.lang.invoke.SerializedLambda to field org.apache.spark.api.java.JavaPairRDDjava.lang.ClassCastException:无法将 java.lang.invoke.SerializedLambda 的实例分配给字段 org.apache.spark.api.java.JavaPairRDD
【发布时间】:2019-04-04 04:51:06
【问题描述】:

以下是我的简单代码。当我在 Spark Local 模式下运行它时,它运行完美。但是当我尝试使用 1 个驱动程序和 1 个工作人员在集群模式下运行它时,它给了我以下异常。

我尝试了一些答案中提到的 setJars,但它没有帮助我。

public static void main(String[] args) throws IOException {

        SparkConf conf = new SparkConf().setAppName("example.ClusterPractice").setMaster("spark://192.168.42.18:7077");
        conf.setJars(new String[]{"E:\\Eclipses\\neon new projects\\eclipse\\neon new projects\\spark-practice\\out\\artifacts\\spark_practice_jar\\spark-practice.jar"});

        JavaSparkContext sc = new JavaSparkContext(conf);

        JavaRDD<Integer> numbers = sc.parallelize(Arrays.asList(1, 2, 3));

        System.out.println("Reduce");
        long total = numbers.reduce((n1,n2)-> n1+n2);
        System.out.println(total);
    }

我得到的异常如下:

驱动程序堆栈跟踪: 在 org.apache.spark.scheduler.DAGScheduler.org$apache$spark$scheduler$DAGScheduler$$failJobAndIndependentStages(DAGScheduler.scala:1602) 在 org.apache.spark.scheduler.DAGScheduler$$anonfun$abortStage$1.apply(DAGScheduler.scala:1590) 在 org.apache.spark.scheduler.DAGScheduler$$anonfun$abortStage$1.apply(DAGScheduler.scala:1589) 在 scala.collection.mutable.ResizableArray$class.foreach(ResizableArray.scala:59) 在 scala.collection.mutable.ArrayBuffer.foreach(ArrayBuffer.scala:48) 在 org.apache.spark.scheduler.DAGScheduler.abortStage(DAGScheduler.scala:1589) 在 org.apache.spark.scheduler.DAGScheduler$$anonfun$handleTaskSetFailed$1.apply(DAGScheduler.scala:831) 在 org.apache.spark.scheduler.DAGScheduler$$anonfun$handleTaskSetFailed$1.apply(DAGScheduler.scala:831) 在 scala.Option.foreach(Option.scala:257) 在 org.apache.spark.scheduler.DAGScheduler.handleTaskSetFailed(DAGScheduler.scala:831) 在 org.apache.spark.scheduler.DAGSchedulerEventProcessLoop.doOnReceive(DAGScheduler.scala:1823) 在 org.apache.spark.scheduler.DAGSchedulerEventProcessLoop.onReceive(DAGScheduler.scala:1772) 在 org.apache.spark.scheduler.DAGSchedulerEventProcessLoop.onReceive(DAGScheduler.scala:1761) 在 org.apache.spark.util.EventLoop$$anon$1.run(EventLoop.scala:48) 在 org.apache.spark.scheduler.DAGScheduler.runJob(DAGScheduler.scala:642) 在 org.apache.spark.SparkContext.runJob(SparkContext.scala:2034) 在 org.apache.spark.SparkContext.runJob(SparkContext.scala:2131) 在 org.apache.spark.rdd.RDD$$anonfun$reduce$1.apply(RDD.scala:1029) 在 org.apache.spark.rdd.RDDOperationScope$.withScope(RDDOperationScope.scala:151) 在 org.apache.spark.rdd.RDDOperationScope$.withScope(RDDOperationScope.scala:112) 在 org.apache.spark.rdd.RDD.withScope(RDD.scala:363) 在 org.apache.spark.rdd.RDD.reduce(RDD.scala:1011) 在 org.apache.spark.api.java.JavaRDDLike$class.reduce(JavaRDDLike.scala:385) 在 org.apache.spark.api.java.AbstractJavaRDDLike.reduce(JavaRDDLike.scala:45) 在 example.ClusterPractice.main(ClusterPractice.java:22) 原因:java.lang.ClassCastException:无法将 java.lang.invoke.SerializedLambda 的实例分配给 org.apache.spark 类型的字段 org.apache.spark.api.java.JavaPairRDD$$anonfun$toScalaFunction2$1.fun$2。 org.apache.spark.api.java.JavaPairRDD$$anonfun$toScalaFunction2$1 实例中的 api.java.function.Function2 在 java.io.ObjectStreamClass$FieldReflector.setObjFieldValues(ObjectStreamClass.java:2133) 在 java.io.ObjectStreamClass.setObjFieldValues(ObjectStreamClass.java:1305) 在 java.io.ObjectInputStream.defaultReadFields(ObjectInputStream.java:2251) 在 java.io.ObjectInputStream.readSerialData(ObjectInputStream.java:2169) 在 java.io.ObjectInputStream.readOrdinaryObject(ObjectInputStream.java:2027) 在 java.io.ObjectInputStream.readObject0(ObjectInputStream.java:1535) 在 java.io.ObjectInputStream.defaultReadFields(ObjectInputStream.java:2245) 在 java.io.ObjectInputStream.readSerialData(ObjectInputStream.java:2169) 在 java.io.ObjectInputStream.readOrdinaryObject(ObjectInputStream.java:2027) 在 java.io.ObjectInputStream.readObject0(ObjectInputStream.java:1535) 在 java.io.ObjectInputStream.defaultReadFields(ObjectInputStream.java:2245) 在 java.io.ObjectInputStream.readSerialData(ObjectInputStream.java:2169) 在 java.io.ObjectInputStream.readOrdinaryObject(ObjectInputStream.java:2027) 在 java.io.ObjectInputStream.readObject0(ObjectInputStream.java:1535) 在 java.io.ObjectInputStream.defaultReadFields(ObjectInputStream.java:2245) 在 java.io.ObjectInputStream.readSerialData(ObjectInputStream.java:2169) 在 java.io.ObjectInputStream.readOrdinaryObject(ObjectInputStream.java:2027) 在 java.io.ObjectInputStream.readObject0(ObjectInputStream.java:1535) 在 java.io.ObjectInputStream.readObject(ObjectInputStream.java:422) 在 org.apache.spark.serializer.JavaDeserializationStream.readObject(JavaSerializer.scala:75) 在 org.apache.spark.serializer.JavaSerializerInstance.deserialize(JavaSerializer.scala:114) 在 org.apache.spark.scheduler.ResultTask.runTask(ResultTask.scala:80) 在 org.apache.spark.scheduler.Task.run(Task.scala:109) 在 org.apache.spark.executor.Executor$TaskRunner.run(Executor.scala:345) 在 java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1142) 在 java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:617) 在 java.lang.Thread.run(Thread.java:748)

【问题讨论】:

    标签: apache-spark


    【解决方案1】:

    以上程序完美运行。

    问题在于构建 jar。所以不要怀疑程序只关注 jar 是否正确构建。

    就我而言,我使用的是 Intellij。我正在从构建选项构建工件,我认为由于它是 maven 项目,jar 没有正确构建。

    所以,当我做 maven build jar 正确构建并且程序运行顺利时。

    【讨论】:

    • 您能否更详细地解释一下您是如何在 Java 项目中为 Spark 构建 jar 的?
    【解决方案2】:

    你可以找到你的问题的详细答案here

    您似乎正在删除使用

    设置的罐子

    conf.setJars(new String[]{"E:\\Eclipses\\neon new projects\\eclipse\\neon new projects\\spark-practice\\out\\artifacts\\spark_practice_jar\\spark-practice.jar"});

    根据这一行的配置

    conf.setJars(new String[]{""});

    删除此行即可。

    【讨论】:

    • 感谢您的及时回复。对不起,那条线被错误地放在那里。但删除后也是如此。它不工作。
    • 此回复是针对更新前的原始问题。为什么从可以接受变成不可以接受?
    猜你喜欢
    • 2018-03-19
    • 1970-01-01
    • 2017-02-18
    • 1970-01-01
    • 2020-06-30
    • 1970-01-01
    • 2020-02-01
    • 1970-01-01
    • 2020-07-20
    相关资源
    最近更新 更多