Partager via


Utiliser le Kit de ressources Azure pour IntelliJ pour déboguer des applications Apache Spark à distance dans HDInsight via VPN

Nous vous recommandons de déboguer des applications Apache Spark à distance via SSH. Pour obtenir des instructions, consultez Débogage à distance d’applications Apache Spark sur un cluster HDInsight avec Le Kit de ressources Azure pour IntelliJ via SSH.

Cet article fournit des instructions pas à pas sur l’utilisation des outils HDInsight dans le kit de ressources Azure pour IntelliJ pour envoyer un travail Spark sur un cluster HDInsight Spark, puis le déboguer à distance à partir de votre ordinateur de bureau. Pour effectuer ces tâches, vous devez effectuer les étapes générales suivantes :

  1. Créez un réseau virtuel Azure de site à site ou point à site. Les étapes décrites dans ce document supposent que vous utilisez un réseau de site à site.
  2. Créez un cluster Spark dans HDInsight qui fait partie du réseau virtuel de site à site.
  3. Vérifiez la connectivité entre le nœud principal du cluster et votre bureau.
  4. Créez une application Scala dans IntelliJ IDEA, puis configurez-la pour le débogage à distance.
  5. Exécutez et déboguez l’application.

Conditions préalables

  • Un abonnement Azure.
  • Un cluster Apache Spark dans HDInsight. Pour obtenir des instructions, consultez Création de clusters Apache Spark dans Azure HDInsight.
  • Kit de développement Oracle Java. Vous pouvez l’installer à partir du site web Oracle.
  • IntelliJ IDEA. Cet article utilise la version 2017.1. Vous pouvez l’installer à partir du site web JetBrains.
  • HDInsight Tools dans la Boîte à outils Azure pour IntelliJ. Les outils HDInsight pour IntelliJ sont disponibles dans le cadre du Kit de ressources Azure pour IntelliJ. Pour obtenir des instructions sur l’installation d’Azure Toolkit, consultez Installer Azure Toolkit pour IntelliJ.
  • Connectez-vous à votre abonnement Azure à partir d’IntelliJ IDEA. Suivez les instructions de l’utilisation du Kit de ressources Azure pour IntelliJ pour créer des applications Apache Spark pour un cluster HDInsight.
  • Solution de contournement pour une exception. Lors de l’exécution de l’application Spark Scala pour le débogage à distance sur un ordinateur Windows, vous pouvez obtenir une exception. Cette exception est expliquée dans SPARK-2356 et se produit en raison d’un fichier WinUtils.exe manquant dans Windows. Pour contourner cette erreur, vous devez télécharger Winutils.exe à un emplacement tel que C :\WinUtils\bin. Ajoutez une variable d’environnement HADOOP_HOME , puis définissez la valeur de la variable sur C\WinUtils.

Étape 1 : Créer un réseau virtuel Azure

Suivez les instructions des liens suivants pour créer un réseau virtuel Azure, puis vérifiez la connectivité entre votre ordinateur de bureau et le réseau virtuel :

Étape 2 : Créer un cluster HDInsight Spark

Nous vous recommandons également de créer un cluster Apache Spark dans Azure HDInsight qui fait partie du réseau virtuel Azure que vous avez créé. Utilisez les informations disponibles dans Créer des clusters Linux dans HDInsight. Dans le cadre de la configuration facultative, sélectionnez le réseau virtuel Azure que vous avez créé à l’étape précédente.

Étape 3 : Vérifier la connectivité entre le nœud principal du cluster et votre bureau

  1. Obtenez l’adresse IP du nœud principal. Ouvrez l’interface utilisateur Ambari pour le cluster. Dans la lame du cluster, sélectionnez Tableau de bord.

    Sélectionnez Tableau de bord dans Apache Ambari.

  2. Dans l’interface utilisateur d’Ambari, sélectionnez Hôtes.

    Sélectionnez les hôtes dans Apache Ambari.

  3. Vous obtenez une liste de nœuds principaux, de nœuds worker et de nœuds zookeeper. Les nœuds principaux ont un préfixe hn*. Sélectionnez le premier nœud principal.

    Recherchez le nœud principal dans Apache Ambari.

  4. Dans le volet Résumé en bas de la page qui s’ouvre, copiez l’adresse IP du nœud principal et le nom d’hôte.

    Recherchez l’adresse IP dans Apache Ambari.

  5. Ajoutez l’adresse IP et le nom d’hôte du nœud principal au fichier hosts sur l’ordinateur sur lequel vous souhaitez exécuter et déboguer à distance le travail Spark. Cela vous permet de communiquer avec le nœud principal à l’aide de l’adresse IP, ainsi que du nom d’hôte.

    a) Ouvrez un fichier bloc-notes avec des autorisations élevées. Dans le menu Fichier , sélectionnez Ouvrir, puis recherchez l’emplacement du fichier hosts. Sur un ordinateur Windows, l’emplacement est C :\Windows\System32\Drivers\etc\hosts.

    b. Ajoutez les informations suivantes au fichier hosts :

    # 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. À partir de l’ordinateur que vous avez connecté au réseau virtuel Azure utilisé par le cluster HDInsight, vérifiez que vous pouvez effectuer un test ping sur les nœuds principaux à l’aide de l’adresse IP, ainsi que du nom d’hôte.

  7. Utilisez SSH pour vous connecter au nœud principal du cluster en suivant les instructions de connexion à un cluster HDInsight à l’aide de SSH. À partir du nœud principal du cluster, effectuez un test ping sur l’adresse IP de l’ordinateur de bureau. Testez la connectivité aux deux adresses IP affectées à l’ordinateur :

    • Une pour la connexion réseau
    • Un pour le réseau virtuel Azure
  8. Répétez les étapes pour l’autre nœud principal.

