java.io.InvalidClassException: org.apache.spark.internal.io.HadoopMapReduceCommitProtocol; 本地类不兼容

Vzz*_*arr 5 java hadoop cluster-computing apache-spark

语境

我正在Spark 集群上执行 Spark 工具(如果有兴趣,是 Spark 工具)。该工具正在从 HDFS 读取输入文件,并将在 HDFS 中生成输出文件。

我有 2 个 Azure VM,带有一个 Spark Master 容器、一个 Namenode 容器、两个 Spark Worker 容器和两个 Datanode 容器(另外两个容器提供工具所需的文件,但我不认为它很重要),使用 Docker 配置一群。

这是我用来运行 Spark 工具的 Bash 命令:

/gatk/gatk BwaAndMarkDuplicatesPipelineSpark \
--input hdfs://namenode:8020/PFC_0028_SW_CGTACG_R_fastqtosam.bam \
--reference hdfs://namenode:8020/hg19-ucsc/ucsc.hg19.2bit \
--bwa-mem-index-image /reference_image/ucsc.hg19.fasta.img \
--disable-sequence-dictionary-validation true \
--output hdfs://namenode:8020/PFC_0028_SW_CGTACG_R_dedup_reads.bam \
-- --spark-runner SPARK --spark-master spark://$SPARK_MASTER_HOST:7077 \
--driver-memory 30g --executor-cores 4 --executor-memory 15g
Run Code Online (Sandbox Code Playgroud)

问题

几个小时后,我收到此错误:

18/02/08 23:10:42 WARN TaskSetManager: Lost task 15.0 in stage 5.0 (TID 3087, 10.0.0.10, executor 0): 
java.io.InvalidClassException: org.apache.spark.internal.io.HadoopMapReduceCommitProtocol; 
local class incompatible: stream classdesc serialVersionUID = -3240062154626659006, local class serialVersionUID = 8531775026770993759
Run Code Online (Sandbox Code Playgroud)

甚至在 Stack Overflow 上搜索我发现这个问题也有类似的异常,它基本上建议添加这样的东西

   private static final long serialVersionUID = 6529685098267757690L;
Run Code Online (Sandbox Code Playgroud)

在 Java 代码中。但是我使用的Spark 工具实际上使用的是 serialVerionUID,而且异常表明由org.apache.spark.internal.io.HadoopMapReduceCommitProtocol引发,它似乎扩展了 Serializable,但不使用 serialVerionUID;我应该在 Spark GitHub 上打开一个问题并报告这个异常还是我做错了什么?

抱歉,如果过于冗长,如有必要,请随时询问更多详细信息。

Vzz*_*arr 2

我尝试检查 Spark Master 容器和 Spark Worker 容器的 Spark 版本,分别是 2.2.1 和 2.2.0

所以我在两者中都使用了 2.2.0,这次成功了。我认为问题是 Worker 和 Master 之间的版本不匹配(即使我第一次启动该工具,仅在执行几个小时后才引发异常)。