Ubuntu实例下PySpark写入WASB存储报不支持文件系统问题求助
解决非HDInsight环境下PySpark写入WASB的IO异常问题
没问题,我来帮你搞定这个在Azure N系列Ubuntu实例上的PySpark报错问题——本质是默认的Spark分发包没有包含Azure Blob Storage的适配驱动,咱们一步步来解决:
1. 确认你的Spark版本
首先得明确当前Spark的版本,因为不同Spark版本对应的Azure驱动版本必须严格匹配,否则会出现兼容性问题。执行以下命令查看版本:
spark-submit --version
2. 下载适配的Azure驱动包
你需要两个核心jar包:
hadoop-azure:负责实现Hadoop与Azure存储的交互逻辑azure-storage:Azure存储的SDK依赖,供hadoop-azure调用
下面是常见Spark版本对应的驱动版本组合:
- Spark 2.4.x → hadoop-azure 2.7.7 + azure-storage 6.1.0
- Spark 3.1.x → hadoop-azure 3.2.0 + azure-storage 8.6.6
- Spark 3.3.x → hadoop-azure 3.3.4 + azure-storage 8.6.6
你可以从Maven中央仓库搜索对应版本的jar包下载到本地。
3. 让Spark加载这些驱动包
有两种方式让Spark识别并加载这些驱动:
- 方式一(永久生效):把下载好的jar包移动到Spark的默认jars目录中,这样每次启动Spark都会自动加载:
mv hadoop-azure-xxx.jar azure-storage-xxx.jar $SPARK_HOME/jars/
(注意替换命令中的xxx为你下载的实际版本号)
- 方式二(临时生效,仅当前任务):在提交PySpark任务时,通过
--jars参数指定驱动包的本地路径:
spark-submit --jars /path/to/hadoop-azure-xxx.jar,/path/to/azure-storage-xxx.jar your_pyspark_script.py
4. 配置Spark的Azure存储访问权限
在你的PySpark代码中,必须配置存储账户的访问凭证(密钥或SAS Token),同时注意WASB地址需要补全存储账户名,正确格式为:wasb://<容器名>@<存储账户名>.blob.core.windows.net/<路径>。
示例1:使用存储账户密钥
from pyspark.sql import SparkSession spark = SparkSession.builder \ .appName("WriteToWASB") \ # 替换为你的存储账户名和对应的访问密钥 .config("fs.azure.account.key.your-storage-account-name.blob.core.windows.net", "your-storage-account-key") \ .getOrCreate() # 执行写入操作,注意补全完整的WASB地址 spark.write.save( 'wasb://containername@your-storage-account-name.blob.core.windows.net/path', format='json', mode='append' )
示例2:使用SAS Token(更安全,适合临时权限场景)
spark = SparkSession.builder \ .appName("WriteToWASB") \ # 替换为你的存储账户名、容器名和SAS Token(注意不要带开头的?) .config("fs.azure.sas.containername.your-storage-account-name.blob.core.windows.net", "your-sas-token") \ .getOrCreate()
5. 验证配置是否生效
在执行写入操作前,可以先尝试读取Blob容器中的一个测试文件,确认驱动和权限配置都正常:
df = spark.read.text('wasb://containername@your-storage-account-name.blob.core.windows.net/test.txt') df.show()
如果能正常输出文件内容,说明配置没问题,再执行写入操作即可。
额外注意事项
- 确保你的Ubuntu实例有网络权限访问Azure Blob Storage:检查实例的NSG规则是否允许出站到
*.blob.core.windows.net的443端口(HTTPS)。 - 如果你的存储是ADLS Gen2,更推荐使用
abfss://协议(性能更优),但如果必须使用WASB,上述方法同样适用。 - 务必严格匹配驱动版本,版本不匹配会抛出各种IO异常或类找不到的错误。
内容的提问来源于stack exchange,提问作者GLalor
相关产品推荐
相关产品推荐

