Utiliser des blocs-notes Apache Zeppelin avec un cluster Apache Spark sur HDInsight

Les clusters HDInsight Spark incluent des blocs-notes Apache Zeppelin. Utilisez les notebooks pour exécuter des travaux Apache Spark. Dans cet article, vous allez apprendre à utiliser le bloc-notes Zeppelin sur un cluster HDInsight.

Prérequis

Lancer un bloc-notes Apache Zeppelin

  1. Dans la section Vue d'ensemble du cluster Spark, accédez à Tableaux de bord du cluster et sélectionnez Bloc-notes Zeppelin. Entrez les informations d'identification de l'administrateur du cluster.

    Notes

    Vous pouvez également atteindre le bloc-notes Zeppelin pour votre cluster en ouvrant l'URL suivante dans votre navigateur. Remplacez CLUSTERNAME par le nom de votre cluster.

    https://CLUSTERNAME.azurehdinsight.net/zeppelin

  2. Créer un nouveau bloc-notes. Dans le volet d'en-tête, accédez à Bloc-notes>Créer une note.

    Create a new Zeppelin notebook.

    Entrez un nom pour le bloc-notes, puis sélectionnez Créer une note.

  3. Vérifiez que l'en-tête du bloc-notes indique un état connecté. Il est indiqué par un point vert dans le coin supérieur droit.

    Zeppelin notebook status.

  4. Chargez un exemple de données dans une table temporaire. Lorsque vous créez un cluster Spark dans HDInsight, l'exemple de fichier de données hvac.csv est copié sur le compte de stockage associé, sous \HdiSamples\SensorSampleData\hvac.

    Collez l’extrait suivant dans le paragraphe vide créé par défaut dans le nouveau bloc-notes.

    %livy2.spark
    //The above magic instructs Zeppelin to use the Livy Scala interpreter
    
    // Create an RDD using the default Spark context, sc
    val hvacText = sc.textFile("wasbs:///HdiSamples/HdiSamples/SensorSampleData/hvac/HVAC.csv")
    
    // Define a schema
    case class Hvac(date: String, time: String, targettemp: Integer, actualtemp: Integer, buildingID: String)
    
    // Map the values in the .csv file to the schema
    val hvac = hvacText.map(s => s.split(",")).filter(s => s(0) != "Date").map(
        s => Hvac(s(0),
                s(1),
                s(2).toInt,
                s(3).toInt,
                s(6)
        )
    ).toDF()
    
    // Register as a temporary table called "hvac"
    hvac.registerTempTable("hvac")
    

    Appuyez sur MAJ + ENTRÉE ou sélectionnez le bouton Lire pour que le paragraphe exécute l’extrait de code. L’état indiqué dans le coin supérieur droit du paragraphe doit progresser de READY, PENDING, RUNNING à FINISHED. Le résultat s’affiche au bas du même paragraphe. La capture d’écran ressemble à l’image suivante :

    Create a temporary table from raw data.

    Vous pouvez également indiquer un titre pour chaque paragraphe. Dans le coin droit du paragraphe, sélectionnez l'icône Paramètres (pignon), puis sélectionnez Afficher le titre.

    Notes

    L’interpréteur %spark2 n’est pas pris en charge dans les bloc-notes Zeppelin sur toutes les versions HDInsight et l’interpréteur %sh ne sera pas pris en charge à partir de HDInsight 4.0 et versions ultérieures.

  5. Vous pouvez maintenant exécuter des instructions Spark SQL dans la table hvac. Collez la requête suivante dans un nouveau paragraphe. La requête récupère l’ID de bâtiment. Elle récupère également la différence entre les températures cible et réelle pour chaque bâtiment à une date donnée. Appuyez sur MAJ + ENTRÉE.

    %sql
    select buildingID, (targettemp - actualtemp) as temp_diff, date from hvac where date = "6/1/13"
    

    L’instruction %sql du début demande au bloc-notes d’utiliser l’interpréteur Livy Scala.

  6. Sélectionnez l'icône Graphique à barres pour modifier l'affichage. Les paramètres, apparaissent une fois que vous avez sélectionné Graphique à barres, ce qui vous permet de choisir des Clés et des Valeurs. La capture d’écran qui suit présente le résultat.

    Run a Spark SQL statement using the notebook1.

  7. Vous pouvez également exécuter des instructions Spark SQL à l’aide de variables dans la requête. L'extrait suivant montre comment définir la variable Temp dans la requête avec les valeurs d'interrogation possibles. Lors de la première exécution de la requête, une liste déroulante est automatiquement renseignée avec les valeurs que vous avez spécifiées pour la variable.

    %sql  
    select buildingID, date, targettemp, (targettemp - actualtemp) as temp_diff from hvac where targettemp > "${Temp = 65,65|75|85}"
    

    Collez cet extrait dans un nouveau paragraphe, puis appuyez sur MAJ + ENTRÉE. Sélectionnez ensuite 65 dans la liste déroulante Temp.

  8. Sélectionnez l'icône Graphique à barres pour modifier l'affichage. Sélectionnez ensuite paramètres et apportez les modifications suivantes :

    • Groupes : Ajoutez targettemp.

    • Valeurs : 1. Supprimez date. 2. Ajoutez temp_diff. 3. Remplacez l'agrégateur SUM par AVG.

      La capture d’écran qui suit présente le résultat.

      Run a Spark SQL statement using the notebook2.

