Criar clusters Apache Hadoop usando a API REST do Azure

Saiba como criar um cluster HDInsight usando um modelo do Azure Resource Manager e a API REST do Azure.

A API REST do Azure permite executar operações de gerenciamento em serviços hospedados na plataforma Azure, incluindo a criação de novos recursos, como clusters HDInsight.

Nota

As etapas neste documento usam o utilitário curl (https://curl.haxx.se/) para se comunicar com a API REST do Azure.

Criar um modelo

Os modelos do Azure Resource Manager são documentos JSON que descrevem um grupo de recursos e todos os recursos nele contidos (como o HDInsight). Essa abordagem baseada em modelo permite definir os recursos necessários para o HDInsight em um modelo.

O documento JSON a seguir é uma fusão dos arquivos de modelo e parâmetros do , que cria um cluster baseado em Linux usando uma senha para proteger a conta de https://github.com/Azure/azure-quickstart-templates/tree/master/quickstarts/microsoft.hdinsight/hdinsight-linux-ssh-password/azuredeploy.jsonusuário 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"
            }
        }
    }
}

Este exemplo é usado nas etapas deste documento. Substitua os valores de exemplo na seção Parâmetros pelos valores do cluster.

Importante

O modelo usa o número padrão de nós de trabalho (4) para um cluster HDInsight. Se você planeja mais de 32 nós de trabalho, então você deve selecionar um tamanho de nó principal com pelo menos 8 núcleos e 14 GB de RAM.

Para obter mais informações sobre tamanhos de nós e custos associados, veja os preços do HDInsight.

Inicie sessão na sua subscrição do Azure

Siga as etapas documentadas em Introdução à CLI do Azure e conecte-se à sua assinatura usando o az login comando.

Criar um principal de serviço

Nota

Essas etapas são uma versão resumida da seção Criar entidade de serviço com senha do documento Usar a CLI do Azure para criar uma entidade de serviço para acessar recursos . Estas etapas criam uma entidade de serviço que é usada para autenticar na API REST do Azure.

  1. Em uma linha de comando, use o seguinte comando para listar suas assinaturas do Azure.

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

    Na lista, selecione a assinatura que deseja usar e anote as colunas Subscription_ID e Tenant_ID . Guarde estes valores.

  2. Use o seguinte comando para criar um aplicativo no Microsoft Entra ID.

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

    Substitua os valores do --display-name, --homepagee --identifier-uris pelos seus próprios valores. Forneça uma senha para a nova entrada do Ative Directory.

    Nota

    Os --home-page valores e --identifier-uris não precisam fazer referência a uma página da Web real hospedada na internet. Eles devem ser URIs exclusivos.

    O valor retornado desse comando é a ID do aplicativo para o novo aplicativo. Guarde este valor.

  3. Use o comando a seguir para criar uma entidade de serviço usando a ID do aplicativo.

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

    O valor retornado desse comando é a ID do objeto. Guarde este valor.

  4. Atribua a função Proprietário à entidade de serviço usando o valor ID do objeto. Utilize o ID de subscrição obtido anteriormente.

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

Obter um token de autenticação

Use o seguinte comando para recuperar um token de autenticação:

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/"

Defina $TENANTID, $APPID, e $PASSWORD para os valores obtidos ou utilizados anteriormente.

Se essa solicitação for bem-sucedida, você receberá uma resposta da série 200 e o corpo da resposta conterá um documento JSON.

O documento JSON retornado por essa solicitação contém um elemento chamado access_token. O valor de access_token é usado para autenticar solicitações para a API REST.

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

Criar um grupo de recursos

Use o seguinte para criar um grupo de recursos.

  • Defina $SUBSCRIPTIONID a ID da assinatura recebida durante a criação da entidade de serviço.
  • Defina $ACCESSTOKEN como o token de acesso recebido na etapa anterior.
  • Substitua DATACENTERLOCATION pelo data center no qual você deseja criar o grupo de recursos e os recursos. Por exemplo, "Centro-Sul dos EUA".
  • Defina $RESOURCEGROUPNAME o nome que você deseja usar para este grupo:
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"
}'

Se essa solicitação for bem-sucedida, você receberá uma resposta da série 200 e o corpo da resposta conterá um documento JSON contendo informações sobre o grupo. O "provisioningState" elemento contém um valor de "Succeeded".

Criar uma implantação

Use o comando a seguir para implantar o modelo no grupo de recursos.

  • Defina $DEPLOYMENTNAME o nome que você deseja usar para esta implantação.
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}"

Nota

Se você salvou o modelo em um arquivo, poderá usar o seguinte comando em vez de -d "{ template and parameters}":

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

Se essa solicitação for bem-sucedida, você receberá uma resposta da série 200 e o corpo da resposta conterá um documento JSON contendo informações sobre a operação de implantação.

Importante

A implantação foi enviada, mas não foi concluída. Pode levar vários minutos, geralmente cerca de 15, para que a implantação seja concluída.

Verificar o status de uma implantação

Para verificar o status da implantação, use o seguinte comando:

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"

Este comando retorna um documento JSON contendo informações sobre a operação de implantação. O "provisioningState" elemento contém o status da implantação. Se esse elemento contiver um valor de "Succeeded", a implantação foi concluída com êxito.

Resolver problemas

Caso se depare com problemas com a criação de clusters do HDInsight, veja aceder aos requisitos de controlo.

Próximos passos

Agora que você criou com êxito um cluster HDInsight, use o seguinte para saber como trabalhar com seu cluster.

Clusters Apache Hadoop

Clusters Apache HBase