Creare cluster Hadoop in HDInsight mediante modelli di Resource Manager

In questo articolo vengono illustrati diversi modi per creare cluster Azure HDInsight con modelli Azure Resource Manager. Per altre informazioni, vedere Distribuire un'applicazione con il modello di Gestione risorse di Azure. Per informazioni su altri strumenti e funzionalità per la creazione di cluster, fare clic sul selettore di schede nella parte superiore della pagina o vedere Metodi di creazione di cluster.

Prerequisiti

Avviso

La fatturazione dei cluster HDInsight viene calcolata al minuto, indipendentemente dal fatto che siano in uso o meno. Assicurarsi di eliminare il cluster dopo aver finito di usarlo. Per altre informazioni, vedere l'articolo su come eliminare un cluster HDInsight.

Per seguire le istruzioni di questo articolo sono necessari:

Importante

Il supporto di Azure PowerShell e dell'interfaccia della riga di comando di Azure per la gestione delle risorse HDInsight con Azure Service Manager (ASM) è deprecato ed è stato rimosso il 1° gennaio 2017. La procedura descritta in questo documento usa i nuovi cmdlet di Azure PowerShell e i nuovi comandi dell'interfaccia della riga di comando di Azure compatibili con Azure Resource Manager.

Usare la procedura descritta negli articoli Installare l'interfaccia della riga di comando di Azure o Come installare e configurare Azure PowerShell per installare le versioni più recenti. Se sono presenti script che devono essere modificati per l'uso dei nuovi cmdlet o dei nuovi comandi dell'interfaccia della riga di comando, vedere Migrazione a strumenti di sviluppo basati su Azure Resource Manager per i cluster HDInsight.

Modelli di Gestione risorse

I modelli di Resource Manager consentono di creare quanto segue per l'applicazione in un'unica operazione coordinata:

  • Cluster HDInsight e le relative risorse dipendenti, come ad esempio l'account di archiviazione predefinito
  • Altre risorse, come ad esempio il database SQL di Azure per usare Apache Sqoop

Nel modello si definiscono le risorse necessarie per l'applicazione. È anche possibile specificare i parametri di distribuzione per immettere valori per ambienti diversi. Il modello è composto da JSON ed espressioni da usare per creare valori per la distribuzione.

È possibile trovare modelli di HDInsight di esempio in Modelli di avvio rapido di Azure. Usare lo strumento multipiattaforma Visual Studio Code con l'estensione per Resource Manager o un editor di testo per salvare il modello in un file sulla workstation. Si apprenderà come chiamare il modello usando metodi diversi.

Per altre informazioni sui modelli di Resource Manager, vedere gli articoli seguenti:

Generare modelli

Tramite il portale di Azure è possibile configurare tutte le proprietà di un cluster e salvare il modello prima di distribuirlo, in modo da poterlo riutilizzare.

Per generare un modello usando il portale di Azure

  1. Accedere al portale di Azure.
  2. Fare clic su Nuovo nel menu a sinistra, su Intelligence e analisi e quindi su HDInsight.
  3. Immettere le proprietà seguendo le istruzioni. È possibile usare l'opzione Creazione rapida o Personalizza.
  4. Nella scheda Riepilogo fare clic su Scarica modello e parametri:

    Download del modello di Resource Manager per la creazione del cluster HDInsight Hadoop

    Viene visualizzato l'elenco di file del modello, file dei parametri ed esempi di codice necessari per distribuire il modello:

    Opzioni di download del modello di Resource Manager per la creazione del cluster HDInsight Hadoop

    Da questa pagina è possibile scaricare il modello e salvarlo nella libreria di modelli oppure distribuirlo.

    Per accedere a un modello nella libreria, fare clic su Altri servizi nel menu a sinistra e quindi fare clic su Modelli (nella categoria Altro).

    Nota

    Il modello e il file dei parametri devono essere usati insieme. in caso contrario, è possibile che si ottengano risultati imprevisti. Il valore predefinito della proprietà clusterKind, ad esempio, è sempre hadoop, indipendentemente da quanto specificato prima di scaricare il modello.

