在Colab/Jupyter中用PySpark读取Azure Blob Storage遇类未找到错误
解决PySpark读取Azure Blob Storage时的
ClassNotFoundException问题 问题根源
这个错误的核心原因是Hadoop Azure相关jar包版本与Spark依赖的Hadoop版本不兼容,或缺失必要的依赖组件,导致JVM无法找到org.apache.hadoop.fs.azure.NativeAzureFileSystem$Secure类。
解决方案步骤
1. 统一Spark与Hadoop版本兼容性
Spark的不同版本对应固定的Hadoop依赖版本,强行混用高版本Hadoop组件会引发冲突:
- Spark 3.1.x → 对应Hadoop 3.2.x
- Spark 3.4.x → 对应Hadoop 3.3.x/3.4.x
2. 使用spark.jars.packages自动管理依赖(推荐)
手动放置jar包容易出现版本冲突,通过Spark的包管理机制自动拉取兼容的依赖组件,是最可靠的方式。
Spark 3.1.1配置示例
from pyspark.sql import SparkSession spark = SparkSession.builder \ .appName("AzureBlobDataRead") \ # 拉取与Spark 3.1.1兼容的Hadoop Azure组件 .config("spark.jars.packages", "org.apache.hadoop:hadoop-azure:3.2.0,com.microsoft.azure:azure-storage:8.6.6") \ # 替换为你的Azure存储账户信息 .config("spark.hadoop.fs.azure.account.key.你的存储账户名.blob.core.windows.net", "你的存储密钥") \ .getOrCreate() # 读取JSON示例 df_json = spark.read.json("wasbs://你的容器名@你的存储账户名.blob.core.windows.net/目标文件路径.json") df_json.show() # 读取CSV示例 df_csv = spark.read.csv("wasbs://你的容器名@你的存储账户名.blob.core.windows.net/目标文件路径.csv", header=True, inferSchema=True) df_csv.show()
Spark 3.4.0配置示例
from pyspark.sql import SparkSession spark = SparkSession.builder \ .appName("AzureBlobDataRead") \ # 拉取与Spark 3.4.0兼容的Hadoop Azure组件 .config("spark.jars.packages", "org.apache.hadoop:hadoop-azure:3.3.4,com.microsoft.azure:azure-storage:8.6.6") \ # 替换为你的Azure存储账户信息 .config("spark.hadoop.fs.azure.account.key.你的存储账户名.blob.core.windows.net", "你的存储密钥") \ .getOrCreate() # 数据读取操作 df = spark.read.json("wasbs://你的容器名@你的存储账户名.blob.core.windows.net/目标文件路径.json") df.show()
3. 清理手动添加的冲突jar包
删除之前放在Spark jars目录中的azure-storage-8.6.6.jar、hadoop-azure-3.5.5.jar等文件,避免与spark.jars.packages拉取的兼容版本产生冲突。
4. 关键验证点
- 确认Azure存储账户名、密钥、容器名、文件路径无拼写错误
- 普通Blob Storage使用
wasbs://协议,若为Data Lake Storage Gen2则改用abfss://协议 - Colab/Jupyter会话重启后,需重新运行Spark初始化代码(会话重启会重置环境依赖)
内容的提问来源于stack exchange,提问作者user14634476
相关产品推荐
相关产品推荐

