你当前正在访问 Microsoft Azure Global Edition 技术文档网站。 如果需要访问由世纪互联运营的 Microsoft Azure 中国技术文档网站,请访问 https://docs.azure.cn

HDInsight SDK for Python

概述

HDInsight SDK for Python 提供用于管理 HDInsight 群集的类和方法。 该 SDK 包含用于创建、删除、更新、列出、调整大小、执行脚本操作,以及监视、获取 HDInsight 群集属性等操作。

先决条件

SDK 安装

HDInsight SDK for Python 在 Python Package Index 中提供,可以通过运行以下命令来安装:

pip install azure-mgmt-hdinsight

身份验证

首先需要使用 Azure 订阅对该 SDK 进行身份验证。 请遵循以下示例创建服务主体,然后使用该服务主体进行身份验证。 完成此操作后,将会获得 HDInsightManagementClient 的实例,其中包含可用于执行管理操作的多个方法(以下部分将概述这些方法)。

注意

除了以下示例中所示的方法以外,还有其他一些身份验证方法可能更符合你的需要。 使用用于 Python 的 Azure 管理库进行身份验证中概述了所有方法

使用服务主体的身份验证示例

首先登录到 Azure Cloud Shell。 验证当前使用的是要在其中创建服务主体的订阅。

az account show

订阅信息将显示为 JSON。

{
  "environmentName": "AzureCloud",
  "id": "XXXXXXXX-XXXX-XXXX-XXXX-XXXXXXXXXXXX",
  "isDefault": true,
  "name": "XXXXXXX",
  "state": "Enabled",
  "tenantId": "XXXXXXXX-XXXX-XXXX-XXXX-XXXXXXXXXXXX",
  "user": {
    "cloudShellID": true,
    "name": "XXX@XXX.XXX",
    "type": "user"
  }
}

如果尚未登录到正确的订阅,请运行以下命令选择正确的订阅:

az account set -s <name or ID of subscription>

重要

如果尚未通过其他方法(例如,通过 Azure 门户创建 HDInsight 群集)注册 HDInsight 资源提供程序,则需要先执行此操作一次,然后才能进行身份验证。 可以在 Azure Cloud Shell 中运行以下命令来完成此操作:

az provider register --namespace Microsoft.HDInsight

接下来,选择服务主体的名称,然后使用以下命令创建服务主体:

az ad sp create-for-rbac --name <Service Principal Name> --role Contributor --sdk-auth

服务主体信息将以 JSON 格式显示。

{
  "clientId": "XXXXXXXX-XXXX-XXXX-XXXX-XXXXXXXXXXXX",
  "clientSecret": "XXXXXXXX-XXXX-XXXX-XXXX-XXXXXXXXXXXX",
  "subscriptionId": "XXXXXXXX-XXXX-XXXX-XXXX-XXXXXXXXXXXX",
  "tenantId": "XXXXXXXX-XXXX-XXXX-XXXX-XXXXXXXXXXXX",
  "activeDirectoryEndpointUrl": "https://login.microsoftonline.com",
  "resourceManagerEndpointUrl": "https://management.azure.com/",
  "activeDirectoryGraphResourceId": "https://graph.windows.net/",
  "sqlManagementEndpointUrl": "https://management.core.windows.net:8443/",
  "galleryEndpointUrl": "https://gallery.azure.com/",
  "managementEndpointUrl": "https://management.core.windows.net/"
}

复制以下 Python 代码片段,并在 TENANT_IDCLIENT_IDCLIENT_SECRETSUBSCRIPTION_ID 中填写运行创建服务主体的命令后返回的 JSON 中的字符串。

from azure.mgmt.hdinsight import HDInsightManagementClient
from azure.common.credentials import ServicePrincipalCredentials
from azure.mgmt.hdinsight.models import *

# Tenant ID for your Azure Subscription
TENANT_ID = ''
# Your Service Principal App Client ID
CLIENT_ID = ''
# Your Service Principal Client Secret
CLIENT_SECRET = ''
# Your Azure Subscription ID
SUBSCRIPTION_ID = ''

credentials = ServicePrincipalCredentials(
    client_id = CLIENT_ID,
    secret = CLIENT_SECRET,
    tenant = TENANT_ID
)

