繁体   English   中英

Azure Synapse Notebook 代码检索火花池标签

[英]Azure Synapse Notebook code to retrieve spark pool tags

以交互方式或在管道中运行 Pyspark 笔记本时,如何检索 Spark Pool 标签? 请提供代码示例。 谢谢

这个问题的答案并不简单,因为 Spark 是开源代码,而 Azure object 标签是 web 服务代码。

我将带您了解我的思考过程以及我是如何解决这个问题的。

首先,spark session 包含在 Synapse 中运行笔记本的集群的名称。 以下代码检索此名称。

%%pyspark

#
# Get spark pool name
#

# Import library
from pyspark.context import SparkContext

# Create context
sc = SparkContext.getOrCreate()

# Get configuration
tuples = sc.getConf().getAll()

# Find spark pool name
for element in tuples:
    if element[0].find('spark.synapse.pool.name') != -1:
        print (element[0])
        print (element[1])
        print ("")

这是执行中的 output。

在此处输入图像描述

下一个任务是为现有的 spark 集群添加标签。 我的标签叫做“stack_overflow_question”,答案是“是”。 这是键值对。

在此处输入图像描述

由于 spark 上下文不包含此标记信息,因此我们必须使用 Azure 工具来获取此信息。

Azure 命令行接口比 REST API 调用更上一层楼。 我将做一个快速测试以确保 list 命令返回我想要的信息。

在此处输入图像描述

我们可以看到,使用 REST API 调用将起作用。

1 - 我们需要创建一个可以访问 Microsoft Graph、用户读取权限的服务原则。 我正在添加两个 MSDN 链接来完成这项任务。

https://docs.microsoft.com/en-us/azure/active-directory/develop/howto-create-service-principal-portal

https://docs.microsoft.com/en-us/graph/migrate-azure-ad-graph-configure-permissions?tabs=powershell

2 - 我们需要编写代码使用服务原理登录到 Azure 并返回访问令牌(承载证书)。

%%pyspark

#
# 2 - Get access token
#

# Import library
import adal

# Key information (parameters)
tenant_id = 'your tenant id'
client_id = 'your client id'
client_secret = 'your client secret'
subscription_id = 'your subscription id'

# Microsoft login url
authority_url = 'https://login.microsoftonline.com/' + tenant_id
context = adal.AuthenticationContext(authority_url)

# Ask for access token
token = context.acquire_token_with_client_credentials(
    resource = 'https://management.azure.com/',
    client_id = client_id,
    client_secret = client_secret
)

# Show token
print(token["accessToken"])

如果一切正常,你应该得到一大串字符。 我只展示了一部分来证明它有效。

在此处输入图像描述

3 - 最后一步是创建一个 REST API 调用以返回我们想要的信息。 下面的代码就是这样做的。 我包括对 API 的 MSDN 参考。

https://docs.microsoft.com/en-us/rest/api/synapse/big-data-pools

%%pyspark

#
# 3 - List pool properties
#

# libraries
import requests
import json

# azure object info
sub_id = "your subscription id"
rg_name = "rg4synapse"
ws_name = "wsn4synapse"
sp_name = "asp4synapse"

# management url
url = ""
url += "https://management.azure.com/subscriptions/{}/".format(sub_id)
url += "resourceGroups/{}/providers/Microsoft.Synapse/".format(rg_name)
url += "workspaces/{}/".format(ws_name)
url += "bigDataPools/{}".format(sp_name)

# access token + api version
headers = {'Authorization': 'Bearer ' + token['accessToken'], 'Content-Type': 'application/json'}
params = {'api-version': '2021-06-01'}

# make rest api call
r = requests.get(url, headers=headers, params=params)

# show the results
print(json.dumps(r.json(), indent=4, separators=(',', ': ')))

我选择将生成的 JSON 文档作为代码放在这篇文章中。 查看整个字符串要容易得多。

{
    "properties": {
        "creationDate": "2021-09-13T19:46:27.95Z",
        "sparkVersion": "2.4",
        "nodeCount": 3,
        "nodeSize": "Small",
        "nodeSizeFamily": "MemoryOptimized",
        "autoScale": {
            "enabled": false,
            "minNodeCount": 3,
            "maxNodeCount": 3
        },
        "autoPause": {
            "enabled": true,
            "delayInMinutes": 15
        },
        "isComputeIsolationEnabled": false,
        "sessionLevelPackagesEnabled": true,
        "cacheSize": 0,
        "dynamicExecutorAllocation": {
            "enabled": false
        },
        "lastSucceededTimestamp": "2022-09-04T18:35:54.55Z",
        "isAutotuneEnabled": false,
        "provisioningState": "Succeeded"
    },
    "id": "/subscriptions/792f5db5-2798-4365-ba7b-e5812052a8d0/resourceGroups/rg4synapse/providers/Microsoft.Synapse/workspaces/wsn4synapse/bigDataPools/asp4synapse",
    "name": "asp4synapse",
    "type": "Microsoft.Synapse/workspaces/bigDataPools",
    "location": "eastus2",
    "tags": {
        "spark_overflow_question": "yes"
    }
}

让我们回顾一下实现这一点的步骤。

1 - 使用 spark session 来识别笔记本正在使用哪个集群。

2 - 定义了一个服务原则,可以读取 Microsoft Graph。

3 - 使用服务原理登录到 Azure 以获取访问令牌。

4 - 使用访问令牌和集群名称调用 rest API 以返回标签属性。

简而言之,这可以解决您的问题。

我把 JSON 文档的解析留给你。 只是一个提示,看看这个链接。

https://www.geeksforgeeks.org/json-loads-in-python/

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM