Použití sady Azure Toolkit for IntelliJ k vzdálenému ladění aplikací Apache Spark ve službě HDInsight prostřednictvím sítě VPN

Doporučujeme vzdáleně ladit aplikace Apache Spark přes SSH. Pokyny najdete v tématu Vzdálené ladění aplikací Apache Spark v clusteru HDInsight pomocí sady Azure Toolkit for IntelliJ prostřednictvím SSH.

Tento článek obsahuje podrobné pokyny k tomu, jak pomocí nástrojů HDInsight v sadě Azure Toolkit for IntelliJ odeslat úlohu Sparku v clusteru HDInsight Spark a pak ji vzdáleně ladit z počítače. Pokud chcete tyto úlohy dokončit, musíte provést následující základní kroky:

  1. Vytvořte virtuální síť Azure typu site-to-site nebo point-to-site. Kroky v tomto dokumentu předpokládají, že používáte síť typu site-to-site.
  2. Vytvořte cluster Spark ve službě HDInsight, který je součástí virtuální sítě site-to-site.
  3. Ověřte připojení mezi hlavním uzlem clusteru a počítačem.
  4. Vytvořte aplikaci Scala v IntelliJ IDEA a nakonfigurujte ji pro vzdálené ladění.
  5. Spusťte a ladit aplikaci.

Požadavky

Krok 1: Vytvoření virtuální sítě Azure

Podle pokynů z následujících odkazů vytvořte virtuální síť Azure a ověřte připojení mezi vaším stolním počítačem a virtuální sítí:

Krok 2: Vytvoření clusteru HDInsight Spark

Doporučujeme také vytvořit cluster Apache Spark v Azure HDInsight, který je součástí vámi vytvořené virtuální sítě Azure. Použijte informace, které jsou k dispozici v vytváření linuxových clusterů ve službě HDInsight. Jako součást volitelné konfigurace vyberte virtuální síť Azure, kterou jste vytvořili v předchozím kroku.

Krok 3: Ověření připojení mezi hlavním uzlem clusteru a počítačem

  1. Získejte IP adresu hlavního uzlu. Otevřete uživatelské rozhraní Ambari pro cluster. V okně clusteru vyberte Řídicí panel.

    Select Dashboard in Apache Ambari.

  2. V uživatelském rozhraní Ambari vyberte Hostitelé.

    Select Hosts in Apache Ambari.

  3. Zobrazí se seznam hlavních uzlů, pracovních uzlů a uzlů zookeeper. Hlavní uzly mají předponu hn*. Vyberte první hlavní uzel.

    Find the head node in Apache Ambari.

  4. V podokně Souhrn v dolní části stránky, která se otevře, zkopírujte IP adresu hlavního uzlu a název hostitele.

    Find the IP address in Apache Ambari.

  5. Přidejte IP adresu a název hostitele hlavního uzlu do souboru hostitelů v počítači, na kterém chcete spustit a vzdáleně ladit úlohu Sparku. To vám umožní komunikovat s hlavním uzlem pomocí IP adresy a názvu hostitele.

    a. Otevřete soubor Poznámkový blok se zvýšenými oprávněními. V nabídce Soubor vyberte Otevřít a vyhledejte umístění souboru hostitelů. Na počítači s Windows je umístění C:\Windows\System32\Drivers\etc\hosts.

    b. Do souboru hostitelů přidejte následující informace:

    # 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. Z počítače, který jste připojili k virtuální síti Azure používané clusterem HDInsight, ověřte, že pomocí IP adresy a názvu hostitele můžete hlavní uzly otestovat příkazem ping.

  7. Pomocí protokolu SSH se připojte k hlavnímu uzlu clusteru podle pokynů v Připojení ke clusteru HDInsight pomocí SSH. Z hlavního uzlu clusteru odešlete příkazem ping IP adresu stolního počítače. Otestujte připojení k oběma IP adresům přiřazeným k počítači:

    • Jedno pro síťové připojení
    • Jedna pro virtuální síť Azure
  8. Opakujte kroky pro druhý hlavní uzel.

