Snabbstart: Skapa Apache Spark-kluster i Azure HDInsight med hjälp av ARM-mall

I den här snabbstarten använder du en Azure Resource Manager-mall (ARM-mall) för att skapa ett Apache Spark-kluster i Azure HDInsight. Sedan skapar du en Jupyter Notebook-fil och använder den för att köra Spark SQL-frågor mot Apache Hive-tabeller. Azure HDInsight är en hanterad analystjänst med fullständigt spektrum med öppen källkod för företag. Apache Spark-ramverket för HDInsight möjliggör snabb dataanalys och klusterberäkning med minnesintern bearbetning. Med Jupyter Notebook kan du interagera med dina data, kombinera kod med markdown-text och göra enkla visualiseringar.

Om du använder flera kluster tillsammans vill du skapa ett virtuellt nätverk, och om du använder ett Spark-kluster vill du också använda Hive Warehouse-Anslut eller. Mer information finns i Planera ett virtuellt nätverk för Azure HDInsight och Integrera Apache Spark och Apache Hive med Hive Warehouse-Anslut eller.

En Azure Resource Manager-mall är en JSON-fil (JavaScript Object Notation) som definierar infrastrukturen och konfigurationen för projektet. Mallen använder deklarativ syntax. Du beskriver den avsedda distributionen utan att skriva sekvensen med programmeringskommandon för att skapa distributionen.

Om din miljö uppfyller förhandskraven och du är van att använda ARM-mallar väljer du knappen Distribuera till Azure. Mallen öppnas på Azure-portalen.

Button to deploy the Resource Manager template to Azure.

Förutsättningar

Om du inte har någon Azure-prenumeration skapar du ett kostnadsfritt konto innan du börjar.

Granska mallen

Mallen som används i den här snabbstarten kommer från Azure-snabbstartsmallar.

{
  "$schema": "https://schema.management.azure.com/schemas/2019-04-01/deploymentTemplate.json#",
  "contentVersion": "1.0.0.0",
  "metadata": {
    "_generator": {
      "name": "bicep",
      "version": "0.5.6.12127",
      "templateHash": "4742950082151195489"
    }
  },
  "parameters": {
    "clusterName": {
      "type": "string",
      "metadata": {
        "description": "The name of the HDInsight cluster to create."
      }
    },
    "clusterLoginUserName": {
      "type": "string",
      "maxLength": 20,
      "minLength": 2,
      "metadata": {
        "description": "These credentials can be used to submit jobs to the cluster and to log into cluster dashboards. The username must consist of digits, upper or lowercase letters, and/or the following special characters: (!#$%&'()-^_`{}~)."
      }
    },
    "clusterLoginPassword": {
      "type": "secureString",
      "minLength": 10,
      "metadata": {
        "description": "The password must be at least 10 characters in length and must contain at least one digit, one upper case letter, one lower case letter, and one non-alphanumeric character except (single-quote, double-quote, backslash, right-bracket, full-stop). Also, the password must not contain 3 consecutive characters from the cluster username or SSH username."
      }
    },
    "sshUserName": {
      "type": "string",
      "minLength": 2,
      "metadata": {
        "description": "These credentials can be used to remotely access the cluster. The sshUserName can only consit of digits, upper or lowercase letters, and/or the following special characters (%&'^_`{}~). Also, it cannot be the same as the cluster login username or a reserved word"
      }
    },
    "sshPassword": {
      "type": "secureString",
      "maxLength": 72,
      "minLength": 6,
      "metadata": {
        "description": "SSH password must be 6-72 characters long and must contain at least one digit, one upper case letter, and one lower case letter.  It must not contain any 3 consecutive characters from the cluster login name"
      }
    },
    "location": {
      "type": "string",
      "defaultValue": "[resourceGroup().location]",
      "metadata": {
        "description": "Location for all resources."
      }
    },
    "headNodeVirtualMachineSize": {
      "type": "string",
      "defaultValue": "Standard_E8_v3",
      "allowedValues": [
        "Standard_A4_v2",
        "Standard_A8_v2",
        "Standard_E2_v3",
        "Standard_E4_v3",
        "Standard_E8_v3",
        "Standard_E16_v3",
        "Standard_E20_v3",
        "Standard_E32_v3",
        "Standard_E48_v3"
      ],
      "metadata": {
        "description": "This is the headnode Azure Virtual Machine size, and will affect the cost. If you don't know, just leave the default value."
      }
    },
    "workerNodeVirtualMachineSize": {
      "type": "string",
      "defaultValue": "Standard_E8_v3",
      "allowedValues": [
        "Standard_A4_v2",
        "Standard_A8_v2",
        "Standard_E2_v3",
        "Standard_E4_v3",
        "Standard_E8_v3",
        "Standard_E16_v3",
        "Standard_E20_v3",
        "Standard_E32_v3",
        "Standard_E48_v3"
      ],
      "metadata": {
        "description": "This is the workernode Azure Virtual Machine size, and will affect the cost. If you don't know, just leave the default value."
      }
    }
  },
  "resources": [
    {
      "type": "Microsoft.Storage/storageAccounts",
      "apiVersion": "2021-08-01",
      "name": "[format('storage{0}', uniqueString(resourceGroup().id))]",
      "location": "[parameters('location')]",
      "sku": {
        "name": "Standard_LRS"
      },
      "kind": "StorageV2"
    },
    {
      "type": "Microsoft.HDInsight/clusters",
      "apiVersion": "2021-06-01",
      "name": "[parameters('clusterName')]",
      "location": "[parameters('location')]",
      "properties": {
        "clusterVersion": "4.0",
        "osType": "Linux",
        "tier": "Standard",
        "clusterDefinition": {
          "kind": "spark",
          "configurations": {
            "gateway": {
              "restAuthCredential.isEnabled": true,
              "restAuthCredential.username": "[parameters('clusterLoginUserName')]",
              "restAuthCredential.password": "[parameters('clusterLoginPassword')]"
            }
          }
        },
        "storageProfile": {
          "storageaccounts": [
            {
              "name": "[replace(replace(reference(resourceId('Microsoft.Storage/storageAccounts', format('storage{0}', uniqueString(resourceGroup().id)))).primaryEndpoints.blob, 'https://', ''), '/', '')]",
              "isDefault": true,
              "container": "[parameters('clusterName')]",
              "key": "[listKeys(resourceId('Microsoft.Storage/storageAccounts', format('storage{0}', uniqueString(resourceGroup().id))), '2021-08-01').keys[0].value]"
            }
          ]
        },
        "computeProfile": {
          "roles": [
            {
              "name": "headnode",
              "targetInstanceCount": 2,
              "hardwareProfile": {
                "vmSize": "[parameters('headNodeVirtualMachineSize')]"
              },
              "osProfile": {
                "linuxOperatingSystemProfile": {
                  "username": "[parameters('sshUserName')]",
                  "password": "[parameters('sshPassword')]"
                }
              }
            },
            {
              "name": "workernode",
              "targetInstanceCount": 2,
              "hardwareProfile": {
                "vmSize": "[parameters('workerNodeVirtualMachineSize')]"
              },
              "osProfile": {
                "linuxOperatingSystemProfile": {
                  "username": "[parameters('sshUserName')]",
                  "password": "[parameters('sshPassword')]"
                }
              }
            }
          ]
        }
      },
      "dependsOn": [
        "[resourceId('Microsoft.Storage/storageAccounts', format('storage{0}', uniqueString(resourceGroup().id)))]"
      ]
    }
  ],
  "outputs": {
    "storage": {
      "type": "object",
      "value": "[reference(resourceId('Microsoft.Storage/storageAccounts', format('storage{0}', uniqueString(resourceGroup().id))))]"
    },
    "cluster": {
      "type": "object",
      "value": "[reference(resourceId('Microsoft.HDInsight/clusters', parameters('clusterName')))]"
    }
  }
}

