Använda Azure Toolkit for IntelliJ för att fjärrsöka Apache Spark-program i HDInsight via VPN

Vi rekommenderar att du felsöker Apache Spark-program via en fjärranslutning via SSH. Anvisningar finns i Fjärrfelsöka Apache Spark-program i ett HDInsight-kluster med Azure Toolkit for IntelliJ via SSH.

Den här artikeln innehåller stegvisa anvisningar om hur du använder HDInsight Tools i Azure Toolkit for IntelliJ för att skicka ett Spark-jobb på ett HDInsight Spark-kluster och sedan felsöka det via fjärranslutning från din stationära dator. För att slutföra dessa uppgifter måste du utföra följande steg på hög nivå:

  1. Skapa ett virtuellt Azure-nätverk för plats-till-plats eller punkt-till-plats. Stegen i det här dokumentet förutsätter att du använder ett plats-till-plats-nätverk.
  2. Skapa ett Spark-kluster i HDInsight som ingår i det virtuella nätverket plats-till-plats.
  3. Kontrollera anslutningen mellan klusterhuvudnoden och skrivbordet.
  4. Skapa ett Scala-program i IntelliJ IDEA och konfigurera det sedan för fjärrfelsökning.
  5. Kör och felsök programmet.

Förutsättningar

Steg 1: Skapa ett virtuellt Azure-nätverk

Följ anvisningarna från följande länkar för att skapa ett virtuellt Azure-nätverk och kontrollera sedan anslutningen mellan din stationära dator och det virtuella nätverket:

Steg 2: Skapa ett HDInsight Spark-kluster

Vi rekommenderar att du även skapar ett Apache Spark-kluster i Azure HDInsight som är en del av det virtuella Azure-nätverk som du skapade. Använd informationen som är tillgänglig i Skapa Linux-baserade kluster i HDInsight. Som en del av den valfria konfigurationen väljer du det virtuella Azure-nätverk som du skapade i föregående steg.

Steg 3: Kontrollera anslutningen mellan klusterhuvudnoden och skrivbordet

  1. Hämta IP-adressen för huvudnoden. Öppna Ambari-användargränssnittet för klustret. Välj Instrumentpanel på klusterbladet.

    Select Dashboard in Apache Ambari.

  2. I Ambari-användargränssnittet väljer du Värdar.

    Select Hosts in Apache Ambari.

  3. Du ser en lista över huvudnoder, arbetsnoder och zookeeper-noder. Huvudnoderna har ett hn*-prefix. Välj den första huvudnoden.

    Find the head node in Apache Ambari.

  4. I fönstret Sammanfattning längst ned på sidan som öppnas kopierar du IP-adressen för huvudnoden och värdnamnet.

    Find the IP address in Apache Ambari.

  5. Lägg till IP-adressen och värdnamnet för huvudnoden i värdfilen på den dator där du vill köra och fjärrsöka Spark-jobbet. På så sätt kan du kommunicera med huvudnoden med hjälp av IP-adressen och värdnamnet.

    a. Öppna en Anteckningar fil med utökade behörigheter. På menyn Arkiv väljer du Öppna och letar sedan reda på platsen för värdfilen. På en Windows-dator är platsen C:\Windows\System32\Drivers\etc\hosts.

    b. Lägg till följande information i värdfilen :

    # For headnode0
    192.xxx.xx.xx nitinp
    192.xxx.xx.xx nitinp.lhwwghjkpqejawpqbwcdyp3.gx.internal.cloudapp.net
    
    # For headnode1
    192.xxx.xx.xx nitinp
    192.xxx.xx.xx nitinp.lhwwghjkpqejawpqbwcdyp3.gx.internal.cloudapp.net
    
  6. Från den dator som du har anslutit till det virtuella Azure-nätverket som används av HDInsight-klustret kontrollerar du att du kan pinga huvudnoderna med hjälp av IP-adressen samt värdnamnet.

  7. Använd SSH för att ansluta till klusterhuvudnoden genom att följa anvisningarna i Anslut till ett HDInsight-kluster med hjälp av SSH. Från klusterhuvudnoden pingar du IP-adressen för den stationära datorn. Testa anslutningen till båda IP-adresserna som tilldelats datorn:

    • En för nätverksanslutningen
    • En för det virtuella Azure-nätverket
  8. Upprepa stegen för den andra huvudnoden.

