Zestaw SDK usługi HDInsight dla języka Python

Omówienie

Zestaw SDK usługi HDInsight dla języka Python udostępnia klasy i metody, które umożliwiają zarządzanie klastrami usługi HDInsight. Obejmuje to operacje tworzenia, usuwania, aktualizowania, wyświetlania listy, zmieniania rozmiaru, wykonywania akcji skryptu, monitorowania, pobierania właściwości klastrów usługi HDInsight i nie tylko.

Wymagania wstępne

Instalacja zestawu SDK

Zestaw SDK usługi HDInsight dla języka Python można znaleźć w indeksie pakietów języka Python i można go zainstalować, uruchamiając polecenie:

pip install azure-mgmt-hdinsight

Authentication

Najpierw należy uwierzytelnić zestaw SDK w ramach subskrypcji platformy Azure. Postępuj zgodnie z poniższym przykładem, aby utworzyć jednostkę usługi i użyć jej do uwierzytelnienia. Po wykonaniu tej czynności będziesz mieć wystąpienie obiektu HDInsightManagementClient, które zawiera wiele metod (opisanych w poniższych sekcjach), których można użyć do wykonywania operacji zarządzania.

Uwaga

Istnieją inne sposoby uwierzytelniania oprócz poniższego przykładu, które potencjalnie mogą być lepiej dostosowane do Twoich potrzeb. Wszystkie metody zostały opisane tutaj: Uwierzytelnianie przy użyciu bibliotek zarządzania platformy Azure dla języka Python

Przykład uwierzytelniania przy użyciu jednostki usługi

Najpierw zaloguj się do usługi Azure Cloud Shell. Sprawdź, czy obecnie używasz subskrypcji, w której ma zostać utworzona jednostka usługi.

az account show

Informacje o subskrypcji są wyświetlane jako dane 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"
  }
}

Jeśli nie zalogowano się do odpowiedniej subskrypcji, wybierz poprawną, uruchamiając polecenie:

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

Ważne

Jeśli dostawca zasobów usługi HDInsight nie został jeszcze zarejestrowany przez inną metodę (na przykład przez utworzenie klastra usługi HDInsight za pośrednictwem witryny Azure Portal), należy to zrobić raz, zanim będzie można uwierzytelnić. Można to zrobić z poziomu usługi Azure Cloud Shell, uruchamiając następujące polecenie:

az provider register --namespace Microsoft.HDInsight

Następnie wybierz nazwę jednostki usługi i utwórz ją za pomocą następującego polecenia:

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

Informacje o jednostce usługi są wyświetlane jako dane 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/"
}

Skopiuj poniższy fragment kodu języka Python i wypełnij TENANT_IDciągi , CLIENT_ID, CLIENT_SECRETi SUBSCRIPTION_ID ciągami z kodu JSON zwróconego po uruchomieniu polecenia w celu utworzenia jednostki usługi.

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)

Zarządzanie klastrami

Uwaga

W tej sekcji założono, że wystąpienie zostało już uwierzytelnione i utworzone HDInsightManagementClient i przechowywane w zmiennej o nazwie client. Instrukcje dotyczące uwierzytelniania i uzyskiwania elementu HDInsightManagementClient można znaleźć w sekcji Uwierzytelnianie powyżej.

Tworzenie klastra

Nowy klaster można utworzyć, wywołując polecenie client.clusters.create().

Samples

Przykłady kodu do tworzenia kilku typowych typów klastrów usługi HDInsight są dostępne: przykłady języka Python w usłudze HDInsight.

Przykład

W tym przykładzie pokazano, jak utworzyć klaster Spark z 2 węzłami głównymi i 1 węzłem roboczym.

Uwaga

Najpierw musisz utworzyć grupę zasobów i konto magazynu, jak wyjaśniono poniżej. Jeśli zostały one już utworzone, możesz pominąć te kroki.

Tworzenie grupy zasobów

Grupę zasobów można utworzyć przy użyciu usługi Azure Cloud Shell, uruchamiając polecenie

az group create -l <Region Name (i.e. eastus)> --n <Resource Group Name>
Tworzenie konta magazynu

Konto magazynu można utworzyć przy użyciu usługi Azure Cloud Shell, uruchamiając polecenie:

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>

