Поделиться через


Создание кластеров Apache Hadoop с помощью REST API Azure

Узнайте, как создать кластер HDInsight с помощью шаблона Azure Resource Manager и REST API Azure.

REST API Azure позволяет выполнять операции управления службами, размещенными на платформе Azure, включая создание новых ресурсов, таких как кластеры HDInsight.

Примечание.

Действия, описанные в этом документе, используют curl (https://curl.haxx.se/) утилиту для взаимодействия с REST API Azure.

Создание шаблона

Шаблоны Azure Resource Manager — это документы JSON, описывающие группу ресурсов и все ресурсы в ней (например, HDInsight.) Этот подход на основе шаблона позволяет определить ресурсы, необходимые для HDInsight в одном шаблоне.

Следующий документ JSON — это слияние файлов шаблонов и параметров из https://github.com/Azure/azure-quickstart-templates/tree/master/quickstarts/microsoft.hdinsight/hdinsight-linux-ssh-password/azuredeploy.json, который создает кластер под управлением Linux с помощью пароля для защиты учетной записи пользователя SSH.

{
    "properties": {
        "template": {
            "$schema": "https://schema.management.azure.com/schemas/2015-01-01/deploymentTemplate.json#",
            "contentVersion": "1.0.0.0",
            "parameters": {
                "clusterType": {
                    "type": "string",
                    "allowedValues": ["hadoop",
                    "hbase",
                    "spark"],
                    "metadata": {
                        "description": "The type of the HDInsight cluster to create."
                    }
                },
                "clusterName": {
                    "type": "string",
                    "metadata": {
                        "description": "The name of the HDInsight cluster to create."
                    }
                },
                "clusterLoginUserName": {
                    "type": "string",
                    "metadata": {
                        "description": "These credentials can be used to submit jobs to the cluster and to log into cluster dashboards."
                    }
                },
                "clusterLoginPassword": {
                    "type": "securestring",
                    "metadata": {
                        "description": "The password must be at least 10 characters in length and must contain at least one digit, one non-alphanumeric character, and one upper or lower case letter."
                    }
                },
                "sshUserName": {
                    "type": "string",
                    "metadata": {
                        "description": "These credentials can be used to remotely access the cluster."
                    }
                },
                "sshPassword": {
                    "type": "securestring",
                    "metadata": {
                        "description": "The password must be at least 10 characters in length and must contain at least one digit, one non-alphanumeric character, and one upper or lower case letter."
                    }
                },
                "clusterStorageAccountName": {
                    "type": "string",
                    "metadata": {
                        "description": "The name of the storage account to be created and be used as the cluster's storage."
                    }
                },
                "clusterWorkerNodeCount": {
                    "type": "int",
                    "defaultValue": 4,
                    "metadata": {
                        "description": "The number of nodes in the HDInsight cluster."
                    }
                }
            },
            "variables": {
                "defaultApiVersion": "2015-05-01-preview",
                "clusterApiVersion": "2015-03-01-preview"
            },
            "resources": [{
                "name": "[parameters('clusterStorageAccountName')]",
                "type": "Microsoft.Storage/storageAccounts",
                "location": "[resourceGroup().location]",
                "apiVersion": "[variables('defaultApiVersion')]",
                "dependsOn": [],
                "tags": {

                },
                "properties": {
                    "accountType": "Standard_LRS"
                }
            },
            {
                "name": "[parameters('clusterName')]",
                "type": "Microsoft.HDInsight/clusters",
                "location": "[resourceGroup().location]",
                "apiVersion": "[variables('clusterApiVersion')]",
                "dependsOn": ["[concat('Microsoft.Storage/storageAccounts/',parameters('clusterStorageAccountName'))]"],
                "tags": {

                },
                "properties": {
                    "clusterVersion": "3.6",
                    "osType": "Linux",
                    "clusterDefinition": {
                        "kind": "[parameters('clusterType')]",
                        "configurations": {
                            "gateway": {
                                "restAuthCredential.isEnabled": true,
                                "restAuthCredential.username": "[parameters('clusterLoginUserName')]",
                                "restAuthCredential.password": "[parameters('clusterLoginPassword')]"
                            }
                        }
                    },
                    "storageProfile": {
                        "storageaccounts": [{
                            "name": "[concat(parameters('clusterStorageAccountName'),'.blob.core.windows.net')]",
                            "isDefault": true,
                            "container": "[parameters('clusterName')]",
                            "key": "[listKeys(resourceId('Microsoft.Storage/storageAccounts', parameters('clusterStorageAccountName')), variables('defaultApiVersion')).key1]"
                        }]
                    },
                    "computeProfile": {
                        "roles": [{
                            "name": "headnode",
                            "targetInstanceCount": "2",
                            "hardwareProfile": {
                                "vmSize": "{}" 
                            },
                            "osProfile": {
                                "linuxOperatingSystemProfile": {
                                    "username": "[parameters('sshUserName')]",
                                    "password": "[parameters('sshPassword')]"
                                }
                            }
                        },
                        {
                            "name": "workernode",
                            "targetInstanceCount": "[parameters('clusterWorkerNodeCount')]",
                            "hardwareProfile": {
                                "vmSize": "{}"
                            },
                            "osProfile": {
                                "linuxOperatingSystemProfile": {
                                    "username": "[parameters('sshUserName')]",
                                    "password": "[parameters('sshPassword')]"
                                }
                            }
                        }]
                    }
                }
            }],
            "outputs": {
                "cluster": {
                    "type": "object",
                    "value": "[reference(resourceId('Microsoft.HDInsight/clusters',parameters('clusterName')))]"
                }
            }
        },
        "mode": "incremental",
        "Parameters": {
            "clusterName": {
                "value": "newclustername"
            },
            "clusterType": {
                "value": "hadoop"
            },
            "clusterStorageAccountName": {
                "value": "newstoragename"
            },
            "clusterLoginUserName": {
                "value": "admin"
            },
            "clusterLoginPassword": {
                "value": "changeme"
            },
            "sshUserName": {
                "value": "sshuser"
            },
            "sshPassword": {
                "value": "changeme"
            }
        }
    }
}

Этот пример используется в шагах, описанных в этом документе. Замените значения примера в разделе "Параметры " значениями для вашего кластера.

Это важно

Шаблон использует число рабочих узлов по умолчанию (4) для кластера HDInsight. Если вы планируете использовать более 32 рабочих узлов, необходимо выбрать размер головного узла по крайней мере 8 ядер и 14 ГБ озу.

Дополнительные сведения о размерах узлов и их стоимости см. на странице с ценами на HDInsight.

Вход в подписку Azure

Выполните действия, описанные в приступая к работе с Azure CLI и подключитесь к подписке с помощью команды az login.

Создание сервисного принципала

Примечание.

Эти шаги являются сокращенной версией раздела Создание основной службы с паролем документа Использование Azure CLI для создания основной службы для доступа к ресурсам. Эти действия создают учетную запись службы, которая используется для аутентификации в Azure REST API.

  1. В командной строке используйте следующую команду для перечисления подписок Azure.

    az account list --query '[].{Subscription_ID:id,Tenant_ID:tenantId,Name:name}'  --output table
    

    В списке выберите подписку, которую вы хотите использовать, и запишите столбцы Subscription_ID и Tenant_ID. Сохраните эти значения.

  2. Используйте следующую команду, чтобы создать приложение в идентификаторе Microsoft Entra.

    az ad app create --display-name "exampleapp" --homepage "https://www.contoso.org" --identifier-uris "https://www.contoso.org/example" --password <Your password> --query 'appId'
    

    Замените значения --display-name, --homepageи --identifier-uris собственными значениями. Укажите пароль для новой записи Active Directory.

    Примечание.

    Значения --home-page и --identifier-uris не обязательно должны ссылаться на реальную веб-страницу, размещенную в Интернете. Они должны быть уникальными URI.

    Значением, возвращаемым из этой команды, является идентификатор приложения для нового приложения. Сохраните это значение.

  3. Используйте следующую команду, чтобы создать служебный принципал с помощью идентификатора приложения .

    az ad sp create --id <App ID> --query 'objectId'
    

    Значением, возвращаемым из этой команды, является идентификатор объекта. Сохраните это значение.

  4. Назначьте роль владельца субъекту-службе с помощью значения идентификатора объекта. Используйте идентификатор подписки , полученный ранее.

    az role assignment create --assignee <Object ID> --role Owner --scope /subscriptions/<Subscription ID>/
    

Получить токен аутентификации

Чтобы получить маркер проверки подлинности, используйте следующую команду:

curl -X "POST" "https://login.microsoftonline.com/$TENANTID/oauth2/token" \
-H "Cookie: flight-uxoptin=true; stsservicecookie=ests; x-ms-gateway-slice=productionb; stsservicecookie=ests" \
-H "Content-Type: application/x-www-form-urlencoded" \
--data-urlencode "client_id=$APPID" \
--data-urlencode "grant_type=client_credentials" \
--data-urlencode "client_secret=$PASSWORD" \
--data-urlencode "resource=https://management.azure.com/"

Задайте $TENANTID, $APPIDи $PASSWORD значениям, полученным или использованным ранее.

Если этот запрос выполнен успешно, вы получите ответ серии 200, а текст ответа содержит документ JSON.

Документ JSON, возвращаемый этим запросом, содержит элемент с именем access_token. Значение access_token используется для проверки подлинности запросов к REST API.

{
    "token_type":"Bearer",
    "expires_in":"3599",
    "expires_on":"1463409994",
    "not_before":"1463406094",
    "resource":"https://management.azure.com/","access_token":"eyJ0eXAiOiJKV1QiLCJhbGciOiJSUzI1NiIsIng1dCI6Ik1uQ19WWoNBVGZNNXBPWWlKSE1iYTlnb0VLWSIsImtpZCI6Ik1uQ19WWmNBVGZNNXBPWWlKSE1iYTlnb0VLWSJ9.eyJhdWQiOiJodHRwczovL21hbmFnZW1lbnQuYXp1cmUuY29tLyIsImlzcyI6Imh0dHBzOi8vc3RzLndpbmRvd3MubmV0LzcyZjk4OGJmLTg2ZjEtNDFhZi05MWFiLTJkN2NkMDExZGI2Ny8iLCJpYXQiOjE0NjM0MDYwOTQsIm5iZiI6MTQ2MzQwNjA5NCwiZXhwIjoxNDYzNDA5OTk5LCJhcHBpZCI6IjBlYzcyMzM0LTZkMDMtNDhmYi04OWU1LTU2NTJiODBiZDliYiIsImFwcGlkYWNyIjoiMSIsImlkcCI6Imh0dHBzOi8vc3RzLndpbmRvd3MubmV0LzcyZjk4OGJmLTg2ZjEtNDFhZi05MWFiLTJkN2NkMDExZGI0Ny8iLCJvaWQiOiJlNjgxZTZiMi1mZThkLTRkZGUtYjZiMS0xNjAyZDQyNWQzOWYiLCJzdWIiOiJlNjgxZTZiMi1mZThkLTRkZGUtYjZiMS0xNjAyZDQyNWQzOWYiLCJ0aWQiOiI3MmY5ODhiZi04NmYxLTQxYWYtOTFhYi0yZDdjZDAxMWRiNDciLCJ2ZXIiOiIxLjAifQ.nJVERbeDHLGHn7ZsbVGBJyHOu2PYhG5dji6F63gu8XN2Cvol3J1HO1uB4H3nCSt9DTu_jMHqAur_NNyobgNM21GojbEZAvd0I9NY0UDumBEvDZfMKneqp7a_cgAU7IYRcTPneSxbD6wo-8gIgfN9KDql98b0uEzixIVIWra2Q1bUUYETYqyaJNdS4RUmlJKNNpENllAyHQLv7hXnap1IuzP-f5CNIbbj9UgXxLiOtW5JhUAwWLZ3-WMhNRpUO2SIB7W7tQ0AbjXw3aUYr7el066J51z5tC1AK9UC-mD_fO_HUP6ZmPzu5gLA6DxkIIYP3grPnRVoUDltHQvwgONDOw"
}

Создание группы ресурсов

Чтобы создать группу ресурсов, используйте следующую команду.

  • Установите $SUBSCRIPTIONID на идентификатор подписки, полученный при создании сервисного принципала.
  • Установите $ACCESSTOKEN равным маркеру доступа, полученному на предыдущем шаге.
  • Замените DATACENTERLOCATION центром обработки данных, в котором вы хотите создать группу ресурсов и ресурсы. Например, "Южная центральная часть США".
  • Задайте $RESOURCEGROUPNAME имя, которое вы хотите использовать для этой группы:
curl -X "PUT" "https://management.azure.com/subscriptions/$SUBSCRIPTIONID/resourcegroups/$RESOURCEGROUPNAME?api-version=2015-01-01" \
    -H "Authorization: Bearer $ACCESSTOKEN" \
    -H "Content-Type: application/json" \
    -d $'{
"location": "DATACENTERLOCATION"
}'