Étape 4 : Créer une application Apache Spark Scala à l’aide de HDInsight Tools dans le Kit de ressources Azure pour IntelliJ et la configurer pour le débogage à distance

  1. Ouvrez IntelliJ IDEA et créez un projet. Dans la boîte de dialogue Nouveau projet, procédez comme suit :

    Sélectionnez le nouveau modèle de projet dans IntelliJ IDEA.

    a) Sélectionnez HDInsight>Spark sur HDInsight (Scala).

    b. Cliquez sur Suivant.

  2. Dans la boîte de dialogue Nouveau projet suivant, procédez comme suit, puis sélectionnez Terminer :

    • Entrez un nom et un emplacement pour le projet.

    • Dans la liste déroulante Project SDK (SDK du projet), sélectionnez Java 1.8 pour le cluster Spark 2.x, ou sélectionnez Java 1.7 pour le cluster Spark 1.x.

    • Dans la liste déroulante des versions Spark , l’Assistant Création de projet Scala intègre la version appropriée pour le SDK Spark et le SDK Scala. Si la version du cluster Spark est antérieure à la version 2.0, sélectionnez Spark 1.x. Sinon, sélectionnez Spark2.x. Cet exemple utilise Spark 2.0.2 (Scala 2.11.8).

    Sélectionnez le Kit de développement logiciel (SDK) du projet et la version Spark.

  3. Le projet Spark crée automatiquement un artefact. Pour afficher l’artefact, procédez comme suit :

    a) Dans le menu Fichier , sélectionnez Structure du projet.

    b. Dans la boîte de dialogue Project Structure, sélectionnez Artifacts pour voir l’artefact par défaut qui a été créé. Vous pouvez également créer votre propre artefact en sélectionnant le signe plus (+).

    Les artefacts d'IntelliJ IDEA créent un fichier JAR.

  4. Ajoutez des bibliothèques à votre projet. Pour ajouter une bibliothèque, procédez comme suit :

    a) Cliquez avec le bouton droit sur le nom du projet dans l’arborescence du projet, puis sélectionnez Ouvrir les paramètres du module.

    b. Dans la boîte de dialogue Structure du projet , sélectionnez Bibliothèques, sélectionnez le symbole (+), puis Sélectionnez À partir de Maven.

    Bibliothèque de téléchargement IntelliJ IDEA.

    v. Dans la boîte de dialogue Télécharger la bibliothèque à partir du référentiel Maven , recherchez et ajoutez les bibliothèques suivantes :

    • org.scalatest:scalatest_2.10:2.2.1
    • org.apache.hadoop:hadoop-azure:2.7.1
  5. Copiez yarn-site.xml et core-site.xml du nœud principal du cluster et ajoutez-les au projet. Utilisez les commandes suivantes pour copier les fichiers. Vous pouvez utiliser Cygwin pour exécuter les commandes suivantes scp pour copier les fichiers à partir des nœuds principaux du cluster :

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

    Étant donné que nous avons déjà ajouté l’adresse IP du nœud principal du cluster et les noms d’hôte pour le fichier hosts sur le bureau, nous pouvons utiliser les scp commandes de la manière suivante :

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

    Pour ajouter ces fichiers à votre projet, copiez-les sous le dossier /src dans l’arborescence de votre projet, par exemple <your project directory>\src.

  6. Mettez à jour le core-site.xml fichier pour apporter les modifications suivantes :

    a) Remplacez la clé chiffrée. Le core-site.xml fichier inclut la clé chiffrée du compte de stockage associé au cluster. Dans le core-site.xml fichier que vous avez ajouté au projet, remplacez la clé chiffrée par la clé de stockage réelle associée au compte de stockage par défaut. Pour plus d’informations, consultez Gérer les clés d’accès au compte de stockage.

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

    b. Supprimez les entrées suivantes de 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>
    

    v. Enregistrez le fichier.

  7. Ajoutez la classe principale pour votre application. Dans l’Explorateur de projets, cliquez avec le bouton droit sur src, pointez sur Nouveau, puis sélectionnez Classe Scala.

    IntelliJ IDEA Sélectionnez la classe principale.

  8. Dans la boîte de dialogue Créer une classe Scala , indiquez un nom, sélectionnez Objet dans la zone Type , puis sélectionnez OK.

    IntelliJ IDEA Créer une classe Scala.

  9. Dans le MyClusterAppMain.scala fichier, collez le code suivant. Ce code crée le contexte Spark et ouvre une executeJob méthode à partir de l’objet 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. Répétez les étapes 8 et 9 pour ajouter un nouvel objet Scala appelé *SparkSample. Ajoutez le code suivant à cette classe. Ce code lit les données du HVAC.csv (disponible dans tous les clusters HDInsight Spark). Il récupère les lignes qui n’ont qu’un seul chiffre dans la septième colonne du fichier CSV, puis écrit la sortie dans /HVACOut sous le conteneur de stockage par défaut du cluster.

    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. Répétez les étapes 8 et 9 pour ajouter une nouvelle classe appelée RemoteClusterDebugging. Cette classe implémente l’infrastructure de test Spark utilisée pour déboguer les applications. Ajoutez le code suivant à la classe 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")
         }
        }
    

    Il y a quelques points importants à noter :

    • Pour .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"), vérifiez que le fichier JAR d’assembly Spark est disponible sur le stockage de cluster sur le chemin spécifié.
    • Pour setJars, spécifiez l’emplacement où le fichier JAR d’artefact est créé. En règle générale, c’est <Your IntelliJ project directory>\out\<project name>_DefaultArtifact\default_artifact.jar.
  12. Dans la classe *RemoteClusterDebugging, cliquez avec le bouton droit sur le mot-clé test, puis sélectionnez Create RemoteClusterDebugging Configuration (Créer une configuration RemoteClusterDebugging).

    IntelliJ IDEA Créer une configuration distante.

  13. Dans la boîte de dialogue Créer une configuration remoteClusterDebugging , indiquez un nom pour la configuration, puis sélectionnez Type de test comme nom de test. Conservez toutes les autres valeurs comme paramètres par défaut. Sélectionnez Appliquer, puis ok.

    Créez une configuration RemoteClusterDebugging.

  14. Vous devez maintenant voir une liste déroulante de configuration d’exécution à distance dans la barre de menus.

    IntelliJ Liste déroulante d’exécution à distance.

