azure Unity目录-使用服务主体访问外部位置

sulc1iza  于 2023-03-09  发布在  其他
关注(0)|答案(2)|浏览(133)

我正在尝试通过Unity目录使用服务主体访问Azure Data Lake Storage Gen 2。

  • 添加托管身份时,会将参与者角色分配给存储帐户
  • 托管身份将作为存储凭据添加
  • 存储容器将添加为具有此凭据的外部位置
  • 在外部位置上使用All Privileges添加服务主体

在PySpark中,我根据Azure Gen 2文档设置了Spark配置:

from pyspark.sql.types import StringType

spark.conf.set(f"fs.azure.account.auth.type.{storage_account}.dfs.core.windows.net", "OAuth")
spark.conf.set(f"fs.azure.account.oauth.provider.type.{storage_account}.dfs.core.windows.net", "org.apache.hadoop.fs.azurebfs.oauth2.ClientCredsTokenProvider")
spark.conf.set(f"fs.azure.account.oauth2.client.id.{storage_account}.dfs.core.windows.net", client_id)
spark.conf.set(f"fs.azure.account.oauth2.client.secret.{storage_account}.dfs.core.windows.net", client_secret)
spark.conf.set(f"fs.azure.account.oauth2.client.endpoint.{storage_account}.dfs.core.windows.net", f"https://login.microsoftonline.com/{tenant_id}/oauth2/token")

# create and write dataframe
df = spark.createDataFrame(["10","11","13"], StringType()).toDF("values")
df.write \
  .format("delta") \
  .mode("overwrite") \
  .save(f"abfss://{container}@{storage_account}.dfs.core.windows.net/example/example-0")

不幸的是,这将返回一个意外的:
操作失败:“未授权此请求使用此权限执行此操作。",403,HEAD,https://{存储帐户}.dfs.core.windows.net/{容器名称}/示例/示例-0?upn=false&action=getStatus&timeout=90

ttcibm8c

ttcibm8c1#

当您使用Unity Catalog时,您不需要这些属性-它们在Unity Catalog之前是需要的,现在没有使用,或者仅用于没有UC的集群以进行直接数据访问:

spark.conf.set(f"fs.azure.account.auth.type.{storage_account}.dfs.core.windows.net", "OAuth")
spark.conf.set(f"fs.azure.account.oauth.provider.type.{storage_account}.dfs.core.windows.net", "org.apache.hadoop.fs.azurebfs.oauth2.ClientCredsTokenProvider")
spark.conf.set(f"fs.azure.account.oauth2.client.id.{storage_account}.dfs.core.windows.net", client_id)
spark.conf.set(f"fs.azure.account.oauth2.client.secret.{storage_account}.dfs.core.windows.net", client_secret)
spark.conf.set(f"fs.azure.account.oauth2.client.endpoint.{storage_account}.dfs.core.windows.net", f"https://login.microsoftonline.com/{tenant_id}/oauth2/token")

对给定存储位置的身份验证将通过将存储凭据Map到外部位置路径来进行。
但是,将检查正在运行给定代码的用户/服务主体的权限,因此此用户/主体应具有外部位置的相应权限。如果您将此代码作为SP分配的作业运行,则它将具有访问权限。但如果您以自己的身份运行,则在您获得权限之前,它将无法工作。

guykilcj

guykilcj2#

操作失败:"未授权此请求使用此权限执行此操作。",403,HEAD,https://{存储帐户}. dfs.core.windows.net/{容器名称}/example/example-0?upn = false。
发生上述错误的主要原因是没有使用存储帐户正确访问服务原则。

    • 我尝试在我的环境中重现同样的错误,但还是出现了同样的错误**。

    • 若要解决上述错误,请按照以下方法操作:**

首先转到Azure存储帐户-〉容器-〉管理ACL

内部管理ACL添加服务原则和访问权限,如图所示。

现在,你可以检查连接到Azure Data Lake Gen2的Azure数据块。

spark.conf.set("fs.azure.account.auth.type.<Storage_account>.dfs.core.windows.net", "OAuth")
spark.conf.set("fs.azure.account.oauth.provider.type.<storage_account>.dfs.core.windows.net", "org.apache.hadoop.fs.azurebfs.oauth2.ClientCredsTokenProvider")
spark.conf.set("fs.azure.account.oauth2.client.id.<storage_account>.dfs.core.windows.net", "<client_id>")
spark.conf.set("fs.azure.account.oauth2.client.secret.<storage_account>.dfs.core.windows.net", "<client_secret>")
spark.conf.set("fs.azure.account.oauth2.client.endpoint.vamblob.dfs.core.windows.net", "https://login.microsoftonline.com/<tenant_id>/oauth2/token")

   
from pyspark.sql.types import StringType
df = spark.createDataFrame(["10","11","13"], StringType()).toDF("values")

display(df)

将数据框架从Azure数据块写入Gen2

df.write \
.format("delta") \
.mode("overwrite") \
.save(f"abfss://<container>@<<storage_account>.dfs.core.windows.net/example/example-0")

相关问题