Två Azure-resurser definieras i mallen:

Distribuera mallen

  1. Välj knappen Distribuera till Azure nedan om du vill logga in på Azure och öppna ARM-mallen.

    Button to deploy the Resource Manager template to Azure.

  2. Ange eller välj följande värden:

    Egenskap Beskrivning
    Prenumeration I listrutan väljer du den Azure-prenumeration som används för klustret.
    Resursgrupp Välj din befintliga resursgrupp i listrutan eller välj Skapa ny.
    Location Värdet fylls i automatiskt med den plats som används för resursgruppen.
    Klusternamn Ange ett globalt unikt namn. För den här mallen använder du endast gemener och siffror.
    Användarnamn för klusterinloggning Ange användarnamnet, standardvärdet är admin.
    Lösenord för klusterinloggning Ange ett lösenord. Lösenordet måste vara minst 10 tecken långt och måste innehålla minst en siffra, en versal och en gemen bokstav, ett icke-alfanumeriskt tecken (förutom tecken ' ` ").
    SSH-användarnamn Ange användarnamnet, standardvärdet är sshuser.
    SSH-lösenord Ange lösenordet.

    Create Spark cluster in HDInsight using Azure Resource Manager template.

  3. Granska VILLKOREN. Välj sedan Jag godkänner de villkor som anges ovan och sedan Köp. Du får ett meddelande om att distributionen pågår. Det tar cirka 20 minuter att skapa ett kluster.

Om du stöter på ett problem med att skapa HDInsight-kluster kan det bero på att du inte har rätt behörighet att göra det. Mer information finns i åtkomstkravkontrollen.

Granska distribuerade resurser

När klustret har skapats får du ett meddelande om att distributionen lyckades med länken Gå till resurs . På sidan Resursgrupp visas en lista över ditt nya HDInsight-kluster och standardlagringsutrymmet som är associerat till klustret. Varje kluster har en Azure Storage, en Azure Data Lake Storage Gen1 eller ett Azure Data Lake Storage Gen2 beroende. Det kallas standardlagringskontot. HDInsight-klustret och dess standardlagringskonto måste vara samlokaliserade i samma Azure-region. Om du tar bort kluster tas inte lagringskontoberoendet bort. Det kallas standardlagringskontot. HDInsight-klustret och dess standardlagringskonto måste vara samlokaliserade i samma Azure-region. När du tar bort kluster tas inte lagringskontot bort.

Skapa en Jupyter Notebook-fil

Jupyter Notebook är en interaktiv anteckningsboksmiljö som stöder flera olika datorspråk. Du kan använda en Jupyter Notebook-fil för att interagera med dina data, kombinera kod med markdown-text och utföra enkla visualiseringar.

  1. Öppna Azure Portal.

  2. Välj HDInsight-kluster och välj sedan det kluster som du skapade.

    Open HDInsight cluster in the Azure portal.

  3. I avsnittet Klusterinstrumentpaneler i portalen väljer du Jupyter Notebook. Ange autentiseringsuppgifterna för klustret om du uppmanas att göra det.

    Open Jupyter Notebook to run interactive Spark SQL query.

  4. Skapa en anteckningsbok genom att välja Ny>PySpark.

    Create a Jupyter Notebook file to run interactive Spark SQL query.

    En ny anteckningsbok skapas och öppnas med namnet Untitled(Untitled.pynb).

Köra Apache Spark SQL-instruktioner

SQL (Structured Query Language) är det vanligaste språket för frågor och transformering av data. Spark SQL fungerar som ett tillägg till Apache Spark för bearbetning av strukturerade data med den välbekanta SQL-syntaxen.

  1. Verifiera att kerneln är klar. Kerneln är klar när du ser en tom cirkel bredvid kernelnamnet i den bärbara datorn. En fylld cirkel anger att kerneln är upptagen.

    Kernel status alt-text="Kernel status." border="true":::

    När du startar den bärbara datorn för första gången utför kerneln några uppgifter i bakgrunden. Vänta tills kerneln är klar.

  2. Klistra in följande kod i en tom cell och tryck sedan på SKIFT+RETUR för att köra koden. Kommandot listar Hive-tabellerna i klustret:

    %%sql
    SHOW TABLES
    

    När du använder en Jupyter Notebook-fil med ditt HDInsight-kluster får du en förinställd spark session som du kan använda för att köra Hive-frågor med Spark SQL. %%sql anger att Jupyter Notebook ska använda den förinställda sessionen spark när Hive-frågan ska köras. Frågan hämtar de översta 10 raderna från en Hive-tabell (hivesampletable) som medföljer alla HDInsight-kluster som standard. Första gången du skickar frågan skapar Jupyter ett Spark-program för notebook-filen. Det tar ungefär 30 sekunder att slutföra. När Spark-programmet är klart körs frågan på ungefär en sekund och ger resultatet. Utdata ser ut så här:

    Apache Hive query in HDInsight. y i HDInsight" border="true":::

    Varje gång du kör en fråga i Jupyter visar fönsterrubriken i webbläsaren statusen (Upptagen) tillsammans med anteckningsbokens titel. Du ser även en fylld cirkel bredvid PySpark-texten i det övre högra hörnet.

  3. Kör ytterligare en fråga för att visa data i hivesampletable.

    %%sql
    SELECT * FROM hivesampletable LIMIT 10
    

    Skärmen bör uppdateras så att frågeresultatet visas.

    Hive query output in HDInsight. Insight" border="true":::

  4. Välj Stäng och stoppa på anteckningsbokens Arkiv-meny. När du stänger notebook-filen frigörs klusterresurserna, inklusive Spark-programmet.

Rensa resurser

När du har slutfört snabbstarten kanske du vill ta bort klustret. Med HDInsight lagras dina data i Azure Storage, så att du på ett säkert sätt kan ta bort ett kluster när de inte används. Du debiteras också för ett HDInsight-kluster, även om det inte används. Eftersom avgifterna för klustret är många gånger högre än avgifterna för lagring är det ekonomiskt klokt att ta bort kluster när de inte används.

Från Azure-portalen går du till klustret och väljer Ta bort.

Azure portal delete an HDInsight cluster. sight cluster" border="true":::

Du kan också välja resursgruppnamnet för att öppna resursgruppsidan. Välj sedan Ta bort resursgrupp. Genom att ta bort resursgruppen tar du bort både HDInsight-klustret och standardlagringskontot.

Nästa steg

I den här snabbstarten har du lärt dig hur du skapar ett Apache Spark-kluster i HDInsight och kör en grundläggande Spark SQL-fråga. Gå vidare till nästa självstudie för att lära dig hur du använder ett HDInsight-kluster för att köra interaktiva frågor på exempeldata.