无法从 Azure Blob 中读取:“org.apache.hadoop.fs.azure.AzureException:找不到 Azure 存储帐户的凭据

Cannot read from Azure Blob: "org.apache.hadoop.fs.azure.AzureException: No credentials found for Azure storage account

我有一个私人 Azure 存储帐户并在本地使用 PySpark,我想读取一个 Blob。这是设置:

access_key = <storage-account-access-key>
spark = SparkSession.builder.master('local').appName('app').getOrCreate()
spark.conf.set("fs.azure.account.<storage-account-name>.blob.core.windows.net", access_key)
sc = spark.sparkContext
sc._conf.setAll([("fs.azure.account.key.<storage-acccount-name>.blob.core.windows.net", access_key)])

csv_raw = sc.textFile('wasbs://<container-name>@<storage-account-name>.blob.core.windows.net/dir')
print(csv_raw.collect())

我使用 spark.sparkContext.textFile() 而不是 spark.read.load() 的原因是什么?在转换为具有模式的数据帧之前,我需要将数据作为 RDD 读入以执行一些数据 cleaning/parsing。这很奇怪,因为我可以使用 spark.read.load() 将数据作为数据帧读入,因此 Spark Session 中的设置是正确的。如上面的代码所示,我确实在 sparkContext 中手动设置了配置,以确保它在 运行 textFile 方法之前具有此参数。但是,我在使用 spark.sparkContext.textFile():

时收到身份验证错误

"org.apache.hadoop.fs.azure.AzureException:在配置中找不到帐户...的凭据,并且其容器...无法使用匿名凭据访问。"

请假设所有 jar 文件 (hadoop-azure-3.3.0.jar,azure-storage-8.6.5.jar) 都使用 spark-submit 正确加载,同时请注意我正在使用星火版本 3.1.1.

提前谢谢!

对于 RDD API,您需要提供 Hadoop 配置 - 您现在使用的配置仅用于 Dataframe/Dataset API(参见 Databricks docs 作为参考)。

因此,您需要添加 spark.hadoop 而不是 fs.azure.account.key.<storage-acccount-name>.blob.core.windows.netspark.hadoop.fs.azure.account.key.<storage-acccount-name>.blob.core.windows.net