PyCharm中运行PySpark代码无法访问S3文件的解决请求
PySpark读取AWS S3 CSV文件报错解决方案
我写了一段基础PySpark代码,想直接读取AWS S3存储桶里的CSV文件,但一直报错。用boto3能完成同样操作,但我不想用它,毕竟用Spark就是为了直接处理数据,求解决办法。
我的代码
from pyspark.sql import * spark = SparkSession.builder.master("local").appName("test").getOrCreate() spark.sparkContext._jsc.hadoopConfiguration().set("com.amazonaws.services.s3.enableV4", "true") spark.sparkContext._jsc.hadoopConfiguration().set("fs.s3a.impl", "org.apache.hadoop.fs.s3a.S3AFileSystem") spark.sparkContext._jsc.hadoopConfiguration().set("fs.s3a.aws.credentials.provider", \ "com.amazonaws.auth.InstanceProfileCredentialsProvider,com.amazonaws.auth.DefaultAWSCredentialsProviderChain") spark.sparkContext._jsc.hadoopConfiguration().set("fs.AbstractFileSystem.s3a.impl", "org.apache.hadoop.fs.s3a.S3A") spark.sparkContext._jsc.hadoopConfiguration().set("fs.s3a.access.key","mykey") spark.sparkContext._jsc.hadoopConfiguration().set("fs.s3a.secret.key","mykey") spark.sparkContext._jsc.hadoopConfiguration().set("fs.s3a.endpoint", "s3.ap-south-1.amazonaws.com") data = "s3a://atharv-test/huditest.csv" authorsDf = spark.read.format('csv').option("header","true").option("inferSchema","true").load(data) authorsDf.show()
报错信息
py4j.protocol.Py4JJavaError: An error occurred while calling o36.load. : java.lang.NoSuchMethodError: 'void com.google.common.base.Preconditions.checkArgument(boolean, java.lang.String, java.lang.Object, java.lang.Object)' at org.apache.hadoop.fs.s3a.S3AUtils.lookupPassword(S3AUtils.java:893) at org.apache.hadoop.fs.s3a.S3AUtils.lookupPassword(S3AUtils.java:869)
核心原因
这个报错是Guava版本冲突导致的。Spark自带的Guava版本和Hadoop S3A客户端依赖的Guava版本不匹配,引发了方法找不到的异常。
解决办法
1. 用spark-submit指定兼容依赖(推荐)
先通过spark-submit --version查看你的Spark内置Hadoop版本,比如显示是3.3.4,就用以下命令启动脚本:
spark-submit --packages org.apache.hadoop:hadoop-aws:3.3.4,com.amazonaws:aws-java-sdk-bundle:1.12.267 your_script.py
该命令会自动下载和Spark内置Hadoop版本匹配的依赖包,覆盖冲突的Guava版本。
2. 排除项目依赖中的冲突Guava
如果是用Maven/SBT构建项目,排除Spark自带的Guava,引入Hadoop对应的版本:
- Maven示例:
<dependency> <groupId>org.apache.spark</groupId> <artifactId>spark-sql_2.12</artifactId> <version>3.3.0</version> <exclusions> <exclusion> <groupId>com.google.guava</groupId> <artifactId>guava</artifactId> </exclusion> </exclusions> </dependency> <dependency> <groupId>org.apache.hadoop</groupId> <artifactId>hadoop-aws</artifactId> <version>3.3.4</version> </dependency>
3. 优化代码中的凭证配置
你的代码同时配置了实例角色凭证和Access Key,建议二选一:
- 如果在EC2/EMR上运行,保留
InstanceProfileCredentialsProvider即可,删掉Access Key的配置,更安全; - 如果是本地调试,保留Access Key,或者直接用AWS CLI配置的默认凭证(无需在代码里写密钥)。
内容的提问来源于stack exchange,提问作者Aditya Verma
相关产品推荐
相关产品推荐

