apache spark中的无效类异常

Posted

技术标签:

【中文标题】apache spark中的无效类异常【英文标题】:Invalid class exception in apache spark 【发布时间】:2017-08-09 10:26:56 【问题描述】:

我正在尝试使用 spark-submit 运行 spark 作业。当我在 Eclipse 中运行它时,作业运行没有任何问题。当我将相同的 jar 文件复制到远程机器并在那里运行作业时,我得到以下问题

17/08/09 10:19:15 WARN TaskSetManager: Lost task 0.0 in stage 0.0 (TID 0, ip-10-50-70-180.ec2.internal): java.io.InvalidClassException: org.apache.spark.executor.TaskMetrics; local class incompatible: stream classdesc serialVersionUID = -2231953621568687904, local class serialVersionUID = -6966587383730940799
at java.io.ObjectStreamClass.initNonProxy(ObjectStreamClass.java:616)
at java.io.ObjectInputStream.readNonProxyDesc(ObjectInputStream.java:1829)
at java.io.ObjectInputStream.readClassDesc(ObjectInputStream.java:1713)
at java.io.ObjectInputStream.readOrdinaryObject(ObjectInputStream.java:1986)
at java.io.ObjectInputStream.readObject0(ObjectInputStream.java:1535)
at java.io.ObjectInputStream.defaultReadFields(ObjectInputStream.java:2231)
at java.io.ObjectInputStream.readSerialData(ObjectInputStream.java:2155)
at java.io.ObjectInputStream.readOrdinaryObject(ObjectInputStream.java:2013)
at java.io.ObjectInputStream.readObject0(ObjectInputStream.java:1535)
at java.io.ObjectInputStream.readObject(ObjectInputStream.java:422)
at org.apache.spark.serializer.JavaDeserializationStream.readObject(JavaSerializer.scala:75)
at org.apache.spark.serializer.JavaSerializerInstance.deserialize(JavaSerializer.scala:114)
at org.apache.spark.executor.Executor$TaskRunner.run(Executor.scala:253)
at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1142)
at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:617)
at java.lang.Thread.run(Thread.java:745)

我在 SO 中看到了一些其他链接并尝试了以下

    将 spark jars 的版本从我之前使用的 2.10 更改为 2.11。现在 pom 中的依赖是这样的

     <dependency>
        <groupId>org.apache.spark</groupId>
        <artifactId>spark-core_2.11</artifactId>
        <version>2.0.2</version>
        <scope>provided</scope>
    
    </dependency>
    
    <dependency>
        <groupId>org.apache.spark</groupId>
        <artifactId>spark-sql_2.11</artifactId>
        <version>2.0.2</version>
        <scope>provided</scope>
    </dependency>
    
    <!-- https://mvnrepository.com/artifact/org.apache.spark/spark-yarn_2.10 -->
    <dependency>
        <groupId>org.apache.spark</groupId>
        <artifactId>spark-yarn_2.11</artifactId>
        <version>2.0.2</version>
        <scope>provided</scope>
    </dependency>
    
    <dependency>
        <groupId>org.apache.spark</groupId>
        <artifactId>spark-mllib_2.11</artifactId>
        <version>2.0.2</version>
        <scope>provided</scope>
    </dependency>
    

    我还检查了 2.11-2.0.2 版本是否存在于 spark 的 jars 文件夹中,如几个链接中所建议的那样。

    我还按照几个链接的建议在依赖项中添加了提供

以上都没有帮助。当我陷入这个问题时,任何帮助都会有很大帮助。提前致谢。干杯

编辑 1:这是 spark-submit 命令

spark-submit --deploy-mode cluster --class "com.abc.ingestion.GenericDeviceIngestionSpark" /home/hadoop/sathiya/spark_driven_ingestion-0.0.1-SNAPSHOT-jar-with-dependencies.jar "s3n://input-bucket/input-file.csv" "SIT" "accessToken" "UNKNOWN" "bundleId" "["idType":"D_ID","idOrder":1,"isPrimary":true,"idType":"HASH_DEVICE_ID","idOrder":2,"isPrimary":false]"

编辑2:

我也尝试将变量 serialVersionUID = -2231953621568687904L; 添加到相关类,但这并没有解决问题

【问题讨论】:

您也可以发布您的 spark-submit 命令吗? 当然。我现在添加它 您提交的 Spark 作业之间的版本不匹配。请检查集群中的 spark 版本,并在 pom 文件中添加相同的版本。 @JosePraveen 我检查了机器中的 spark 版本,它返回了 2.0.2 版本。因此,我在 pom 文件中将 spark 的版本修改为 2.0.2。请查看我添加的依赖项 @SathiyaNarayanan 我认为问题在于序列化。请检查此how resolve java.io.InvalidClassException: local class incompatible 【参考方案1】:

我终于解决了这个问题。我注释掉了所有依赖项,并一次取消注释它们。首先,我取消了 spark_core 依赖项的注释,问题得到了解决。我在我的项目中取消了另一个依赖项的注释,这再次带来了问题。然后经过调查,我发现第二个依赖项又依赖于导致问题的 spark_core 的不同版本(2.10)。我在依赖项中添加了排除项,如下所示:

<dependency>
        <groupId>com.data.utils</groupId>
        <artifactId>data-utils</artifactId>
        <version>1.0-SNAPSHOT</version>
        <exclusions>
            <exclusion>
                <groupId>javax.ws.rs</groupId>
                <artifactId>javax.ws.rs-api</artifactId>
            </exclusion>
            <exclusion>
                <groupId>org.apache.spark</groupId>
                <artifactId>spark-core_2.10</artifactId>
            </exclusion>
        </exclusions>
    </dependency>

这解决了问题。以防万一有人陷入这个问题。感谢@JosePraveen 的宝贵意见,给了我提示。

【讨论】:

【参考方案2】:

当在 Spark 主服务器和 1 个或多个 Spark 从服务器上使用略有不同的 jar 版本时,我们会看到此问题。

我遇到了这个问题,因为我只将我的 jar 复制到了主节点。将 jar 复制到所有从节点后,我的应用程序就可以正常工作了。

【讨论】:

以上是关于apache spark中的无效类异常的主要内容,如果未能解决你的问题,请参考以下文章

Apache Spark 中的 RandomForestClassifier 输入带有无效标签列错误

Scala 错误:线程“主”org.apache.spark.SparkException 中的异常:任务不可序列化

线程“主”java.lang.NoClassDefFoundError 中的异常:IntelliJ 中的 org/apache/spark/ml/feature/VectorAssembler

线程“主”org.apache.spark.sql.AnalysisException 中的异常:由于数据类型不匹配,无法解析“named_struct()”:

带有 Cassandra 的 Apache Spark 1.5:类转换异常

用户类抛出异常:org.apache.spark.sql.AnalysisException:无法推断 Parquet 的架构。必须手动指定