Distribuire con PowerShell

La procedura seguente consente di creare un cluster Hadoop in HDInsight.

  1. Salvare nella workstation il file JSON dell'Appendice. Nello script di PowerShell il nome del file è C:\HDITutorials-ARM\hdinsight-arm-template.json.
  2. Se necessario, impostare i parametri e le variabili.
  3. Eseguire il modello tramite lo script PowerShell seguente:

     ####################################
     # Set these variables
     ####################################
     #region - used for creating Azure service names
     $nameToken = "<Enter an Alias>"
     $templateFile = "C:\HDITutorials-ARM\hdinsight-arm-template.json"
     #endregion
    
     ####################################
     # Service names and variables
     ####################################
     #region - service names
     $namePrefix = $nameToken.ToLower() + (Get-Date -Format "MMdd")
    
     $resourceGroupName = $namePrefix + "rg"
     $hdinsightClusterName = $namePrefix + "hdi"
     $defaultStorageAccountName = $namePrefix + "store"
     $defaultBlobContainerName = $hdinsightClusterName
    
     $location = "East US 2"
    
     $armDeploymentName = $namePrefix
     #endregion
    
     ####################################
     # Connect to Azure
     ####################################
     #region - Connect to Azure subscription
     Write-Host "`nConnecting to your Azure subscription ..." -ForegroundColor Green
     try{Get-AzureRmContext}
     catch{Login-AzureRmAccount}
     #endregion
    
     # Create a resource group
     New-AzureRmResourceGroup -Name $resourceGroupName -Location $Location
    
     # Create cluster and the dependent storage account
     $parameters = @{clusterName="$hdinsightClusterName"}
    
     New-AzureRmResourceGroupDeployment `
         -Name $armDeploymentName `
         -ResourceGroupName $resourceGroupName `
         -TemplateFile $templateFile `
         -TemplateParameterObject $parameters
    
     # List cluster
     Get-AzureRmHDInsightCluster -ResourceGroupName $resourceGroupName -ClusterName $hdinsightClusterName
    

    Lo script PowerShell configura soltanto il nome del cluster. Il nome dell'account di archiviazione è hardcoded nel modello. Viene richiesto di immettere la password utente del cluster. Il nome utente predefinito è admin. Viene richiesto anche di immettere la password utente SSH. Il nome utente SSH predefinito è sshuser.

Per altre informazioni, vedere Distribuire con PowerShell.

Eseguire la distribuzione con l'interfaccia della riga di comando

Nell'esempio seguente viene usata l'interfaccia della riga di comando di Azure. Vengono creati un cluster e i relativi account di archiviazione e contenitore dipendenti chiamando un modello di Resource Manager:

azure login
azure config mode arm
azure group create -n hdi1229rg -l "East US"
azure group deployment create --resource-group "hdi1229rg" --name "hdi1229" --template-file "C:\HDITutorials-ARM\hdinsight-arm-template.json"

Viene richiesto di immettere:

  • Il nome del cluster.
  • La password utente del cluster. Il nome utente predefinito è admin.
  • La password utente SSH. Il nome utente SSH predefinito è sshuser.

Il codice seguente specifica i parametri inline:

azure group deployment create --resource-group "hdi1229rg" --name "hdi1229" --template-file "c:\Tutorials\HDInsightARM\create-linux-based-hadoop-cluster-in-hdinsight.json" --parameters '{\"clusterName\":{\"value\":\"hdi1229\"},\"clusterLoginPassword\":{\"value\":\"Pass@word1\"},\"sshPassword\":{\"value\":\"Pass@word1\"}}'

Distribuire con l'API REST

Vedere Distribuire con l'API REST.

Distribuire con Visual Studio

Usare Visual Studio per creare un progetto del gruppo di risorse e distribuirlo in Azure mediante l'interfaccia utente. Selezionare il tipo di risorse da includere nel progetto. Tali risorse vengono aggiunte automaticamente al modello di Resource Manager. Il progetto fornisce anche uno script di PowerShell per distribuire il modello.

