本地PySpark使用sc.textFile读取Azure Blob报无凭证错误如何解决
问题核心原因
你遇到的报错是两个配置相关的问题共同导致的:
- 配置生效时机错误:
spark.read.load属于Spark SQL API,会实时读取当前spark.conf中的配置;但sc.textFile属于RDD API,依赖SparkContext初始化时就加载完成的Hadoop配置。你在SparkSession初始化完成后才通过sc._conf.setAll修改配置,这类修改不会同步到已经初始化的Hadoop FileSystem配置中,因此不生效。 - 配置键拼写错误:你给
spark.conf.set的配置键少了.key后缀,正确的配置键格式为fs.azure.account.key.<存储账户名>.blob.core.windows.net,即使Spark SQL能生效也是巧合,不符合规范的配置会导致RDD读取时无法识别密钥。另外你原代码中sc._conf.setAll里的存储账户占位符多写了一个字母c(写为storage-acccount-name),实际使用时注意排查拼写错误。
解决方案
按照如下方式调整代码即可:
- 优先在SparkSession构建阶段就传入所有存储相关配置
- 如果需要运行时补充配置,直接修改SparkContext关联的Hadoop配置,不要修改
sc._conf
正确代码示例
access_key = "<storage-account-access-key>" storage_account_name = "<storage-account-name>" container_name = "<container-name>" # 构建SparkSession时就配置存储密钥 spark = SparkSession.builder \ .master('local') \ .appName('app') \ .config(f"fs.azure.account.key.{storage_account_name}.blob.core.windows.net", access_key) \ .getOrCreate() # 运行时补充配置的写法(可选,初始化时已配可以不写) sc = spark.sparkContext sc._jsc.hadoopConfiguration().set(f"fs.azure.account.key.{storage_account_name}.blob.core.windows.net", access_key) # 读取RDD csv_raw = sc.textFile(f"wasbs://{container_name}@{storage_account_name}.blob.core.windows.net/dir") print(csv_raw.collect())
额外注意事项
如果修改后依然报错,可检查依赖版本匹配:hadoop-azure的版本需要和Spark内置的Hadoop主版本对齐,Spark 3.1.1默认使用Hadoop 3.2.x,你使用的3.3.0版本属于兼容范围,若出现其他类NotFound异常可将依赖替换为对应3.2.x版本即可。
内容的提问来源于stack exchange,提问作者Aaron Gonzalez
相关产品推荐
相关产品推荐