Étape 5 : Exécuter l’application en mode débogage

  1. Dans votre projet IntelliJ IDEA, ouvrez SparkSample.scala et créez un point d’arrêt à côté de val rdd1. Dans le menu contextuel Create Breakpoint for (Créer un point d’arrêt pour), sélectionnez line in function executeJob (ligne dans la fonction executeJob).

    IntelliJ IDEA Ajouter un point d’arrêt.

  2. Pour exécuter l’application, cliquez sur le bouton Debug Run (Exécuter le débogage) situé en regard de la liste déroulante de configuration Remote Run (Exécution à distance).

    IntelliJ IDEA Sélectionner le bouton Exécuter le débogage.

  3. Lorsque l’exécution du programme atteint le point d’arrêt, vous voyez un onglet Débogueur dans le volet inférieur.

    IntelliJ IDEA Affiche l’onglet Débogueur.

  4. Pour ajouter une montre, sélectionnez l’icône (+).

    IntelliJ déboguer-variable-ajouter-suivi.

    Dans cet exemple, l’application s’est rompue avant la création de la variable rdd1 . À l’aide de cette montre, nous pouvons voir les cinq premières lignes de la variable rdd. Sélectionnez Enter (Entrer).

    IntelliJ Exécutez le programme en mode débogage.

    Ce que vous voyez dans l’image précédente est que lors de l’exécution, vous pouvez interroger les téraoctets de données et déboguer la progression de votre application. Par exemple, dans la sortie affichée dans l’image précédente, vous pouvez voir que la première ligne de la sortie est un en-tête. En fonction de cette sortie, vous pouvez modifier votre code d’application pour ignorer la ligne d’en-tête, si nécessaire.

  5. Vous pouvez maintenant sélectionner l’icône Reprendre le programme pour poursuivre l’exécution de votre application.

    IntelliJ IDEA Sélectionner Reprendre le programme.

  6. Si l’application se termine correctement, vous devez voir la sortie suivante :

    IntelliJ IDEA Sortie de la console du débogueur.

Étapes suivantes

Scénarios

Création et exécution d’applications

Outils et extensions

Gérer les ressources