java - java.io.InvalidClassException:本地类不兼容 - 不止一名工作人员的 Apache Spark 提交问题
问题描述
我们一直在尝试使用主从架构在 Apache Spark 中运行 Java 应用程序。以下是 java 应用程序的 pom.xml:
<project xmlns="http://maven.apache.org/POM/4.0.0"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<groupId>Final</groupId>
<artifactId>DLSH</artifactId>
<version>0.0.1-SNAPSHOT</version>
<properties>
<maven.compiler.source>11</maven.compiler.source>
<maven.compiler.target>11</maven.compiler.target>
</properties>
<dependencies>
<dependency>
<groupId>org.apache.spark</groupId>
<artifactId>spark-core_2.12</artifactId>
<version>3.0.0</version>
<scope>provided</scope>
</dependency>
<!-- https://mvnrepository.com/artifact/org.apache.spark/spark-sql -->
<dependency>
<groupId>org.apache.spark</groupId>
<artifactId>spark-sql_2.12</artifactId>
<version>3.0.0</version>
<scope>provided</scope>
</dependency>
<dependency>
<groupId>org.apache.spark</groupId>
<artifactId>spark-mllib_2.12</artifactId>
<version>3.0.0</version>
<scope>provided</scope>
</dependency>
</dependencies>
</project>
以下是 java 应用程序的 spark 配置:
SparkSession spark = SparkSession
.builder()
.appName("JavaBucketedRandomProjectionLSHExample")
.master(args[0])
.getOrCreate();
使用的 Java 版本-11
- 当我尝试通过使用一个工作节点设置主 URL 来使用 spark-submit 运行时,这工作正常。
实际问题:
- 当我尝试使用 spark-submit 在两个工作节点(使用同一网络的两台不同的机器)中运行程序时,我遇到了本地类不兼容的问题。
下面是我使用 spark-submit 在两个工作节点上运行的命令:
./spark-master.sh - 启动主控
./spark-slave.sh "Master-URL" - 启动工人
以下是上述配置的 Spark WEB UI:
3.1.0-SNAPSHOT Spark Master at spark://mushfiq:7077
URL: spark://mushfiq:7077
Alive Workers: 2
Cores in use: 16 Total, 0 Used
Memory in use: 29.2 GiB Total, 0.0 B Used
Resources in use:
Applications: 0 Running, 34 Completed
Drivers: 0 Running, 0 Completed
Status: ALIVE
Workers (2)
Worker Id Address State Cores Memory
worker-20200617123647-128.123.63.43-45983 128.123.63.43:45983 ALIVE 8 (0 Used) 14.6 GiB (0.0 B Used)
worker-20200617124042-128.123.63.78-34355 128.123.63.78:34355 ALIVE 8 (0 Used) 14.6 GiB (0.0 B Used)
下面是使用上述两个工作节点执行 java 应用程序 jar 的 spark-submit 命令:
./spark-submit --class DistributedLSH.Application /home/mushfiq/Desktop/Eclipse/DLSHlatest.jar spark://mushfiq:7077 /home/mushfiq/Desktop/LSH/Datasets/Color/Color.ds /home/mushfiq/Desktop/LSH/Datasets/Color/randomdata.ds
上述命令的解释:
./spark-submit --class <ClassName>
<Path to Jar File("/home.../DSHlatest.jar")>
<args[0]-Master URL(spark://mushfiq:7077)>
<args[1](/home/..../Color.ds)>
<args[2](/home/.....randomdata.ds)>
spark-submit 的 Apache spark 版本- 我们使用以下 GitHub 版本进行 spark-submit - Apache Spark 版本
问题
- 因此,当我们运行上述命令时,我们会得到以下异常:
Lost task 1.3 in stage 2.0 (TID 9, 128.123.63.78, executor 1): java.io.InvalidClassException: org.apache.spark.sql.catalyst.encoders.ExpressionEncoder;
local class incompatible: stream classdesc serialVersionUID = -2784885576793145316, local class serialVersionUID = -2690984018213736661
- 我尝试了很多方法来解决这个问题。但不能。我认为问题可能是 pom.xml spark 和 spark-submit 的 spark 版本不匹配。非常感谢这里的任何帮助。提前致谢。另外,如果您对此问题有任何疑问,请告诉我。
解决方案
如果您有一个spark-catalyst_2.12
包含该类的冲突版本的 JAR,通常会发生这种情况org.apache.spark.sql.catalyst.encoders.ExpressionEncoder
- 那么您能否在客户端模式下检查 spark-submit 的类路径,以查看它从哪个 jar 中获取该类?
确保您没有混合类路径以包含两个 JAR。您可以检查“--jars”参数值。
推荐阅读
- git - 从上游获取并撤消我在来源中的所有提交
- angular - 未定义角度标识符“playerPhoto”。'' 不包含这样的成员
- javascript - HTML/CSS 样式化重复元素的有效方式?
- python - 搜索程序中具有相同值的不敏感键
- mysql - 从日期时间早于另一个项目的日期时间的 Mysql 表中删除
- json - 从地图生成 json
- r - ifelse() 仅评估匹配的行
- c++ - Objective-C 在传递给 Swift 时释放 C++ 对象。我该如何防止这种情况?
- selenium - 硒的 Chrome xpath 表达式找不到元素
- node.js - mongoDB中具有自定义日期范围的日期记录数?