Steg 4: Skapa ett Apache Spark Scala-program med hdinsight-verktyg i Azure Toolkit for IntelliJ och konfigurera det för fjärrfelsökning

  1. Öppna IntelliJ IDEA och skapa ett nytt projekt. Gör följande i dialogrutan Nytt projekt:

    Select the new project template in IntelliJ IDEA.

    a. Välj HDInsight>Spark i HDInsight (Scala).

    b. Välj Nästa.

  2. I nästa dialogrutan Nytt projekt gör du följande och väljer sedan Slutför:

    • Ange ett projektnamn och en plats.

    • I listrutan Projekt-SDK väljer du Java 1.8 för Spark 2.x-klustret, eller Java 1.7 för Spark 1.x-klustret.

    • I listrutan Spark-version integrerar guiden Skapa Scala-projekt rätt version för Spark SDK och Scala SDK. Om Sparks klusterversion är äldre än 2.0 väljer du Spark 1.x. Annars väljer du Spark 2.x. I det här exemplet används Spark 2.0.2 (Scala 2.11.8).

    Select the project SDK and Spark version.

  3. Spark-projektet skapar automatiskt en artefakt åt dig. Om du vill visa artefakten gör du följande:

    a. I menyn Arkiv väljer du Projektstruktur.

    b. I dialogrutan Projektstruktur väljer du Artefakter för att visa standardartefakten som skapas. Du kan också skapa en egen artefakt genom att välja plustecknet (+).

    IntelliJ IDEA artifacts create jar.

  4. Lägg till bibliotek i projektet. Gör följande för att lägga till ett bibliotek:

    a. Högerklicka på projektnamnet i projektträdet och välj sedan Öppna modul Inställningar.

    b. I dialogrutan Projektstruktur väljer du Bibliotek, väljer symbolen (+) och sedan Från Maven.

    IntelliJ IDEA download library.

    c. I dialogrutan Ladda ned bibliotek från Maven-lagringsplatsen söker du efter och lägger till följande bibliotek:

    • org.scalatest:scalatest_2.10:2.2.1
    • org.apache.hadoop:hadoop-azure:2.7.1
  5. Kopiera yarn-site.xml och core-site.xml från klusterhuvudnoden och lägg till dem i projektet. Använd följande kommandon för att kopiera filerna. Du kan använda Cygwin för att köra följande scp kommandon för att kopiera filerna från klusterhuvudnoderna:

    scp <ssh user name>@<headnode IP address or host name>://etc/hadoop/conf/core-site.xml .
    

    Eftersom vi redan har lagt till klusterhuvudnodens IP-adress och värdnamn för värdfilen på skrivbordet kan vi använda scp kommandona på följande sätt:

    scp sshuser@nitinp:/etc/hadoop/conf/core-site.xml .
    scp sshuser@nitinp:/etc/hadoop/conf/yarn-site.xml .
    

    Om du vill lägga till dessa filer i projektet kopierar du dem under mappen /src i projektträdet, till exempel <your project directory>\src.

  6. core-site.xml Uppdatera filen för att göra följande ändringar:

    a. Ersätt den krypterade nyckeln. Filen core-site.xml innehåller den krypterade nyckeln till lagringskontot som är associerat med klustret. I filen core-site.xml som du lade till i projektet ersätter du den krypterade nyckeln med den faktiska lagringsnyckeln som är associerad med standardlagringskontot. Mer information finns i Hantera åtkomstnycklar för lagringskonto.

    <property>
            <name>fs.azure.account.key.hdistoragecentral.blob.core.windows.net</name>
            <value>access-key-associated-with-the-account</value>
    </property>
    

    b. Ta bort följande poster från core-site.xml:

    <property>
            <name>fs.azure.account.keyprovider.hdistoragecentral.blob.core.windows.net</name>
            <value>org.apache.hadoop.fs.azure.ShellDecryptionKeyProvider</value>
    </property>
    
    <property>
            <name>fs.azure.shellkeyprovider.script</name>
            <value>/usr/lib/python2.7/dist-packages/hdinsight_common/decrypt.sh</value>
    </property>
    
    <property>
            <name>net.topology.script.file.name</name>
            <value>/etc/hadoop/conf/topology_script.py</value>
    </property>
    

    c. Spara filen.

  7. Lägg till huvudklassen för ditt program. I Project Explorer högerklickar du på src, pekar på Ny och väljer sedan Scala-klass.

    IntelliJ IDEA Select the main class.

  8. I dialogrutan Skapa ny Scala-klass anger du ett namn, väljer Objekt i rutan Typ och väljer sedan OK.

    IntelliJ IDEA Create new Scala class.

  9. MyClusterAppMain.scala Klistra in följande kod i filen. Den här koden skapar Spark-kontexten och öppnar en executeJob metod från SparkSample objektet.

    import org.apache.spark.{SparkConf, SparkContext}
    
    object SparkSampleMain {
        def main (arg: Array[String]): Unit = {
        val conf = new SparkConf().setAppName("SparkSample")
                                    .set("spark.hadoop.validateOutputSpecs", "false")
        val sc = new SparkContext(conf)
    
        SparkSample.executeJob(sc,
                            "wasb:///HdiSamples/HdiSamples/SensorSampleData/hvac/HVAC.csv",
                            "wasb:///HVACOut")
        }
    }
    
  10. Upprepa steg 8 och 9 för att lägga till ett nytt Scala-objekt med namnet *SparkSample. Lägg till följande kod i klassen. Den här koden läser data från HVAC.csv (finns i alla HDInsight Spark-kluster). Den hämtar de rader som bara har en siffra i den sjunde kolumnen i CSV-filen och skriver sedan utdata till /HVACOut under standardlagringscontainern för klustret.

    import org.apache.spark.SparkContext
    
    object SparkSample {
        def executeJob (sc: SparkContext, input: String, output: String): Unit = {
        val rdd = sc.textFile(input)
    
        //find the rows which have only one digit in the 7th column in the CSV
        val rdd1 =  rdd.filter(s => s.split(",")(6).length() == 1)
    
        val s = sc.parallelize(rdd.take(5)).cartesian(rdd).count()
        println(s)
    
        rdd1.saveAsTextFile(output)
        //rdd1.collect().foreach(println)
         }
    }
    
  11. Upprepa steg 8 och 9 för att lägga till en ny klass med namnet RemoteClusterDebugging. Den här klassen implementerar Spark-testramverket som används för att felsöka programmen. Lägg till följande kod i RemoteClusterDebugging klassen:

        import org.apache.spark.{SparkConf, SparkContext}
        import org.scalatest.FunSuite
    
        class RemoteClusterDebugging extends FunSuite {
    
         test("Remote run") {
           val conf = new SparkConf().setAppName("SparkSample")
                                     .setMaster("yarn-client")
                                     .set("spark.yarn.am.extraJavaOptions", "-Dhdp.version=2.4")
                                     .set("spark.yarn.jar", "wasb:///hdp/apps/2.4.2.0-258/spark-assembly-1.6.1.2.4.2.0-258-hadoop2.7.1.2.4.2.0-258.jar")
                                     .setJars(Seq("""C:\workspace\IdeaProjects\MyClusterApp\out\artifacts\MyClusterApp_DefaultArtifact\default_artifact.jar"""))
                                     .set("spark.hadoop.validateOutputSpecs", "false")
           val sc = new SparkContext(conf)
    
           SparkSample.executeJob(sc,
             "wasb:///HdiSamples/HdiSamples/SensorSampleData/hvac/HVAC.csv",
             "wasb:///HVACOut")
         }
        }
    

    Det finns några viktiga saker att notera:

    • För .set("spark.yarn.jar", "wasb:///hdp/apps/2.4.2.0-258/spark-assembly-1.6.1.2.4.2.0-258-hadoop2.7.1.2.4.2.0-258.jar")kontrollerar du att Spark-sammansättnings-JAR:en är tillgänglig på klusterlagringen på den angivna sökvägen.
    • För setJarsanger du platsen där artefakt-JAR:en skapas. Vanligtvis är <Your IntelliJ project directory>\out\<project name>_DefaultArtifact\default_artifact.jardet .
  12. Högerklicka på nyckelordet*RemoteClusterDebugging i test klassen och välj sedan Skapa RemoteClusterDebugging-konfiguration.

    IntelliJ IDEA Create a remote configuration.

  13. I dialogrutan Skapa RemoteClusterDebugging-konfiguration anger du ett namn för konfigurationen och väljer sedan Typ av test som testnamn. Lämna alla andra värden som standardinställningar. Tryck på Tillämpa och välj sedan OK.

    Create RemoteClusterDebugging Configuration.

  14. Nu bör du se en listruta för konfiguration av fjärrkörning i menyraden.

    IntelliJ The Remote run drop-down list.