Per un'introduzione all'uso di Visual Studio con gruppi di risorse, vedere Creazione e distribuzione di gruppi di risorse di Azure tramite Visual Studio.

Risoluzione dei problemi

Se si verificano problemi di creazione dei cluster HDInsight, vedere i requisiti dei controlli di accesso.

Passaggi successivi

Questo articolo ha spiegato vari modi per creare un cluster HDInsight. Per altre informazioni, vedere gli articoli seguenti:

Appendice: modello di Resource Manager per creare un cluster Hadoop

Il modello di Azure Resource Manager seguente crea un cluster Hadoop basato su Linux con l'account di archiviazione di Azure dipendente.

Nota

L'esempio include informazioni di configurazione per il metastore Hive e il metastore Oozie. Prima di utilizzare il modello, rimuovere o configurare la sezione.

{
"$schema": "https://schema.management.azure.com/schemas/2015-01-01/deploymentTemplate.json#",
"contentVersion": "1.0.0.0",
"parameters": {
    "clusterName": {
    "type": "string",
    "metadata": {
        "description": "The name of the HDInsight cluster to create."
    }
    },
    "clusterLoginUserName": {
    "type": "string",
    "defaultValue": "admin",
    "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",
    "defaultValue": "sshuser",
    "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."
    }
    },
    "location": {
    "type": "string",
    "defaultValue": "East US",
    "allowedValues": [
        "East US",
        "East US 2",
        "North Central US",
        "South Central US",
        "West US",
        "North Europe",
        "West Europe",
        "East Asia",
        "Southeast Asia",
        "Japan East",
        "Japan West",
        "Australia East",
        "Australia Southeast"
    ],
    "metadata": {
        "description": "The location where all azure resources will be deployed."
    }
    },
    "clusterType": {
    "type": "string",
    "defaultValue": "hadoop",
    "allowedValues": [
        "hadoop",
        "hbase",
        "storm",
        "spark"
    ],
    "metadata": {
        "description": "The type of the HDInsight cluster to create."
    }
    },
    "clusterWorkerNodeCount": {
    "type": "int",
    "defaultValue": 2,
    "metadata": {
        "description": "The number of nodes in the HDInsight cluster."
    }
    }
},
"variables": {
    "defaultApiVersion": "2015-05-01-preview",
    "clusterApiVersion": "2015-03-01-preview",
    "clusterStorageAccountName": "[concat(parameters('clusterName'),'store')]"
},
"resources": [
    {
    "name": "[variables('clusterStorageAccountName')]",
    "type": "Microsoft.Storage/storageAccounts",
    "location": "[parameters('location')]",
    "apiVersion": "[variables('defaultApiVersion')]",
    "dependsOn": [ ],
    "tags": { },
    "properties": {
        "accountType": "Standard_LRS"
    }
    },
    {
    "name": "[parameters('clusterName')]",
    "type": "Microsoft.HDInsight/clusters",
    "location": "[parameters('location')]",
    "apiVersion": "[variables('clusterApiVersion')]",
    "dependsOn": [ "[concat('Microsoft.Storage/storageAccounts/',variables('clusterStorageAccountName'))]" ],
    "tags": {

    },
    "properties": {
        "clusterVersion": "3.4",
        "osType": "Linux",
        "tier": "standard",
        "clusterDefinition": {
        "kind": "[parameters('clusterType')]",
        "configurations": {
            "gateway": {
            "restAuthCredential.isEnabled": true,
            "restAuthCredential.username": "[parameters('clusterLoginUserName')]",
            "restAuthCredential.password": "[parameters('clusterLoginPassword')]"
            },
            "hive-site": {
                "javax.jdo.option.ConnectionDriverName": "com.microsoft.sqlserver.jdbc.SQLServerDriver",
                "javax.jdo.option.ConnectionURL": "jdbc:sqlserver://myadla0901dbserver.database.windows.net;database=myhive20160901;encrypt=true;trustServerCertificate=true;create=false;loginTimeout=300",
                "javax.jdo.option.ConnectionUserName": "johndole",
                "javax.jdo.option.ConnectionPassword": "myPassword$"
            },
            "hive-env": {
                "hive_database": "Existing MSSQL Server database with SQL authentication",
                "hive_database_name": "myhive20160901",
                "hive_database_type": "mssql",
                "hive_existing_mssql_server_database": "myhive20160901",
                "hive_existing_mssql_server_host": "myadla0901dbserver.database.windows.net",
                "hive_hostname": "myadla0901dbserver.database.windows.net"
            },
            "oozie-site": {
                "oozie.service.JPAService.jdbc.driver": "com.microsoft.sqlserver.jdbc.SQLServerDriver",
                "oozie.service.JPAService.jdbc.url": "jdbc:sqlserver://myadla0901dbserver.database.windows.net;database=myhive20160901;encrypt=true;trustServerCertificate=true;create=false;loginTimeout=300",
                "oozie.service.JPAService.jdbc.username": "johndole",
                "oozie.service.JPAService.jdbc.password": "myPassword$",
                "oozie.db.schema.name": "oozie"
            },
            "oozie-env": {
                "oozie_database": "Existing MSSQL Server database with SQL authentication",
                "oozie_database_name": "myhive20160901",
                "oozie_database_type": "mssql",
                "oozie_existing_mssql_server_database": "myhive20160901",
                "oozie_existing_mssql_server_host": "myadla0901dbserver.database.windows.net",
                "oozie_hostname": "myadla0901dbserver.database.windows.net"
            }            
        }
        },
        "storageProfile": {
        "storageaccounts": [
            {
            "name": "[concat(variables('clusterStorageAccountName'),'.blob.core.windows.net')]",
            "isDefault": true,
            "container": "[parameters('clusterName')]",
            "key": "[listKeys(resourceId('Microsoft.Storage/storageAccounts', variables('clusterStorageAccountName')), variables('defaultApiVersion')).keys[0].value]"
            }
        ]
        },
        "computeProfile": {
        "roles": [
            {
            "name": "headnode",
            "targetInstanceCount": "2",
            "hardwareProfile": {
                "vmSize": "Standard_D3"
            },
            "osProfile": {
                "linuxOperatingSystemProfile": {
                "username": "[parameters('sshUserName')]",
                "password": "[parameters('sshPassword')]"
                }
            }
            },
            {
            "name": "workernode",
            "targetInstanceCount": "[parameters('clusterWorkerNodeCount')]",
            "hardwareProfile": {
                "vmSize": "Standard_D3"
            },
            "osProfile": {
                "linuxOperatingSystemProfile": {
                "username": "[parameters('sshUserName')]",
                "password": "[parameters('sshPassword')]"
                }
            }
            }
        ]
        }
    }
    }
],
"outputs": {
    "cluster": {
    "type": "object",
    "value": "[reference(resourceId('Microsoft.HDInsight/clusters',parameters('clusterName')))]"
    }
}
}