Krok 4: Vytvoření aplikace Apache Spark Scala pomocí nástrojů HDInsight v sadě Azure Toolkit for IntelliJ a jeho konfigurace pro vzdálené ladění

  1. Otevřete IntelliJ IDEA a vytvořte nový projekt. V dialogovém okně New Project (Nový projekt) proveďte následující kroky:

    Select the new project template in IntelliJ IDEA.

    a. Vyberte HDInsight>Spark on HDInsight (Scala) (Spark v HDInsight (Scala)).

    b. Vyberte Další.

  2. V dalším dialogovém okně Nový projekt proveďte následující kroky a pak vyberte Dokončit:

    • Zadejte název a umístění projektu.

    • V rozevíracím seznamu Project SDK (SDK projektu) vyberte Java 1.8 pro cluster Spark 2.x, nebo vyberte Java 1.7 pro cluster Spark 1.x.

    • V rozevíracím seznamu verzí Sparku průvodce vytvořením projektu Scala integruje správnou verzi sady Spark SDK a sady Scala SDK. Pokud je verze clusteru Spark nižší než 2.0, vyberte Spark 1.x. V opačném případě vyberte Spark 2.x. V tomto příkladu se používá Spark 2.0.2 (Scala 2.11.8).

    Select the project SDK and Spark version.

  3. Projekt Spark automaticky vytvoří artefakt za vás. Pokud chcete zobrazit artefakt, postupujte takto:

    a. V nabídce File (Soubor) vyberte Project Structure (Struktura projektu).

    b. V dialogovém okně Struktura projektu vyberte Artefakty a zobrazte výchozí artefakt, který je vytvořen. Můžete také vytvořit vlastní artefakt výběrem znaménka plus (+).

    IntelliJ IDEA artifacts create jar.

  4. Přidejte do projektu knihovny. Pokud chcete přidat knihovnu, postupujte takto:

    a. Pravým tlačítkem myši klikněte na název projektu ve stromu projektu a pak vyberte Otevřít modul Nastavení.

    b. V dialogovém okně Struktura projektu vyberte Knihovny, vyberte symbol (+) a pak vyberte Z Mavenu.

    IntelliJ IDEA download library.

    c. V dialogovém okně Stáhnout knihovnu z úložiště Maven vyhledejte a přidejte následující knihovny:

    • org.scalatest:scalatest_2.10:2.2.1
    • org.apache.hadoop:hadoop-azure:2.7.1
  5. Zkopírujte yarn-site.xml hlavní uzel clusteru a core-site.xml přidejte je do projektu. Ke zkopírování souborů použijte následující příkazy. Pomocí Cygwinu můžete spustit následující scp příkazy ke zkopírování souborů z hlavních uzlů clusteru:

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

    Protože jsme už přidali IP adresu a názvy hostitelů hlavního uzlu clusteru pro soubor hostitelů na ploše, můžeme příkazy použít scp následujícím způsobem:

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

    Pokud chcete tyto soubory přidat do projektu, zkopírujte je do složky /src ve stromu projektu, například <your project directory>\src.

  6. core-site.xml Aktualizujte soubor a proveďte následující změny:

    a. Nahraďte šifrovaný klíč. Soubor core-site.xml obsahuje šifrovaný klíč k účtu úložiště přidruženému ke clusteru. core-site.xml V souboru, který jste přidali do projektu, nahraďte šifrovaný klíč skutečným klíčem úložiště přidruženým k výchozímu účtu úložiště. Další informace najdete v tématu Správa přístupových klíčů účtu úložiště.

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

    b. Odeberte následující položky z 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. Uložte soubor.

  7. Přidejte hlavní třídu pro vaši aplikaci. V Průzkumníku projektů klikněte pravým tlačítkem myši na src, přejděte na příkaz Nový a vyberte Třídu Scala.

    IntelliJ IDEA Select the main class.

  8. V dialogovém okně Vytvořit novou třídu Scala zadejte název, vyberte v poli Druh objekta pak vyberte OK.

    IntelliJ IDEA Create new Scala class.

  9. MyClusterAppMain.scala Do souboru vložte následující kód. Tento kód vytvoří kontext Sparku a otevře z executeJob objektu metodu SparkSample .

    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. Opakováním kroků 8 a 9 přidejte nový objekt Scala s názvem *SparkSample. Přidejte do této třídy následující kód. Tento kód načte data z HVAC.csv (k dispozici ve všech clusterech HDInsight Spark). Načte řádky, které mají v souboru CSV pouze jednu číslici v sedmém sloupci, a potom zapíše výstup do /HVACOut pod výchozím kontejnerem úložiště clusteru.

    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. Opakováním kroků 8 a 9 přidejte novou třídu s názvem RemoteClusterDebugging. Tato třída implementuje testovací architekturu Sparku, která se používá k ladění aplikací. Do třídy přidejte následující kód RemoteClusterDebugging :

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

    Je potřeba si uvědomit několik důležitých věcí:

    • Ujistěte .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")se, že je jar sestavení Sparku k dispozici v úložišti clusteru v zadané cestě.
    • Zadejte setJarsumístění, kde se vytvoří soubor JAR artefaktu. Obvykle je <Your IntelliJ project directory>\out\<project name>_DefaultArtifact\default_artifact.jarto .
  12. *RemoteClusterDebugging Ve třídě klikněte pravým tlačítkem myši na test klíčové slovo a pak vyberte Vytvořit konfiguraci vzdáleného ladění.

    IntelliJ IDEA Create a remote configuration.

  13. V dialogovém okně Vytvořit konfiguraci vzdáleného ladění zadejte název konfigurace a jako název testu vyberte Typtestu. Ponechte všechny ostatní hodnoty jako výchozí nastavení. Vyberte Apply (Použít) a pak vyberte OK.

    Create RemoteClusterDebugging Configuration.

  14. V řádku nabídek by se teď měl zobrazit rozevírací seznam konfigurace vzdáleného spuštění .

    IntelliJ The Remote run drop-down list.

