Spark错误 - 无法将SerializedLambda实例分配给类型为FlatMapFunction的javaRDDLike字段

3

我一直在尝试在集群上启动一个简单的spring-spark应用程序,但是我发现了以下问题:

Caused by: java.lang.ClassCastException: cannot assign instance of 
java.lang.invoke.SerializedLambda to field 
org.apache.spark.api.java.JavaRDDLike$$anonfun$fn$1$1.f$3 of type 
org.apache.spark.api.java.function.FlatMapFunction in instance of 
org.apache.spark.api.java.JavaRDDLike$$anonfun$fn$1$1**

我正在尝试启动的应用程序是以下内容:
    public static void main(String[] args) {
        SparkConf conf = new SparkConf().setAppName("Test");
        conf.setJars(new String[]{"/home/ubuntu/spring-spark-word-count-master/target/spring-spark-word-count-0.0.1-SNAPSHOT.jar"});
        JavaSparkContext sc = new JavaSparkContext(conf);

        JavaRDD<String> words = sc.textFile("hdfs://master.vmware.local:8020/test/test.txt");

        JavaRDD<String> wordsFromFile = words.flatMap(s -> Arrays.asList(s.split(" ")).iterator());

        Map<String, Long> wordCounts = wordsFromFile.countByValue();
        wordCounts.forEach((k, v) -> System.out.println(k + " " + v));
        words.saveAsTextFile("hdfs://master.vmware.local:8020/test/" + String.valueOf(new Date().getTime()));
        sc.close();
    }

经过一些测试,我发现问题是由flatmap引起的。要在集群上启动应用程序,请使用以下命令:

 spark-submit "/home/ubuntu/spring-spark-word-count-master/target/spring-spark-word-count-0.0.1-SNAPSHOT.jar" 

当我在主节点本地启动应用程序时,它可以正常工作,但是当我在节点上分发时,它会出现问题。我无法理解问题可能出在哪里。下面还提供了从Ambari中提取的群集的pom和配置:

POM文件:

<dependencies>
    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-web</artifactId>
    </dependency>
    <dependency>
        <groupId>com.thoughtworks.paranamer</groupId>
        <artifactId>paranamer</artifactId>
        <version>2.8</version>
    </dependency>
    <dependency>
        <groupId>org.apache.hadoop</groupId>
        <artifactId>hadoop-client</artifactId>
        <version>3.1.1</version>
    </dependency>
    <dependency>
        <groupId>org.apache.spark</groupId>
        <artifactId>spark-core_2.12</artifactId>
        <version>2.3.0</version>
        <exclusions>
            <exclusion>
                <artifactId>hadoop-client</artifactId>
                <groupId>org.apache.hadoop</groupId>
            </exclusion>
        </exclusions>
    </dependency>
    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-test</artifactId>
        <scope>test</scope>
    </dependency>
</dependencies>

群集配置:

  • HDFS 3.1.1.3.1
  • YARN 3.1.1
  • MapReduce2 3.1.1
  • Hive 3.1.0
  • Spark2 2.3.0

确保定义lambda表达式的类在序列化lambda的运行时也是可用的。使用conf.setJars(new String[]{"/path/to/jar/with/your/class.jar"}) - undefined
我已经添加了配置,但结果还是一样的。我根据你的建议更新了帖子。 - undefined
如果我尝试使用Sparksession,会出现以下错误:_java.lang.ClassCastException: 无法将scala.collection.immutable.List$SerializationProxy的实例分配给org.apache.spark.rdd.RDD.org$apache$spark$rdd$RDD$$dependencies_类型的字段,该字段位于org.apache.spark.rdd.MapPartitionsRDD的实例中。 - undefined
我该如何验证这个? - undefined
谢谢,但是我按照你说的把jar包放在所有节点的相同路径下了,问题仍然存在。 - undefined
显示剩余2条评论
1个回答

0

这是因为Spring Boot构建JAR的方式(更多信息在此处)。

简而言之,JAR被嵌套到大型JAR中,而不像传统装配/大型JAR那样扁平化。

除了不使用Spring Boot JAR之外,我没有其他解决方案。


我不认为这是一个足够好的答案。如果Spring的jar包有完全不同的格式,那么整个Spark应用程序将会失败,甚至无法达到类型转换的阶段。肯定还有其他原因。 - undefined

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接