我正在用 sql 编写 delta live table 笔记本来访问数据湖中的文件,如下所示:
CREATE OR REFRESH STREAMING LIVE TABLE MyTable
AS SELECT * FROM cloud_files("DataLakeSource/MyTableFiles", "parquet", map("cloudFiles.inferColumnTypes", "true"))
每当我需要访问 Azure Data Lake 时,我通常会执行以下操作来设置访问:
service_credential = dbutils.secrets.get(scope="myscope",key="mykey")
spark.conf.set("fs.azure.account.auth.type.mylake.dfs.core.windows.net", "OAuth")
spark.conf.set("fs.azure.account.oauth.provider.type.mylake.dfs.core.windows.net", "org.apache.hadoop.fs.azurebfs.oauth2.ClientCredsTokenProvider")
spark.conf.set("fs.azure.account.oauth2.client.id.MyLake.dfs.core.windows.net", "99999999-9999-9999-9999-999999999")
spark.conf.set("fs.azure.account.oauth2.client.secret.mylake.dfs.core.windows.net", service_credential)
spark.conf.set("fs.azure.account.oauth2.client.endpoint.mylake.dfs.core.windows.net", "https://login.microsoftonline.com/99999999-9999-9999-9999-9999999999/oauth2/token")
由于我无法像上面那样添加 python 单元来设置 sql delta live 表笔记本内的访问权限,因此如何/在哪里添加用于访问数据湖文件的配置?
我考虑过在配置下将配置信息添加到管道中,但这当然不适用于调用 dbutils.secrets.get
您可以创建一个单独的笔记本,其中包含连接信息并首先调用它,然后调用 SQL delta 实时表笔记本。
创建 Delta Live Tables 管道时,使用两个笔记本:
CREATE OR REFRESH STREAMING LIVE TABLE MyTable
定义的 SQL 笔记本service_credential
和 fs.azure.account
属性的 Python 笔记本DLT 运行时应该能够解析笔记本的顺序并启动授权。
亚历克斯·奥特的评论似乎是正确的:
您需要提供此配置作为管道定义的一部分。
两个笔记本之间不存在依赖关系(一个使用 SQL,另一个使用
spark.conf.set
甚至 SET
),因此 DLT 运行时无法选择一个作为第一个执行,因此设置属性。
更有趣的(在回答这个问题时我并不真正了解)如下(在为 Delta Live Tables 配置管道设置中找到):
您可以使用 UI 或 JSON 规范配置大多数设置。一些高级选项只能使用 JSON 配置来使用。
然后在配置您的计算设置:
Delta Live Tables UI 中的计算设置主要针对用于管道更新的默认集群。如果您选择指定需要凭据才能访问数据的存储位置,则必须确保维护集群也配置了这些权限。
Delta Live Tables 为集群设置提供了与 Databricks 上其他计算类似的选项。与其他管道设置一样,您可以修改集群的 JSON 配置以指定 UI 中不存在的选项
换句话说,您必须使用 Delta Live Tables API 或类似工具(Databricks Terraform 提供商),以便您可以访问集群相关设置。
另一个选项似乎是 使用实例配置文件配置 S3 访问,它要求您 “在包含 Databricks 工作区的 AWS 账户中拥有足够的权限,并且是 Databricks 工作区管理员。”
经过大量搜索,我终于找到了说明如何执行此操作的必要文档。我在这里添加答案是为了让其他有同样问题的人受益。 您需要更新管道定义 JSON,如 this 链接所示。 在我的示例中,我使用了帐户密钥,但您可以使用与任何其他密钥相同的方法。 您的集群定义将如下所示。
"clusters": [
{
"label": "default",
"node_type_id": "Standard_DS3_v2",
"driver_node_type_id": "Standard_DS3_v2",
"num_workers": 0
},
{
"label": "updates",
"spark_conf": {
"spark.hadoop.fs.azure.account.key.<storage_acct>.dfs.core.windows.net": "{{secrets/<scope_name>/<secret_name>}}"
}
}
],
您需要为维护集群定义重复此操作。