如何将 AMLS 连接到 ADLS Gen 2?

Posted

技术标签:

【中文标题】如何将 AMLS 连接到 ADLS Gen 2?【英文标题】:How to connect AMLS to ADLS Gen 2? 【发布时间】:2021-01-01 14:28:18 【问题描述】:

我想在我的 Azure 机器学习工作区 (azureml-core==1.12.0) 中注册来自 ADLS Gen2 的数据集。鉴于.register_azure_data_lake_gen2() 的 Python SDK documentation 中不需要服务主体信息,我成功使用以下代码将 ADLS gen2 注册为数据存储区:

from azureml.core import Datastore

adlsgen2_datastore_name = os.environ['adlsgen2_datastore_name']
account_name=os.environ['account_name'] # ADLS Gen2 account name
file_system=os.environ['filesystem']

adlsgen2_datastore = Datastore.register_azure_data_lake_gen2(
    workspace=ws,
    datastore_name=adlsgen2_datastore_name,
    account_name=account_name, 
    filesystem=file_system
)

但是,当我尝试注册数据集时,使用

from azureml.core import Dataset
adls_ds = Datastore.get(ws, datastore_name=adlsgen2_datastore_name)
data = Dataset.Tabular.from_delimited_files((adls_ds, 'folder/data.csv'))

我收到一个错误

无法从指定路径加载任何数据。确保路径可访问并包含数据。 ScriptExecutionException 是由 StreamAccessException 引起的。 StreamAccessException 是由 AuthenticationException 引起的。 'AdlsGen2-ReadHeaders' for '[REDACTED]' on storage failed with status code 'Forbidden'(此请求无权使用此权限执行此操作。),客户端请求 ID ,请求 ID 。错误信息:[已编辑] | session_id=

我是否需要启用服务主体才能使其正常工作?使用 ML Studio UI,似乎需要服务主体来注册数据存储。

我注意到的另一个问题是 AMLS 正在尝试访问此处的数据集: https://adls_gen2_account_name.**dfs**.core.windows.net/container/folder/data.csv 而 ADLS Gen2 中的实际 URI 是:https://adls_gen2_account_name.**blob**.core.windows.net/container/folder/data.csv

【问题讨论】:

【参考方案1】:

根据这个documentation,你需要启用服务主体。

1.您需要注册您的应用程序并授予服务主体存储 Blob 数据读取器访问权限

2.试试这个代码:

adlsgen2_datastore = Datastore.register_azure_data_lake_gen2(workspace=ws,
                                                             datastore_name=adlsgen2_datastore_name,
                                                             account_name=account_name,
                                                             filesystem=file_system,
                                                             tenant_id=tenant_id,
                                                             client_id=client_id,
                                                             client_secret=client_secret
                                                             )

adls_ds = Datastore.get(ws, datastore_name=adlsgen2_datastore_name)
dataset = Dataset.Tabular.from_delimited_files((adls_ds,'sample.csv'))
print(dataset.to_pandas_dataframe())

结果:

【讨论】:

以上是关于如何将 AMLS 连接到 ADLS Gen 2?的主要内容,如果未能解决你的问题,请参考以下文章

如何在 python 上使用 presto 连接到 Azure 数据湖存储?

使用 Databricks 将文件从 Azure 文件移动到 ADLS Gen 2 并返回

如何使用 Azure databricks 通过 ADLS gen 2 中的多个工作表读取和写入 excel 数据

我们如何修复 ADLS Gen 2 中的增量位置文件

将 ADLS Gen 2 中的数据加载到 Azure Synapse

使用 Python 或 Java 从本地将数据上传到 Azure ADLS Gen2