Пакет SDK HDInsight для Python

Обзор

Пакет SDK HDInsight для Python предоставляет классы и методы для управления кластерами HDInsight. Пакет также поддерживает операции создания, удаления, обновления, получения списков, масштабирования, выполнения скриптов, мониторинга, получения свойства кластеров HDInsight и т. д.

Предварительные требования

Установка пакета SDK

Пакет SDK HDInsight для Python можно найти на сайте Python Package Index и установить с помощью команды:

pip install azure-mgmt-hdinsight

Аутентификация

Для использования пакета SDK нужно выполнить аутентификацию с помощью подписки Azure. Ниже описано, как создать субъект-службу и использовать его для аутентификации. После этого вы получите экземпляр HDInsightManagementClient, в котором доступны различные методы (описанные далее) для операций управления.

Примечание

Кроме описанного выше, есть и другие методы аутентификации, которые могут оказаться удобнее для вас. Все методы аутентификации см. в руководстве по аутентификации с использованием библиотек управления Azure для Python.

Пример аутентификации с помощью субъекта-службы

Сначала войдите в 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>

Важно!

Если вы еще не зарегистрировали поставщик ресурсов HDInsight с помощью другого метода (например, создав кластер HDInsight на портале Azure), вам необходимо это сделать, прежде чем выполнять аутентификацию. Это можно сделать с помощью 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_ID, CLIENT_ID, CLIENT_SECRET и SUBSCRIPTION_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: примеры python в HDInsight.

Пример

В этом примере показано, как создать кластер 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 создает кластер 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>)

Мониторинг кластера

Пакет Azure Management SDK для HDInsight также позволяет управлять мониторингом кластеров с помощью Operations Management Suite (OMS).

Включение мониторинга OMS

Примечание

Чтобы включить мониторинг OMS, требуется рабочая область Log Analytics. Если вы не создавали такую рабочую область, см. статью Создание рабочей области Log Analytics на портале Azure.

Чтобы включить мониторинг 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 поддерживается метод конфигурации с использованием, действий скриптов, который вызывает пользовательские скрипты для настройки кластера.

Примечание

Дополнительные сведения о действиях скриптов см. в статье Настройка кластеров HDInsight под управлением Linux с помощью действий сценариев.

Выполнение действий скриптов

Для выполнения действий скриптов в указанном кластере:

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