Comment utiliser des packages externes avec le bloc-notes ?

Un bloc-notes Zeppelin dans un cluster Apache Spark sur HDInsight peut utiliser des packages externes bénéficiant de la contribution de la communauté, qui ne sont pas inclus dans le cluster. Recherchez le référentiel Maven pour obtenir la liste complète des packages disponibles. Vous pouvez également obtenir une liste des packages disponibles à partir d’autres sources. Par exemple, une liste complète des packages bénéficiant de la contribution de la communauté est disponible sur le site Spark Packages(Packages Spark).

Dans cet article, vous allez apprendre à utiliser le package spark-csv avec le notebook Jupyter.

  1. Ouvrez les paramètres de l’interpréteur. Dans le coin supérieur droit, sélectionnez le nom de l'utilisateur connecté, puis Interpréteur.

    Launch interpreter.

  2. Accédez à livy2, puis sélectionnez modifier.

    Change interpreter settings1.

  3. Accédez à la clé livy.spark.jars.packages et définissez sa valeur au format group:id:version. Par conséquent, si vous souhaitez utiliser le package spark-csv, vous devez définir la valeur de la clé sur com.databricks:spark-csv_2.10:1.4.0.

    Change interpreter settings2.

    Sélectionnez Enregistrer, puis OK pour redémarrer l’interpréteur Livy.

  4. si vous souhaitez savoir comment atteindre la valeur de la clé entrée ci-dessus, lisez ce qui suit.

    a. Recherchez le package dans le référentiel Maven. Dans cet article, nous avons utilisé spark-csv.

    b. À partir du référentiel, rassemblez les valeurs pour GroupId, ArtifactId et Version.

    Use external packages with Jupyter Notebook.

    c. Concaténez les trois valeurs séparées par deux-points ( : ).

    com.databricks:spark-csv_2.10:1.4.0
    

Où les blocs-notes Zeppelin sont-ils enregistrés ?

Les blocs-notes Zeppelin sont enregistrés dans les nœuds principaux du cluster. Par conséquent, si vous supprimez le cluster, les blocs-notes seront aussi supprimés. Si vous souhaitez conserver vos blocs-notes pour une utilisation ultérieure sur les autres clusters, vous devez les exporter après avoir terminé l’exécution des tâches. Pour exporter un bloc-notes, sélectionnez l'icône Exporter comme illustré sur l'image ci-dessous.

Download notebook.

Cette action enregistre le bloc-notes en tant que fichier JSON dans votre emplacement de téléchargement.

Remarque

  • Dans HDI 4.0, le chemin d’accès au répertoire du notebook zeppelin est /usr/hdp/<version>/zeppelin/notebook/<notebook_session_id>/

    par exemple /usr/hdp/4.1.17.10/zeppelin/2JMC9BZ8X/

    Dans HDI 5.0 et au-delà, ce chemin d’accès est différent /usr/hdp/<version>/zeppelin/notebook/<Kernel_name>/

    par exemple /usr/hdp/5.1.4.5/zeppelin/notebook/Scala/

  • Le nom de fichier stocké est différent dans HDI 5.0. Il est stocké en tant que <notebook_name>_<sessionid>.zpln

    par exemple testzeppelin_2JJK53XQA.zpln

    Dans HDI 4.0, le nom de fichier n’est que note.json stocké dans le répertoire session_id.

    par exemple /2JMC9BZ8X/note.json

  • HDI Zeppelin enregistre toujours le notebook dans le chemin d’accès /usr/hdp/<version>/zeppelin/notebook/ sur le disque local hn0.

    Si vous souhaitez que le notebook soit disponible même après la suppression du cluster, vous pouvez essayer d’utiliser le stockage de fichiers Azure (à l’aide du protocole SMB) et le lier au chemin local. Pour plus de détails, consultez Monter un partage de fichiers SMB Azure sur Linux

    Après le montage, vous pouvez modifier la configuration zeppelin.notebook.dir vers le chemin monté dans l’interface utilisateur ambari.

  • Le partage de fichiers SMB en tant que stockage GitNotebookRepo n’est pas recommandé pour zeppelin version 0.10.1

Utiliser Shiro pour configurer l’accès aux interpréteurs Zeppelin dans les clusters Pack Sécurité Entreprise (ESP)

