Spark2.3.0+Hadoop3.1.0环境下Java API调用groupByKey异常求助
问题分析与解决方案
我之前在Spark 2.x搭配Hadoop 3.x的环境里碰到过一模一样的问题,这个异常的核心原因是依赖版本冲突:Spark 2.3.0默认依赖的ASM库(asm5.x)和Hadoop 3.1.0依赖的更高版本ASM(7.x)不兼容,导致Spark的ClosureCleaner在处理闭包代码时触发了IllegalArgumentException。
从你的异常栈也能看出来,错误发生在org.apache.xbean.asm5.ClassReader的初始化环节——这是因为类加载器同时加载了两个版本的ASM类,导致版本不匹配的问题。
具体解决方案
你需要在项目构建文件中排除Spark自带的ASM依赖,然后引入与Hadoop 3.1.0兼容的ASM版本(推荐7.0)。
如果使用Maven构建
修改你的pom.xml,添加依赖排除和兼容版本的ASM:
<dependencies> <!-- Spark Core依赖,排除自带的ASM --> <dependency> <groupId>org.apache.spark</groupId> <artifactId>spark-core_2.11</artifactId> <version>2.3.0</version> <exclusions> <exclusion> <groupId>org.ow2.asm</groupId> <artifactId>asm</artifactId> </exclusion> <exclusion> <groupId>org.ow2.asm</groupId> <artifactId>asm-commons</artifactId> </exclusion> <exclusion> <groupId>org.ow2.asm</groupId> <artifactId>asm-tree</artifactId> </exclusion> </exclusions> </dependency> <!-- 引入与Hadoop 3.1.0兼容的ASM版本 --> <dependency> <groupId>org.ow2.asm</groupId> <artifactId>asm</artifactId> <version>7.0</version> </dependency> <dependency> <groupId>org.ow2.asm</groupId> <artifactId>asm-commons</artifactId> <version>7.0</version> </dependency> <dependency> <groupId>org.ow2.asm</groupId> <artifactId>asm-tree</artifactId> <version>7.0</version> </dependency> </dependencies>
如果使用SBT构建
修改你的build.sbt:
// 排除Spark自带的ASM依赖 libraryDependencies += "org.apache.spark" %% "spark-core" % "2.3.0" excludeAll( ExclusionRule(organization = "org.ow2.asm"), ExclusionRule(organization = "org.ow2.asm", name = "asm-commons"), ExclusionRule(organization = "org.ow2.asm", name = "asm-tree") ) // 添加兼容的ASM版本 libraryDependencies += "org.ow2.asm" % "asm" % "7.0" libraryDependencies += "org.ow2.asm" % "asm-commons" % "7.0" libraryDependencies += "org.ow2.asm" % "asm-tree" % "7.0"
验证方法
修改依赖后,重新编译运行你的简化测试用例:
- 第一个
saveAsTextFile本来就不会触发闭包清理,所以之前能成功; - 修改后,
groupByKey对应的闭包清理逻辑会使用兼容的ASM版本,应该能正常执行并生成/TEST/testfile2文件。
内容的提问来源于stack exchange,提问作者user3654762
相关产品推荐
相关产品推荐

