【发布时间】:2022-02-25 17:58:18
【问题描述】:
我正在尝试从 Synapse 中的 ADLS Gen2 读取文件并希望使用帐户密钥进行身份验证。
According to the docs,以下应该可以工作,但在 Synapse 中不起作用:
spark.conf.set(f"fs.azure.account.key.{adls_account_name}.dfs.core.windows.net", adls_account_key)
我想使用 ABFS 驱动程序作为docs 建议:
优化的驱动程序:ABFS 驱动程序专门针对大数据分析进行了优化。相应的 REST API 通过端点 dfs.core.windows.net 显示。
什么不起作用:
- 当我使用 pyspark+ABFS 并在 Synapse Notebook 中执行时,我收到
java.nio.file.AccessDeniedException: Operation failed: "This request is not authorized to perform this operation using this permission.", 403错误。
什么有效:
- 当我使用 pyspark+WASBS 并在 Synapse Notebook 中执行时,它可以工作。
- 当我使用 pyspark+ABFS 并从我的本地 PyCharm 本地执行时,它可以工作。
- 当我在 Synapse 中使用 python/DataLakeServiceClient 时,它可以工作。
- 当我使用本地 PyCharm 中的 python/DataLakeServiceClient 时,它可以工作。
这绝对不是缺少权限的问题,而是 Synapse 的问题。我错过了一些配置吗?任何帮助表示赞赏。我宁愿不使用 WASB API,因为 (according to this post) ABFS 应该用于 ADLSGen2。
每个代码都有以下变量:
adls_account_key = "<myaccountkey>"
adls_container_name = "<mycontainername>"
adls_account_name = "<myaccountname>"
filepath = "/Data/Contacts"
Synapse PySpark ABFS 代码:(崩溃)
spark.conf.set(f"fs.azure.account.key.{adls_account_name}.dfs.core.windows.net", adls_account_key)
base_path = f"abfs://{adls_container_name}@{adls_account_name}.dfs.core.windows.net"
df = spark.read.parquet(base_path + filepath)
df.show(10, False)
Synapse PySpark WASBS 代码:(有效)
spark.conf.set(f"fs.azure.account.key.{adls_account_name}.blob.core.windows.net", adls_account_key)
base_path = f"wasbs://{adls_container_name}@{adls_account_name}.blob.core.windows.net"
df = spark.read.parquet(base_path + filepath)
df.show(10, False)
Synapse + 本地 Python/DataLakeServiceClient 代码(在 Synapse 上与本地相同):(有效)
service_client = DataLakeServiceClient(
account_url=f"https://{adls_account_name}.dfs.core.windows.net",
credential=adls_account_key,
)
file_client = service_client.get_file_client(
file_system=adls_container_name, file_path=filepath
)
file_content = file_client.download_file().readall()
本地 pyspark ABFS 代码(包括构建 spark 会话,但其他代码完全相同):(works)
from pyspark.sql import SparkSession
spark = SparkSession \
.builder \
.config('spark.jars.packages', 'org.apache.hadoop:hadoop-azure:3.3.1') \
.getOrCreate()
spark.conf.set(f"fs.azure.account.key.{adls_account_name}.dfs.core.windows.net", adls_account_key)
base_path = f"abfs://{adls_container_name}@{adls_account_name}.dfs.core.windows.net"
df = spark.read.parquet(base_path + filepath)
df.show(10, False)
【问题讨论】:
标签: python azure apache-spark pyspark azure-synapse