【问题标题】:Reading from ADLS from a Synapse Notebook with account key authentification and ABFS driver从具有帐户密钥身份验证和 ABFS 驱动程序的 Synapse Notebook 读取 ADLS
【发布时间】: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


    【解决方案1】:

    This post 很有帮助。

    显然 Synapse 限制 ABFS,因此它无法使用帐户密钥进行身份验证。相反,Synapse 只允许通过 LinkedServices 或服务原则进行身份验证。这就解释了为什么我可以从本地 PyCharm 中使用 ABFS 访问 ADLS,但不能从 Synapse Notebook 中访问。

    这基本上将任何使用 ABFS 的代码锁定到 Synapse 的基础架构中,并且无法再在本地执行,除非您想编写所有身份验证两次(一次使用帐户密钥在本地,一次使用 Synapse 要求的 ServicePrinciple 路由)。

    另一方面,您可以使用 WASB 来读取,但不能写入 ADLSGen2,因为重命名操作是在 ADLSGen2 上实现的。

    不用说,这太愚蠢了。使用任一协议,我要么被锁定到 Synapse,要么无法从本地写入。为了让我的代码在本地和 Synapse 中运行,我需要 WASB+accountKey-auth 进行读取,并需要 ABFS+accountKey(local)+linkedService(synapse) 进行身份验证。后者的主要问题是 ABFS+linkedServices 在 Synapse 中是一种痛苦且极其不稳定,请参阅this post

    直到微软决定让人们在 Synapse 中使用 ABFS + 帐户密钥进行身份验证之前,我真的被困在两个非常愚蠢和限制性的解决方案之间。

    【讨论】:

      【解决方案2】:

      由于缺少权限,您收到此信息。您可以在创建突触工作区时观察到,它确实表明我们需要额外的用户访问角色。必须为存储帐户分配一个存储 Blob 数据参与者角色,才能访问 adls 工作区。

      这里是Grant permissions to managed identity in Synapse workspace的步骤

      参考:

      【讨论】:

      • 如果它在 Synapse 之外工作,这怎么可能是权限问题?特别是因为它适用于 WASBS 但不适用于 ABFS?哦,我有整个订阅的贡献者角色,并且还将 Synapse 服务主体添加到 ADLS。 所以不是这样。无论如何,我正在使用帐户密钥,为什么我需要额外的权限??
      • 因为虽然您有整个订阅的参与者,但所有者、参与者和存储帐户参与者等角色允许安全主体管理存储帐户,但不提供对 blob 或队列数据的访问权限在该帐户中。
      • 请尝试查看这些附加图片以更好地理解i.imgur.com/FBPNSNh.pngi.imgur.com/Zihvcs8.png
      • 再次...我可以从 Azure(本地 PyCharm IDE)外部访问存储仅使用帐户密钥,没有角色,没有其他东西 - 为什么我要突然从 Synapse 执行相同代码时需要特定角色?
      • ABFS 和 ABFSS 方案以 ADLS Gen 2 REST API 为目标,因此它依赖于轮换、过期或删除的密钥,因此可能会出现错误,例如 401 Unauthorized。 WASB 和 WASBS 方案以 Azure Blob 存储 REST API 为目标,你可以使用它从任何 HDFS 客户端(包括 HDInsight)访问 Blob。在查看本地 pyspark ABFS 代码时,您不仅在使用基本路径(即 f"wasbs://{adls_container_name}@{adls_account_name}.blob.core.windows.net"),而且还添加了配置。跨度>
      猜你喜欢
      • 1970-01-01
      • 2019-04-14
      • 1970-01-01
      • 2023-03-26
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-03-15
      • 1970-01-01
      相关资源
      最近更新 更多