Appendice: modello di Resource Manager per creare un cluster Spark

In questa sezione viene fornito un modello di Resource Manager che è possibile usare per creare un cluster HDInsight Spark. Questo modello include le configurazioni per spark-defaults e spark-thrift-sparkconf (per i cluster Spark 1.6) e spark2-defaults e spark2-thrift-sparkconf (per i cluster Spark 2). Oltre a ciò, HDInsight calcola e imposta le configurazioni, come spark.executor.instances, spark.executor.memory e spark.executor.cores in base alla dimensione del cluster.

Se si imposta un parametro in una sezione come parte del modello stesso, HDInsight non calcola e imposta gli altri parametri della stessa sezione. Ad esempio, il parametro spark.executor.instances è nella configurazione spark-defaults. Se si imposta un altro parametro (ad esempio, spark.yarn.exector.memoryOverhead) nella configurazione spark-defaults, HDInsight non calcola e imposta il parametro spark.executor.instances.

{
"$schema": "http://schema.management.azure.com/schemas/2014-04-01-preview/deploymentTemplate.json#",
"contentVersion": "0.9.0.0",
"parameters": {
    "clusterName": {
        "type": "string",
        "metadata": {
            "description": "The name of the HDInsight cluster to create."
        }
    },
    "clusterLoginUserName": {
        "type": "string",
        "defaultValue": "admin",
        "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."
        }
    },
    "location": {
        "type": "string",
        "defaultValue": "southcentralus",
        "metadata": {
            "description": "The location where all azure resources will be deployed."
        }
    },
    "clusterVersion": {
        "type": "string",
        "defaultValue": "3.5",
        "metadata": {
            "description": "HDInsight cluster version."
        }
    },
    "clusterWorkerNodeCount": {
        "type": "int",
        "defaultValue": 4,
        "metadata": {
            "description": "The number of nodes in the HDInsight cluster."
        }
    },
    "clusterKind": {
        "type": "string",
        "defaultValue": "SPARK",
        "metadata": {
            "description": "The type of the HDInsight cluster to create."
        }
    },
    "sshUserName": {
        "type": "string",
        "defaultValue": "sshuser",
        "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."
        }
    }
},
"variables": {
    "defaultApiVersion": "2017-06-01",
    "clusterStorageAccountName": "[concat(parameters('clusterName'),'store')]"
},
"resources": [
    {
    "name": "[variables('clusterStorageAccountName')]",
    "type": "Microsoft.Storage/storageAccounts",
    "location": "[parameters('location')]",
    "apiVersion": "[variables('defaultApiVersion')]",
    "dependsOn": [ ],
    "tags": { },
    "properties": {
        "accountType": "Standard_LRS"
    }
    },
{
        "apiVersion": "2015-03-01-preview",
        "name": "[parameters('clusterName')]",
        "type": "Microsoft.HDInsight/clusters",
        "location": "[parameters('location')]",
        "dependsOn": [],
        "properties": {
            "clusterVersion": "[parameters('clusterVersion')]",
            "osType": "Linux",
            "tier": "standard",
            "clusterDefinition": {
                "kind": "[parameters('clusterKind')]",
                "configurations": {
                    "gateway": {
                        "restAuthCredential.isEnabled": true,
                        "restAuthCredential.username": "[parameters('clusterLoginUserName')]",
                        "restAuthCredential.password": "[parameters('clusterLoginPassword')]"
                    },
                    "spark-defaults": {
                        "spark.executor.cores": "2"
                    },
                    "spark-thrift-sparkconf": {
                        "spark.yarn.executor.memoryOverhead": "896"
                    }
                }
            },
            "storageProfile": {
                "storageaccounts": [
                    {
                        "name": "[concat(variables('clusterStorageAccountName'),'.blob.core.windows.net')]",
                        "isDefault": true,
                        "container": "[parameters('clusterName')]",
                        "key": "[listKeys(resourceId('Microsoft.Storage/storageAccounts', variables('clusterStorageAccountName')), variables('defaultApiVersion')).keys[0].value]"
                    }
                ]
            },
            "computeProfile": {
                "roles": [
                    {
                        "name": "headnode",
                        "minInstanceCount": 1,
                        "targetInstanceCount": 2,
                        "hardwareProfile": {
                            "vmSize": "Standard_D12"
                        },
                        "osProfile": {
                            "linuxOperatingSystemProfile": {
                                "username": "[parameters('sshUserName')]",
                                "password": "[parameters('sshPassword')]"
                            }
                        },
                        "virtualNetworkProfile": null,
                        "scriptActions": []
                    },
                    {
                        "name": "workernode",
                        "minInstanceCount": 1,
                        "targetInstanceCount": 4,
                        "hardwareProfile": {
                            "vmSize": "Standard_D4"
                        },
                        "osProfile": {
                            "linuxOperatingSystemProfile": {
                                "username": "[parameters('sshUserName')]",
                                "password": "[parameters('sshPassword')]"
                                }
                            },
                            "virtualNetworkProfile": null,
                            "scriptActions": []
                        }
                    ]
                }
            }
        }
    ]
}