Spark Submit上传Parquet至Nutanix对象存储时抛出异常求助
问题:PySpark写入Parquet到Nutanix对象存储时出现NoSuchMethodError
核心报错
java.lang.NoSuchMethodError: com.amazonaws.util.IOUtils.release(Ljava/io/Closeable;Lorg/apache/commons/logging/Log;)V
环境信息
- Spark版本:3.2.1
- Python版本:3.6
- JDK版本:1.8.0_422
- Scala版本:2.12.15
代码片段
import sys from jproperties import Properties from pyspark.sql import SparkSession from pyspark.sql.functions import * CONST_DATE_FORMAT = '%Y-%m-%d' def main(): print(" ****** starting process ****** ") property_path = sys.argv[1] config = Properties() with open(property_path, 'rb') as config_file: config.load(config_file) access_key = config.get("object.store.access.key").data secret_key = config.get("object.store.secret.key").data end_point = config.get("object.store.endpoint").data spark = SparkSession.builder \ .appName("PARQUET_TEST") \ .config("spark.hadoop.fs.s3a.access.key", access_key) \ .config("spark.hadoop.fs.s3a.secret.key", secret_key) \ .config("spark.hadoop.fs.s3a.endpoint", end_point) \ .config("spark.hadoop.fs.s3a.connection.maximum", "100") \ .config("spark.hadoop.fs.s3a.path.style.access", "true") \ .config("spark.hadoop.fs.s3a.multiobjectdelete.enable", "false") \ .config("spark.hadoop.fs.s3a.aws.credentials.provider", "org.apache.hadoop.fs.s3a.SimpleAWSCredentialsProvider") \ .getOrCreate() sc = spark.sparkContext log_level = config.get('log.level').data sc.setLogLevel(log_level) file_path = config.get("file_path").data + '/temp' data = [("Alice", 29), ("Bob", 31), ("Catherine", 25)] transactions_df = spark.createDataFrame(data) transactions_df.write.mode('overwrite').parquet(file_path) print("completed processing") main()
运行命令
spark-submit --jars jars/hadoop-aws-3.2.3.jar,jars/hadoop-common-3.2.3.jar,jars/aws-java-sdk-core-1.12.373.jar,jars/aws-java-sdk-s3-1.12.373.jar,jars/aws-java-sdk-bundle-1.12.373.jar project/parquet_test.py project/application.properties
问题分析
NoSuchMethodError本质是JVM运行时找不到指定方法,根源在于依赖版本不兼容与冲突:
- hadoop-aws与aws-java-sdk版本不匹配:hadoop-aws 3.2.3官方适配的是aws-java-sdk-bundle 1.11.x系列,而非1.12.x。高版本SDK中
IOUtils.release的方法签名或存在性与hadoop-aws的调用预期不一致。 - 重复依赖冲突:同时引入了
aws-java-sdk-bundle和单独的aws-java-sdk-core、aws-java-sdk-s3,bundle包已包含core和s3模块内容,重复引入会导致类加载逻辑混乱。
解决方案
1. 清理冲突依赖,使用匹配版本的bundle包
移除单独的aws-java-sdk-core、aws-java-sdk-s3包,替换为与hadoop-aws 3.2.3兼容的aws-java-sdk-bundle-1.11.901版本。
2. 调整运行命令
修改spark-submit命令,只保留必要的兼容依赖:
spark-submit --jars jars/hadoop-aws-3.2.3.jar,jars/hadoop-common-3.2.3.jar,jars/aws-java-sdk-bundle-1.11.901.jar project/parquet_test.py project/application.properties
3. 可选:使用--packages自动管理依赖(推荐)
避免手动下载jar包的版本误差,直接通过Maven坐标自动拉取兼容依赖:
spark-submit --packages org.apache.hadoop:hadoop-aws:3.2.3,com.amazonaws:aws-java-sdk-bundle:1.11.901 project/parquet_test.py project/application.properties
4. 修复代码缺失的导入
原代码使用sys.argv但未导入sys模块,需在代码顶部补充:
import sys
内容的提问来源于stack exchange,提问作者Srikkanth s
相关产品推荐
相关产品推荐

