EC2笔记本访问S3文件遇S3AFileSystem找不到错误求助
解决PySpark连接S3时
Class org.apache.hadoop.fs.s3a.S3AFileSystem not found错误 问题根源
通过pip install pyspark安装的PySpark默认不包含Hadoop S3A驱动依赖包,导致无法识别S3文件系统类。
修复步骤
1. 修正PySpark安装与导入的错误写法
原命令将安装与导入写在一行是错误的,需分开执行:
!pip install pyspark
import pyspark from pyspark.sql import SparkSession from pyspark.conf import SparkConf
2. 临时生效方案(Jupyter会话内)
在创建SparkSession时,直接指定所需的依赖包,Spark会自动下载并加载:
# 配置Spark依赖包,版本需与PySpark对应的Hadoop版本匹配 # 可通过 spark.sparkContext._gateway.jvm.org.apache.hadoop.util.VersionInfo.getVersion() 查看Hadoop版本 conf = SparkConf().setAppName("SMB_classification") \ .set("spark.jars.packages", "org.apache.hadoop:hadoop-aws:3.3.4,com.amazonaws:aws-java-sdk-bundle:1.12.262") # 创建SparkSession并配置S3参数 spark = SparkSession.builder.config(conf=conf).getOrCreate() spark._jsc.hadoopConfiguration().set("fs.s3a.access.key", ACCESS_KEY) spark._jsc.hadoopConfiguration().set("fs.s3a.secret.key", SECRET_KEY) spark._jsc.hadoopConfiguration().set("fs.s3a.endpoint", "s3-us-west-2.amazonaws.com") spark._jsc.hadoopConfiguration().set("com.amazonaws.services.s3.enableV4", "true") spark._jsc.hadoopConfiguration().set("fs.s3a.impl", "org.apache.hadoop.fs.s3a.S3AFileSystem") spark._jsc.hadoopConfiguration().setInt("fs.s3a.connection.maximum", 100) spark._jsc.hadoopConfiguration().set("fs.s3a.buffer.dir", "/var/tmp/spark") # 读取S3上的Parquet文件 df = spark.read.parquet('s3a://s3path/file.parquet')
3. 永久生效方案(全局配置)
如果需要每次启动PySpark都自动加载依赖,可将驱动包下载到PySpark的jars目录:
- 查看PySpark安装路径:
!pip show pyspark | grep Location
- 下载对应版本的依赖包到jars目录(替换下方路径为上一步得到的Location路径):
# 替换为你的PySpark安装路径 PYSPARK_JARS_DIR="/usr/local/lib/python3.8/dist-packages/pyspark/jars" # 下载hadoop-aws和aws-java-sdk-bundle包 !wget -P $PYSPARK_JARS_DIR https://repo1.maven.org/maven2/org/apache/hadoop/hadoop-aws/3.3.4/hadoop-aws-3.3.4.jar !wget -P $PYSPARK_JARS_DIR https://repo1.maven.org/maven2/com/amazonaws/aws-java-sdk-bundle/1.12.262/aws-java-sdk-bundle-1.12.262.jar
- 重新启动Jupyter后,直接使用配置代码即可连接S3。
关键注意事项
hadoop-aws的版本必须与PySpark内置的Hadoop版本一致,版本不匹配会导致新的兼容性错误。- 避免重复创建SparkSession,建议先构建配置再初始化SparkSession,而非先创建再修改配置。
内容的提问来源于stack exchange,提问作者pnv
相关产品推荐
相关产品推荐