client = HDInsightManagementClient(credentials, SUBSCRIPTION_ID)

群集管理

注意

本部分假设你已完成身份验证,已构造 HDInsightManagementClient 实例并已将其存储在名为 client 的变量中。 在前面的“身份验证”部分可以找到有关身份验证和获取 HDInsightManagementClient 的说明。

创建群集

可以通过调用 client.clusters.create() 来创建新群集。

示例

提供了用于创建几种常见 HDInsight 群集的代码示例: HDInsight Python 示例

示例

本示例演示如何创建包含 2 个头节点和 1 个工作节点的 Spark 群集。

备注

首先需要创建一个资源组和存储帐户,下面将予以介绍。 如果已创建资源组和存储帐户,则可以跳过这些步骤。

创建资源组

可以在 Azure Cloud Shell 中运行以下命令来创建资源组

az group create -l <Region Name (i.e. eastus)> --n <Resource Group Name>
创建存储帐户

可以在 Azure Cloud Shell 中运行以下命令来创建存储帐户

az storage account create -n <Storage Account Name> -g <Existing Resource Group Name> -l <Region Name (i.e. eastus)> --sku <SKU i.e. Standard_LRS>

现在,运行以下命令获取存储帐户的密钥(创建群集时需要用到):

az storage account keys list -n <Storage Account Name>

以下 Python 代码片段创建包含 2 个头节点和 1 个工作节点的 Spark 群集。 按照注释中所述填写空白变量,并根据具体的需要任意更改其他参数。

# The name for the cluster you are creating
cluster_name = ""
# The name of your existing Resource Group
resource_group_name = ""
# Choose a username
username = ""
# Choose a password
password = ""
# Replace <> with the name of your storage account
storage_account = "<>.blob.core.windows.net"
# Storage account key you obtained above
storage_account_key = ""
# Choose a region
location = ""
container = "default"

params = ClusterCreateProperties(
    cluster_version="3.6",
    os_type=OSType.linux,
    tier=Tier.standard,
    cluster_definition=ClusterDefinition(
        kind="spark",
        configurations={
            "gateway": {
                "restAuthCredential.enabled_credential": "True",
                "restAuthCredential.username": username,
                "restAuthCredential.password": password
            }
        }
    ),
    compute_profile=ComputeProfile(
        roles=[
            Role(
                name="headnode",
                target_instance_count=2,
                hardware_profile=HardwareProfile(vm_size="Large"),
                os_profile=OsProfile(
                    linux_operating_system_profile=LinuxOperatingSystemProfile(
                        username=username,
                        password=password
                    )
                )
            ),
            Role(
                name="workernode",
                target_instance_count=1,
                hardware_profile=HardwareProfile(vm_size="Large"),
                os_profile=OsProfile(
                    linux_operating_system_profile=LinuxOperatingSystemProfile(
                        username=username,
                        password=password
                    )
                )
            )
        ]
    ),
    storage_profile=StorageProfile(
        storageaccounts=[StorageAccount(
            name=storage_account,
            key=storage_account_key,
            container=container,
            is_default=True
        )]
    )
)

client.clusters.create(
    cluster_name=cluster_name,
    resource_group_name=resource_group_name,
    parameters=ClusterCreateParametersExtended(
        location=location,
        tags={},
        properties=params
    ))

获取群集详细信息

获取给定群集的属性:

client.clusters.get("<Resource Group Name>", "<Cluster Name>")

示例

可以使用 get 来确认已成功创建群集。

my_cluster = client.clusters.get("<Resource Group Name>", "<Cluster Name>")
print(my_cluster)

输出应如下所示:

{'additional_properties': {}, 'id': '/subscriptions/XXXXXXXX-XXXX-XXXX-XXXX-XXXXXXXXXXXX/resourceGroups/<Resource Group Name>/providers/Microsoft.HDInsight/clusters/<Cluster Name>', 'name': '<Cluster Name>', 'type': 'Microsoft.HDInsight/clusters', 'location': '<Location>', 'tags': {}, 'etag': 'XXXXXXXX-XXXX-XXXX-XXXX-XXXXXXXXXXXX', 'properties': <azure.mgmt.hdinsight.models.cluster_get_properties_py3.ClusterGetProperties object at 0x0000013766D68048>}

