java.io.IOException:常规上传失败:java.lang.NoSuchMethodError

问题描述 投票:0回答:1

我无法将 Pyspark 数据帧保存到 S3 存储桶。

我正在 docker dev 容器中运行代码

我的 AWS_ACCESS_KEY_ID 和 AWS_SECRET_ACCESS_KEY 已在环境中设置

环境设置

基础镜像:gcr.io/datamechanics/spark:platform-3.2.1-hadoop-3.3.1-java-11-scala-2.12-python-3.8-dm18

我在 /opt/spark/jars 中有以下可用的罐子: 'aws-java-sdk-bundle-1.11.901.jar', 'aws-java-sdk-core-1.11.797.jar', 'aws-java-sdk-glue-1.11.797.jar', 'hadoop-aws-3.3.1.jar',

示例代码

`from pyspark.sql import SparkSession
spark = SparkSession.builder \
            .config("spark.hadoop.fs.s3.impl", "org.apache.hadoop.fs.s3a.S3AFileSystem") \
            .config("spark.dynamicAllocation.enabled", "true") \
            .config("spark.dynamicAllocation.maxExecutors", "4") \
            .config("spark.dynamicAllocation.minExecutors", "1") \
            .config("spark.dynamicAllocation.initialExecutors", "1") \
            .config("spark.sql.parquet.datetimeRebaseModeInRead", "CORRECTED") \
            .config("spark.sql.legacy.pathOptionBehavior.enabled", "true") \
            .config("spark.sql.parquet.datetimeRebaseModeInWrite", "CORRECTED") \
            .getOrCreate()

source_file = "/workspaces/sample/test/*"
df = spark.read.parquet(source_file)
df.write.format("parquet").mode("append").save("s3a://MY_BUCKET/MY_FOLDER/")`

错误: java.io.IOException:常规上传失败:java.lang.NoSuchMethodError:'void com.amazonaws.util.IOUtils.release(java.io.Closeable,com.amazonaws.thirdparty.apache.logging.Log)'

查了多个博客,错误主要是因为开发者推荐的版本不匹配。这些版本对我来说看起来不错,因为当我在 AWS env 中使用相同的设置运行相同的代码时,相同的设置对我有用,但是当我尝试从本地运行相同的设置时,我收到了上述错误。

apache-spark amazon-s3 hadoop pyspark
1个回答
0
投票

类路径上应该只有 aws-sdk-bundle jar;另外两个 aws-sdk 来自不同的版本,并且只会“为您提供堆栈跟踪”,正如 hadoop s3a 文档详细介绍的那样。 Bundle.jar 文件包含这些库及其所有依赖项的阴影版本。

© www.soinside.com 2019 - 2024. All rights reserved.