Steg 5: Kör programmet i felsökningsläge

  1. Öppna och skapa en brytpunkt bredvid val rdd1i IntelliJ IDEA-projektetSparkSample.scala. I popup-menyn Skapa brytpunkt för väljer du rad i funktionen executeJob.

    IntelliJ IDEA Add a breakpoint.

  2. Om du vill köra programmet väljer du knappen Felsöka körning bredvid listrutan Fjärrkörningskonfiguration .

    IntelliJ IDEA Select the Debug Run button.

  3. När programkörningen når brytpunkten visas en felsökningsflik i det nedre fönstret.

    IntelliJ IDEA View the Debugger tab.

  4. Om du vill lägga till en klocka väljer du ikonen (+).

    IntelliJ debug-add-watch-variable.

    I det här exemplet bröt programmet innan variabeln rdd1 skapades. Med den här klockan kan vi se de första fem raderna i variabeln rdd. Välj Retur.

    IntelliJ Run the program in debug mode.

    Det du ser i den föregående avbildningen är att du vid körningen kan köra frågor mot terabyte data och felsöka hur programmet fortskrider. I de utdata som visas i föregående bild kan du till exempel se att den första raden i utdata är en rubrik. Baserat på dessa utdata kan du ändra programkoden för att hoppa över rubrikraden om det behövs.

  5. Nu kan du välja ikonen Återuppta program för att fortsätta med programkörningen.

    IntelliJ IDEA Select Resume Program.

  6. Om programmet har slutförts bör du se utdata som följande:

    IntelliJ IDEA debugger console output.

Nästa steg

Scenarier

Skapa och köra program

Verktyg och tillägg

Hantera resurser