列出群集

列出订阅下的群集

client.clusters.list()

按资源组列出群集

client.clusters.list_by_resource_group("<Resource Group Name>")

注意

list()list_by_resource_group() 都返回 ClusterPaged 对象。 调用 advance_page() 会在该页上返回群集列表,并会将 ClusterPaged 对象推到下一页。 此操作可以一直重复,直至引发 StopIteration 异常(表明没有其他页)。

示例

以下示例列显当前订阅的所有群集的属性:

clusters_paged = client.clusters.list()
while True:
  try:
    for cluster in clusters_paged.advance_page():
      print(cluster)
  except StopIteration: 
    break

删除群集

删除群集:

client.clusters.delete("<Resource Group Name>", "<Cluster Name>")

更新群集标记

可按如下所示更新给定群集的标记:

client.clusters.update("<Resource Group Name>", "<Cluster Name>", tags={<Dictionary of Tags>})

示例

client.clusters.update("<Resource Group Name>", "<Cluster Name>", tags={"tag1Name" : "tag1Value", "tag2Name" : "tag2Value"})

调整群集大小

可以通过指定新大小来调整给定群集的工作节点数,如下所示:

client.clusters.resize("<Resource Group Name>", "<Cluster Name>", target_instance_count=<Num of Worker Nodes>)

群集监视

使用 HDInsight 管理 SDK 还可以通过 Operations Management Suite (OMS) 来管理群集的监视。

启用 OMS 监视

注意

若要启用 OMS 监视,必须已有一个 Log Analytics 工作区。 如果尚未创建工作区,可在此了解创建方法:在 Azure 门户中创建 Log Analytics 工作区

在群集上启用 OMS 监视:

client.extension.enable_monitoring("<Resource Group Name>", "<Cluster Name>", workspace_id="<Workspace Id>")

查看 OMS 监视状态

获取群集上的 OMS 状态:

client.extension.get_monitoring_status("<Resource Group Name", "Cluster Name")

禁用 OMS 监视

在群集上禁用 OMS:

client.extension.disable_monitoring("<Resource Group Name>", "<Cluster Name>")

脚本操作

HDInsight 提供一个称为“脚本操作”的配置方法,该方法可调用用于自定义群集的自定义脚本。

备注

有关如何使用脚本操作的详细信息见此处:使用脚本操作自定义基于 Linux 的 HDInsight 群集

执行脚本操作

若要在给定群集上执行脚本操作,请使用以下命令:

script_action1 = RuntimeScriptAction(name="<Script Name>", uri="<URL To Script>", roles=[<List of Roles>]) #valid roles are "headnode", "workernode", "zookeepernode", and "edgenode"

client.clusters.execute_script_actions("<Resource Group Name>", "<Cluster Name>", <persist_on_success (bool)>, script_actions=[script_action1]) #add more RuntimeScriptActions to the list to execute multiple scripts

删除脚本操作

删除给定群集上指定的持久化脚本操作:

client.script_actions.delete("<Resource Group Name>", "<Cluster Name", "<Script Name>")

列出持久化脚本操作

注意

list()list_persisted_scripts() 返回 RuntimeScriptActionDetailPaged 对象。 调用 advance_page() 会在该页上返回 RuntimeScriptActionDetail 列表,并会将 RuntimeScriptActionDetailPaged 对象推到下一页。 此操作可以一直重复,直至引发 StopIteration 异常(表明没有其他页)。 请参阅以下示例。

列出指定群集的所有持久化脚本操作:

client.script_actions.list_persisted_scripts("<Resource Group Name>", "<Cluster Name>")

示例

scripts_paged = client.script_actions.list_persisted_scripts(resource_group_name, cluster_name)
while True:
  try:
    for script in scripts_paged.advance_page():
      print(script)
  except StopIteration:
    break

列出所有脚本的执行历史记录

列出指定群集的所有脚本的执行历史记录:

client.script_execution_history.list("<Resource Group Name>", "<Cluster Name>")

示例

此示例列显以往所有脚本执行活动的所有详细信息。

script_executions_paged = client.script_execution_history.list("<Resource Group Name>", "<Cluster Name>")
while True:
  try:
    for script in script_executions_paged.advance_page():            
      print(script)
    except StopIteration:       
      break