Teraz uruchom następujące polecenie, aby uzyskać klucz dla konta magazynu (będzie to konieczne do utworzenia klastra):

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

Poniższy fragment kodu języka Python tworzy klaster Spark z 2 węzłami głównymi i 1 węzłem roboczym. Wypełnij puste zmienne, jak wyjaśniono w komentarzach i możesz zmienić inne parametry zgodnie z twoimi potrzebami.

# 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
    ))

Pobieranie szczegółów klastra

Aby uzyskać właściwości dla danego klastra:

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

Przykład

Możesz użyć polecenia get , aby potwierdzić, że klaster został pomyślnie utworzony.

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

Dane wyjściowe powinny wyglądać następująco:

{'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>}

Wyświetlanie listy klastrów

Wyświetlanie listy klastrów w ramach subskrypcji

client.clusters.list()

Wyświetlanie listy klastrów według grupy zasobów

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

Uwaga

Zarówno list() , jak i list_by_resource_group() zwraca ClusterPaged obiekt. Wywołanie advance_page() zwraca listę klastrów na tej stronie i powoduje przejście ClusterPaged obiektu do następnej strony. Można to powtórzyć do momentu zgłoszenia wyjątku StopIteration , co oznacza, że nie ma więcej stron.

Przykład

Poniższy przykład wyświetla właściwości wszystkich klastrów dla bieżącej subskrypcji:

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

Usuwanie klastra

Aby usunąć klaster:

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

Aktualizowanie tagów klastra

Tagi danego klastra można zaktualizować w następujący sposób:

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

Przykład

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

Zmienianie rozmiaru klastra

Możesz zmienić rozmiar danego klastra na liczbę węzłów roboczych, określając nowy rozmiar w następujący sposób:

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

Monitorowanie klastrów

Zestaw SDK zarządzania usługi HDInsight może również służyć do zarządzania monitorowaniem w klastrach za pośrednictwem pakietu Operations Management Suite (OMS).

Włączanie monitorowania pakietu OMS

Uwaga

Aby włączyć monitorowanie pakietu OMS, musisz mieć istniejący obszar roboczy usługi Log Analytics. Jeśli jeszcze go nie utworzono, możesz dowiedzieć się, jak to zrobić w tym miejscu: Tworzenie obszaru roboczego usługi Log Analytics w Azure Portal.

Aby włączyć monitorowanie pakietu OMS w klastrze:

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

Wyświetlanie stanu monitorowania pakietu OMS

Aby uzyskać stan pakietu OMS w klastrze:

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

Wyłączanie monitorowania pakietu OMS

Aby wyłączyć usługę OMS w klastrze:

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

Akcje skryptu

Usługa HDInsight udostępnia metodę konfiguracji o nazwie akcje skryptu, które wywołują niestandardowe skrypty w celu dostosowania klastra.

Uwaga

Więcej informacji na temat używania akcji skryptu można znaleźć tutaj: Dostosowywanie klastrów usługi HDInsight opartych na systemie Linux przy użyciu akcji skryptu

Wykonywanie akcji skryptu

Aby wykonać akcje skryptu w danym klastrze:

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

Usuń akcję skryptu

Aby usunąć określoną akcję utrwalonego skryptu w danym klastrze:

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

Lista akcji utrwalonego skryptu

Uwaga

list() i list_persisted_scripts() zwraca RuntimeScriptActionDetailPaged obiekt. Wywołanie advance_page() zwraca listę na RuntimeScriptActionDetail tej stronie i powoduje przejście RuntimeScriptActionDetailPaged obiektu do następnej strony. Można to powtórzyć do momentu zgłoszenia wyjątku StopIteration , co oznacza, że nie ma więcej stron. Zobacz przykład poniżej.

Aby wyświetlić listę wszystkich akcji utrwalonego skryptu dla określonego klastra:

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

Przykład

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

Wyświetl listę historii wykonywania wszystkich skryptów

Aby wyświetlić listę historii wykonywania wszystkich skryptów dla określonego klastra:

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

Przykład

W tym przykładzie zostaną wydrukowane wszystkie szczegóły wszystkich poprzednich wykonań skryptów.

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