Krok 5: Spuštění aplikace v režimu ladění

  1. V projektu IntelliJ IDEA otevřete SparkSample.scala a vytvořte zarážku vedle val rdd1. V místní nabídce Vytvořit zarážku vyberte řádek ve funkci executeJob.

    IntelliJ IDEA Add a breakpoint.

  2. Pokud chcete aplikaci spustit, vyberte tlačítko Spustit ladění vedle rozevíracího seznamu Konfigurace vzdáleného spuštění .

    IntelliJ IDEA Select the Debug Run button.

  3. Když provádění programu dosáhne zarážky, zobrazí se v dolním podokně karta ladicího programu .

    IntelliJ IDEA View the Debugger tab.

  4. Pokud chcete přidat hodinky, vyberte ikonu (+).

    IntelliJ debug-add-watch-variable.

    V tomto příkladu se aplikace před vytvořením proměnné rdd1 přerušila. Pomocí tohoto kukátku vidíme prvních pět řádků v proměnné rdd. Stiskněte klávesu Enter.

    IntelliJ Run the program in debug mode.

    To, co vidíte na předchozím obrázku, je to, že za běhu můžete zadávat dotazy na terabajty dat a ladit průběh aplikace. Například ve výstupu zobrazeném na předchozím obrázku vidíte, že první řádek výstupu je záhlaví. Na základě tohoto výstupu můžete upravit kód aplikace tak, aby v případě potřeby přeskočí řádek záhlaví.

  5. Teď můžete vybrat ikonu Pokračovat v programu a pokračovat ve spuštění aplikace.

    IntelliJ IDEA Select Resume Program.

  6. Pokud se aplikace úspěšně dokončí, měl by se zobrazit výstup podobný tomuto:

    IntelliJ IDEA debugger console output.

Další kroky

Scénáře

Vytvoření a spouštění aplikací

Nástroje a rozšíření

Řízení zdrojů