如何使用服务主体从第三方应用程序使用 SQLAlchemy 连接到 Azure Databricks 的 Hive?
How to connect to Azure Databricks' Hive using a SQLAlchemy from a third party app using a service principal?
我想将 Superset 连接到 Databricks 以查询表。 Superset 使用 SQLAlchemy 连接到需要 PAT(个人访问令牌)才能访问的数据库。
当我使用通过 Databricks web 在我的帐户上生成的 PAT UI 时,可以连接和 运行 查询吗?但我不想在生产环境中使用我的个人令牌。即便如此,我还是无法找到如何为服务主体生成类似 PAT 的令牌。
有效的 SQLAlchemy URI 如下所示:
databricks+pyhive://token:XXXXXXXXXX@aaa-111111111111.1.azuredatabricks.net:443/default?http_path=sql%2Fprotocolv1%qqq%wwwwwwwwwww1%eeeeeeee-1111111-foobar00
查看Azure文档后,有两种方法可以运行在Databricks和其他服务之间进行查询:
- 为要与 Superset 关联的服务主体创建 PAT。
- 为 Superset 创建一个用户 AD 帐户。
对于第一个也是首选的方法,我能够推进,但无法生成服务主体的 PAT:
我能够在 Azure 的 AD 上注册一个应用程序。
所以我得到了租户 ID、客户端 ID 并为注册的应用程序创建了一个秘密。
有了这些信息,我就能够 curl Azure 并接收该应用程序的 JWT 令牌。
但是文档中提到的所有令牌都是 JTW 的 OAUTH2 令牌,它似乎不适用于 SQLAlchemy URI。
我知道可以为服务主体生成 PAT,因为 documentation 上提到了如何读取、更新和删除服务主体的 PAT。但它没有关于如何为服务主体创建 PAT 的信息。
我更愿意避免使用第二种方法(为 Superset 创建 AD 用户),因为我不允许 create/manage AD 用户。
总而言之,我有一个有效的 SQLAlchemy URI,但我想使用生成的令牌,与服务主体相关联,而不是使用我的 PAT。但是我找不到如何生成该令牌(我只找到了有关如何生成 OAUTH2 令牌的文档)。
您可以按如下方式为服务主体创建 PAT(示例取自文档,执行前执行 export DATABRICKS_HOST="https://hostname"
):
- 使用 SCIM API (doc):
将服务主体添加到 Databricks 工作区
curl -X POST '$DATABRICKS_HOST/api/2.0/preview/scim/v2/ServicePrincipals' \
--header 'Content-Type: application/scim+json' \
--header 'Authorization: Bearer <personal-access-token>' \
--data-raw '{
"schemas":[
"urn:ietf:params:scim:schemas:core:2.0:ServicePrincipal"
],
"applicationId":"<application-id>",
"displayName": "test-sp",
"entitlements":[
{
"value":"allow-cluster-create"
}
]
}'
- 获取服务主体的 AAD 令牌(doc,另一种选择是使用 az-cli):
export DATABRICKS_TOKEN=$(curl -X POST -H 'Content-Type: application/x-www-form-urlencoded' \
-d 'grant_type=client_credentials&client_id=<client-id>&resource=2ff814a6-3304-4ab8-85cb-cd0e6f879c1d&client_secret=<application-secret>' \
https://login.microsoftonline.com/<tenant-id>/oauth2/token|jq -r .accessToken)
- 使用 AAD 令牌 (doc) 生成令牌:
curl -s -n -X POST "$DATABRICKS_HOST/api/2.0/token/create" --data-raw '{
"lifetime_seconds": 100,
"comment": "token for superset"
}' -H "Authorization: Bearer $DATABRICKS_TOKEN"
我想将 Superset 连接到 Databricks 以查询表。 Superset 使用 SQLAlchemy 连接到需要 PAT(个人访问令牌)才能访问的数据库。
当我使用通过 Databricks web 在我的帐户上生成的 PAT UI 时,可以连接和 运行 查询吗?但我不想在生产环境中使用我的个人令牌。即便如此,我还是无法找到如何为服务主体生成类似 PAT 的令牌。
有效的 SQLAlchemy URI 如下所示:
databricks+pyhive://token:XXXXXXXXXX@aaa-111111111111.1.azuredatabricks.net:443/default?http_path=sql%2Fprotocolv1%qqq%wwwwwwwwwww1%eeeeeeee-1111111-foobar00
查看Azure文档后,有两种方法可以运行在Databricks和其他服务之间进行查询:
- 为要与 Superset 关联的服务主体创建 PAT。
- 为 Superset 创建一个用户 AD 帐户。
对于第一个也是首选的方法,我能够推进,但无法生成服务主体的 PAT: 我能够在 Azure 的 AD 上注册一个应用程序。 所以我得到了租户 ID、客户端 ID 并为注册的应用程序创建了一个秘密。 有了这些信息,我就能够 curl Azure 并接收该应用程序的 JWT 令牌。 但是文档中提到的所有令牌都是 JTW 的 OAUTH2 令牌,它似乎不适用于 SQLAlchemy URI。
我知道可以为服务主体生成 PAT,因为 documentation 上提到了如何读取、更新和删除服务主体的 PAT。但它没有关于如何为服务主体创建 PAT 的信息。
我更愿意避免使用第二种方法(为 Superset 创建 AD 用户),因为我不允许 create/manage AD 用户。
总而言之,我有一个有效的 SQLAlchemy URI,但我想使用生成的令牌,与服务主体相关联,而不是使用我的 PAT。但是我找不到如何生成该令牌(我只找到了有关如何生成 OAUTH2 令牌的文档)。
您可以按如下方式为服务主体创建 PAT(示例取自文档,执行前执行 export DATABRICKS_HOST="https://hostname"
):
- 使用 SCIM API (doc): 将服务主体添加到 Databricks 工作区
curl -X POST '$DATABRICKS_HOST/api/2.0/preview/scim/v2/ServicePrincipals' \
--header 'Content-Type: application/scim+json' \
--header 'Authorization: Bearer <personal-access-token>' \
--data-raw '{
"schemas":[
"urn:ietf:params:scim:schemas:core:2.0:ServicePrincipal"
],
"applicationId":"<application-id>",
"displayName": "test-sp",
"entitlements":[
{
"value":"allow-cluster-create"
}
]
}'
- 获取服务主体的 AAD 令牌(doc,另一种选择是使用 az-cli):
export DATABRICKS_TOKEN=$(curl -X POST -H 'Content-Type: application/x-www-form-urlencoded' \
-d 'grant_type=client_credentials&client_id=<client-id>&resource=2ff814a6-3304-4ab8-85cb-cd0e6f879c1d&client_secret=<application-secret>' \
https://login.microsoftonline.com/<tenant-id>/oauth2/token|jq -r .accessToken)
- 使用 AAD 令牌 (doc) 生成令牌:
curl -s -n -X POST "$DATABRICKS_HOST/api/2.0/token/create" --data-raw '{
"lifetime_seconds": 100,
"comment": "token for superset"
}' -H "Authorization: Bearer $DATABRICKS_TOKEN"