K8s环境下JupyterHub中PySpark查询数据报错:org.apache.hadoop.fs.s3a.S3AFileSystem类未找到
Class org.apache.hadoop.fs.s3a.S3AFileSystem not found错误 嘿,这个问题我碰到过不少次,本质就是你的Spark/Hadoop环境里缺了支持S3A文件系统的依赖包。Hadoop 2.x的默认安装包不会自带S3相关组件,得手动补上对应版本的Jar包才行。结合你的环境版本(Hadoop 2.7.3、AWS-SDK 1.7.4),我给你整理了具体的解决步骤:
一、先搞清楚需要哪些依赖
你得确保下面两个Jar包能被Spark找到:
hadoop-aws-2.7.3.jar:和你用的Hadoop-AWS版本完全对应aws-java-sdk-1.7.4.jar:匹配你的AWS-SDK版本
二、三种添加依赖的方式,选适合你的
方式1:启动时临时指定依赖
如果不想改全局配置,每次启动PySpark或者提交任务时,用--jars参数把这两个Jar包带上就行:
# 启动PySpark交互环境 pyspark --jars /你放Jar的路径/hadoop-aws-2.7.3.jar,/你放Jar的路径/aws-java-sdk-1.7.4.jar # 提交Python脚本的时候 spark-submit --jars /你放Jar的路径/hadoop-aws-2.7.3.jar,/你放Jar的路径/aws-java-sdk-1.7.4.jar 你的脚本.py
要是你用的是分布式集群,记得所有节点上都要有这两个Jar包,或者把它们放到HDFS这样大家都能访问的路径里。
方式2:把Jar包放到全局目录一劳永逸
把这两个Jar包复制到Spark的默认Jar目录($SPARK_HOME/jars),或者Hadoop的工具库目录($HADOOP_HOME/share/hadoop/tools/lib)。这样之后每次启动Spark,都会自动加载这些依赖,不用每次都敲一堆参数。
方式3:通过配置文件持久化设置
修改$SPARK_HOME/conf/spark-defaults.conf,加上下面两行(替换成你实际的Jar路径):
spark.driver.extraClassPath /你的Jar路径/hadoop-aws-2.7.3.jar:/你的Jar路径/aws-java-sdk-1.7.4.jar spark.executor.extraClassPath /你的Jar路径/hadoop-aws-2.7.3.jar:/你的Jar路径/aws-java-sdk-1.7.4.jar
集群模式下要注意,所有节点的路径得一致,或者用全局可访问的路径哦。
三、代码里的小错误要修正
我看你代码里的凭证配置参数写错啦!你用的是fs.s3.aws.credentials.provider,但S3A文件系统的参数应该是fs.s3a.aws.credentials.provider(多了个a)。修正后的代码如下:
from pyspark.sql import SparkSession spark = SparkSession.builder.getOrCreate() # 变量名改成spark更规范哦 # 配置S3A实现类 spark._jsc.hadoopConfiguration().set("fs.s3a.impl","org.apache.hadoop.fs.s3a.S3AFileSystem") # 修正参数名,改成fs.s3a开头 spark._jsc.hadoopConfiguration().set('fs.s3a.aws.credentials.provider', 'com.amazonaws.auth.EnvironmentVariableCredentialsProvider') val = spark.sql("select * from customer.100_rating limit 5") val.show()
四、验证一下依赖是否生效
你可以在PySpark里跑下面的代码,确认依赖已经加载成功:
# 查看当前的classpath配置 print(spark.sparkContext.getConf().get("spark.driver.extraClassPath")) # 尝试加载S3A类,看看能不能找到 try: spark._jvm.org.apache.hadoop.fs.s3a.S3AFileSystem print("太好了,S3AFileSystem类加载成功!") except Exception as e: print(f"还是没找到:{e}")
按照这些步骤操作完,再重新运行你的代码,应该就能解决这个类找不到的问题啦!
内容的提问来源于stack exchange,提问作者Vivek Kumar Sinha