Comme indiqué ci-dessus, l’interpréteur %sh n’est plus pris en charge à partir de HDInsight 4.0. En outre, puisque l’interpréteur %sh introduit des problèmes de sécurité potentiels, tels que l’accès à des keytabs à l’aide de commandes shell, il a également été supprimé des clusters ESP de HDInsight 3.6. Cela signifie que l’interpréteur %sh n’est pas disponible lorsque vous cliquez sur Créer une note ni dans l’interface utilisateur par défaut de l’interpréteur.

Les utilisateurs privilégiés de domaine peuvent utiliser le fichier Shiro.ini pour contrôler l’accès à l’interface utilisateur de l’interpréteur. Seuls ces utilisateurs peuvent créer des interpréteurs %sh et définir des autorisations sur chaque nouvel interpréteur %sh. Pour contrôler l’accès à l’aide du fichier shiro.ini, procédez comme suit :

  1. Définissez un nouveau rôle à l’aide d’un nom de groupe de domaine existant. Dans l’exemple suivant, adminGroupName est un groupe d’utilisateurs privilégiés dans AAD. N’utilisez pas de caractères spéciaux ni d’espaces blancs dans le nom de groupe. Les caractères situés après = accordent les autorisations pour ce rôle. * signifie que le groupe dispose de toutes les autorisations.

    [roles]
    adminGroupName = *
    
  2. Ajoutez le nouveau rôle pour l’accès aux interpréteurs Zeppelin. Dans l’exemple suivant, tous les utilisateurs de adminGroupName ont accès aux interpréteurs Zeppelin et peuvent créer des interpréteurs. Vous pouvez placer plusieurs rôles entre les crochets du paramètre roles[], séparés par des virgules. Ensuite, les utilisateurs disposant des autorisations nécessaires peuvent accéder aux interpréteurs Zeppelin.

    [urls]
    /api/interpreter/** = authc, roles[adminGroupName]
    

Exemple shiro.ini pour plusieurs groupes de domaines :

[main]
anyofrolesuser = org.apache.zeppelin.utils.AnyOfRolesUserAuthorizationFilter

[roles]
group1 = *
group2 = *
group3 = *

[urls]
/api/interpreter/** = authc, anyofrolesuser[group1, group2, group3]

Gestion des sessions Livy

Le premier paragraphe de code de votre bloc-notes Zeppelin crée une session livy dans votre cluster. Cette session est partagée entre tous les blocs-notes Zeppelin que vous créez par la suite. Si la session livy est supprimée pour une raison quelconque, les travaux ne sont pas exécutés à partir du bloc-notes Zeppelin.

Dans ce cas, vous devez suivre les étapes suivantes avant de commencer à exécuter des tâches à partir d’un bloc-notes Zeppelin.

  1. Redémarrez l’interpréteur Livy à partir du bloc-notes Zeppelin. Pour ce faire, ouvrez les paramètres de l'interpréteur en sélectionnant le nom de l'utilisateur connecté dans le coin supérieur droit, puis sélectionnez Interpréteur.

    Launch interpreter.

  2. Accédez à livy2, puis sélectionnez redémarrer.

    Restart the Livy interpreter.

  3. Exécutez une cellule de code à partir d’un bloc-notes Zeppelin existant. Ce code crée une session Livy dans le cluster HDInsight.

Informations générales

Valider le service

Pour valider le service à partir d’Ambari, accédez à https://CLUSTERNAME.azurehdinsight.net/#/main/services/ZEPPELIN/summary où CLUSTERNAME est le nom de votre cluster.

Pour valider le service à partir d’une ligne de commande, utilisez le protocole SSH pour accéder au nœud principal. Basculez l’utilisateur sur Zeppelin à l’aide de la commande sudo su zeppelin. Commandes relatives à l’état :

Commande Description
/usr/hdp/current/zeppelin-server/bin/zeppelin-daemon.sh status État du service.
/usr/hdp/current/zeppelin-server/bin/zeppelin-daemon.sh --version Version du service.
ps -aux | grep zeppelin Identifier le PID.

Emplacements des journaux

Service Path
zeppelin-server /usr/hdp/current/zeppelin-server/
Journaux d’activité du serveur /var/log/zeppelin
Interpréteur de configuration, Shiro, site.xml, log4j /usr/hdp/current/zeppelin-server/conf or /etc/zeppelin/conf
Répertoire PID /var/run/zeppelin

Activer l’enregistrement du débogage

  1. Accédez à https://CLUSTERNAME.azurehdinsight.net/#/main/services/ZEPPELIN/summary, où CLUSTERNAME est le nom de votre cluster.

  2. Accédez à CONFIGS>Advanced zeppelin-log4j-properties>log4j_properties_content.

  3. Remplacez log4j.appender.dailyfile.Threshold = INFO par log4j.appender.dailyfile.Threshold = DEBUG.

  4. Ajoutez log4j.logger.org.apache.zeppelin.realm=DEBUG.

  5. Enregistrez les modifications et redémarrez le service.

Étapes suivantes