我正在尝试通过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
2条答案
按热度按时间ttcibm8c1#
当您使用Unity Catalog时,您不需要这些属性-它们在Unity Catalog之前是需要的,现在没有使用,或者仅用于没有UC的集群以进行直接数据访问:
对给定存储位置的身份验证将通过将存储凭据Map到外部位置路径来进行。
但是,将检查正在运行给定代码的用户/服务主体的权限,因此此用户/主体应具有外部位置的相应权限。如果您将此代码作为SP分配的作业运行,则它将具有访问权限。但如果您以自己的身份运行,则在您获得权限之前,它将无法工作。
guykilcj2#
操作失败:"未授权此请求使用此权限执行此操作。",403,HEAD,https://{存储帐户}. dfs.core.windows.net/{容器名称}/example/example-0?upn = false。
发生上述错误的主要原因是没有使用存储帐户正确访问服务原则。
首先转到Azure存储帐户-〉容器-〉管理ACL
内部管理ACL添加服务原则和访问权限,如图所示。
现在,你可以检查连接到Azure Data Lake Gen2的Azure数据块。
将数据框架从Azure数据块写入Gen2