使用帐户密钥身份验证和 ABFS 驱动程序从 Synapse Notebook 读取 ADLS
Reading from ADLS from a Synapse Notebook with account key authentification and ABFS driver
我正在尝试从 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)
我想按照 docs 建议使用 ABFS 驱动程序:
Optimized driver: The ABFS driver is optimized specifically for big data analytics. The corresponding REST APIs are surfaced through the endpoint 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)
您收到此邮件是因为没有权限。您可以在创建 synapse 工作区时观察到它确实表示我们需要其他需要完成的用户访问角色。必须为存储帐户分配 Storage Blob Data Contributor 角色 才能访问 adls 工作区。
以下是Grant permissions to managed identity in Synapse workspace
的步骤
参考资料:
很有帮助。
显然 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。
直到 Microsoft 决定让人们在 Synapse 中使用 ABFS + 帐户密钥进行身份验证之前,我真的被困在两个非常愚蠢和有限的解决方案之间。
我正在尝试从 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)
我想按照 docs 建议使用 ABFS 驱动程序:
Optimized driver: The ABFS driver is optimized specifically for big data analytics. The corresponding REST APIs are surfaced through the endpoint 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)
您收到此邮件是因为没有权限。您可以在创建 synapse 工作区时观察到它确实表示我们需要其他需要完成的用户访问角色。必须为存储帐户分配 Storage Blob Data Contributor 角色 才能访问 adls 工作区。
以下是Grant permissions to managed identity in Synapse workspace
的步骤参考资料:
显然 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。
直到 Microsoft 决定让人们在 Synapse 中使用 ABFS + 帐户密钥进行身份验证之前,我真的被困在两个非常愚蠢和有限的解决方案之间。