Если этот запрос выполнен успешно, вы получите ответ серии 200, а текст ответа содержит документ JSON, содержащий сведения о группе. Элемент "provisioningState" содержит значение "Succeeded".

Создайте развертывание

Используйте следующую команду для развертывания шаблона в группе ресурсов.

  • Присвойте $DEPLOYMENTNAME имя, которым вы хотите воспользоваться для этого развертывания.
curl -X "PUT" "https://management.azure.com/subscriptions/$SUBSCRIPTIONID/resourcegroups/$RESOURCEGROUPNAME/providers/microsoft.resources/deployments/$DEPLOYMENTNAME?api-version=2015-01-01" \
-H "Authorization: Bearer $ACCESSTOKEN" \
-H "Content-Type: application/json" \
-d "{set your body string to the template and parameters}"

Примечание.

Если вы сохранили шаблон в файле, можно использовать следующую команду вместо -d "{ template and parameters}":

--data-binary "@/path/to/file.json"

Если этот запрос выполнен успешно, вы получите ответ серии 200, а текст ответа содержит документ JSON, содержащий сведения об операции развертывания.

Это важно

Развертывание было отправлено, но не завершено. Для завершения развертывания может потребоваться несколько минут, как правило, около 15.

Проверка состояния развертывания

Чтобы проверить состояние развертывания, используйте следующую команду:

curl -X "GET" "https://management.azure.com/subscriptions/$SUBSCRIPTIONID/resourcegroups/$RESOURCEGROUPNAME/providers/microsoft.resources/deployments/$DEPLOYMENTNAME?api-version=2015-01-01" \
-H "Authorization: Bearer $ACCESSTOKEN" \
-H "Content-Type: application/json"

Эта команда возвращает документ JSON, содержащий сведения об операции развертывания. Элемент "provisioningState" содержит состояние развертывания. Если этот элемент содержит значение "Succeeded", развертывание завершилось успешно.

Устранение неполадок

Если у вас возникли проблемы с созданием кластеров HDInsight, см. раздел требования к управлению доступом.

Дальнейшие действия

Теперь, когда вы успешно создали кластер HDInsight, используйте следующее, чтобы узнать, как работать с кластером.

Кластеры Apache Hadoop

Кластеры Apache HBase