Uso de cuadernos de Apache Zeppelin con un clúster Apache Spark en Azure HDInsightUse Apache Zeppelin notebooks with Apache Spark cluster on Azure HDInsight

Los clústeres de HDInsight Spark incluyen cuadernos de Apache Zeppelin.HDInsight Spark clusters include Apache Zeppelin notebooks. Use los cuadernos para ejecutar los trabajos de Apache Spark.Use the notebooks to run Apache Spark jobs. En este artículo, aprenderá a usar Zeppelin Notebook en un clúster de HDInsight.In this article, you learn how to use the Zeppelin notebook on an HDInsight cluster.

PrerrequisitosPrerequisites

Inicio de un cuaderno de Apache ZeppelinLaunch an Apache Zeppelin notebook

  1. Desde la Introducción el clúster de Spark, seleccione el cuaderno de Zeppelin en los paneles de clúster.From the Spark cluster Overview, select Zeppelin notebook from Cluster dashboards. Escriba las credenciales de administrador del clúster.Enter the admin credentials for the cluster.

    Nota

    También puede comunicarse con su equipo portátil ligero Zeppelin en el clúster si abre la siguiente dirección URL en el explorador.You may also reach the Zeppelin Notebook for your cluster by opening the following URL in your browser. Reemplace CLUSTERNAME por el nombre del clúster:Replace CLUSTERNAME with the name of your cluster:

    https://CLUSTERNAME.azurehdinsight.net/zeppelin

  2. Cree un nuevo notebook.Create a new notebook. En el panel del encabezado, vaya a Notebook > Create new note (Cuaderno > Crear nueva nota).From the header pane, navigate to Notebook > Create new note.

    Creación de un nuevo cuaderno de Zeppelin

    Especifique un nombre para el cuaderno y haga clic en Create Note (Crear nota).Enter a name for the notebook, then select Create Note.

  3. Por otro lado, asegúrese de que en el encabezado del cuaderno aparece el estado conectado.Ensure the notebook header shows a connected status. Esto se indica mediante un punto verde que se encuentra en la esquina superior derecha.It's denoted by a green dot in the top-right corner.

    Estado del cuaderno de Zeppelin

  4. Cargue los datos de ejemplo en una tabla temporal.Load sample data into a temporary table. Cuando cree un clúster de Spark en HDInsight, el archivo de datos de ejemplo hvac.csv se copia en la cuenta de almacenamiento asociada en \HdiSamples\SensorSampleData\hvac.When you create a Spark cluster in HDInsight, the sample data file, hvac.csv, is copied to the associated storage account under \HdiSamples\SensorSampleData\hvac.

    En el párrafo vacío que se crea de manera predeterminada en el nuevo cuaderno, pegue el siguiente fragmento.In the empty paragraph that is created by default in the new notebook, paste the following snippet.

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

    Presione MAYÚS+ENTRAR o seleccione el botón Reproducir del párrafo para ejecutar el fragmento de código.Press SHIFT + ENTER or select the Play button for the paragraph to run the snippet. El estado en la esquina derecha del párrafo debería avanzar de READY (Listo), PENDING (Pendiente) o RUNNING (En ejecución) a FINISHED (Finalizado).The status on the right-corner of the paragraph should progress from READY, PENDING, RUNNING to FINISHED. El resultado se muestra en la parte inferior del mismo párrafo.The output shows up at the bottom of the same paragraph. La captura de pantalla es similar a esta imagen:The screenshot looks like the following image:

    Creación de una tabla temporal de datos sin procesar

    También puede proporcionar un título para cada párrafo.You can also provide a title to each paragraph. Desde la esquina derecha del párrafo, seleccione el ícono Settings (Configuración) con forma de rueda dentada y seleccione Show title (Mostrar título).From the right-hand corner of the paragraph, select the Settings icon (sprocket), and then select Show title.

    Nota

    El intérprete %spark2 no se admite en los cuadernos de Zeppelin en todas las versiones de HDInsight y el intérprete %sh no se admite en HDInsight 4.0 y versiones posteriores.%spark2 interpreter is not supported in Zeppelin notebooks across all HDInsight versions, and %sh interpreter will not be supported from HDInsight 4.0 onwards.

  5. Ahora puede ejecutar instrucciones de Spark SQL en la tabla hvac.You can now run Spark SQL statements on the hvac table. Pegue la siguiente consulta en un nuevo párrafo.Paste the following query in a new paragraph. La consulta recupera el identificador del edificio.The query retrieves the building ID. También la diferencia entre la temperatura objetivo y la real para cada edificio en una fecha determinada.Also the difference between the target and actual temperatures for each building on a given date. Presione MAYÚS + ENTRAR.Press SHIFT + ENTER.

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

    La instrucción %sql del principio le indica al cuaderno que utilice el intérprete de Livy Scala.The %sql statement at the beginning tells the notebook to use the Livy Scala interpreter.

  6. Seleccione el icono del gráfico de barras para cambiar la visualización.Select the Bar Chart icon to change the display. La configuración, que aparece después de haber seleccionado el gráfico de barras, le permite elegir las claves y los valores.settings, appear after you have selected Bar Chart, allows you to choose Keys, and Values. En la captura de pantalla siguiente se muestra el resultado.The following screenshot shows the output.

    Ejecución de una instrucción Spark SQL mediante el cuaderno 1

  7. También puede ejecutar instrucciones Spark SQL usando variables en la consulta.You can also run Spark SQL statements using variables in the query. El siguiente fragmento de código muestra cómo definir una variable Temp en la consulta con los valores posibles con los que quiere hacer la consulta.The next snippet shows how to define a variable, Temp, in the query with the possible values you want to query with. Cuando ejecuta la consulta por primera vez, se rellena una lista desplegable automáticamente con los valores especificados para la variable.When you first run the query, a drop-down is automatically populated with the values you specified for the variable.

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

    Pegue este fragmento de código en un nuevo párrafo y presione MAYÚS + ENTRAR.Paste this snippet in a new paragraph and press SHIFT + ENTER. A continuación, seleccione 65 en la lista desplegable Temp.Then select 65 from the Temp drop-down list.

  8. Seleccione el icono del gráfico de barras para cambiar la visualización.Select the Bar Chart icon to change the display. Seguidamente, seleccione configuración y realice los siguientes cambios:Then select settings and make the following changes:

    • Grupos: Agregue targettemp.Groups: Add targettemp.

    • Valores: 1.Values: 1. Quite la fecha.Remove date. 2.2. Agregue temp_diff.Add temp_diff. 3.3. Cambie el agregador de SUM a AVG.Change the aggregator from SUM to AVG.

      En la captura de pantalla siguiente se muestra el resultado.The following screenshot shows the output.

      Ejecución de una instrucción Spark SQL mediante el cuaderno 2

Uso de paquetes externos con el cuadernoHow do I use external packages with the notebook?

El cuaderno de Zeppelin Notebook en un clúster Apache Spark de HDInsight puede usar paquetes externos que haya aportado la comunidad y que no estén incluidos en el clúster.Zeppelin notebook in Apache Spark cluster on HDInsight can use external, community-contributed packages that aren't included in the cluster. Busque el repositorio de Maven para obtener una lista completa de los paquetes que están disponibles.Search the Maven repository for the complete list of packages that are available. También puede obtener una lista de paquetes disponibles de otras fuentes.You can also get a list of available packages from other sources. Por ejemplo, dispone de la lista completa de los paquetes externos aportados por la comunidad en Spark Packages(Paquetes Spark).For example, a complete list of community-contributed packages is available at Spark Packages.

En este artículo, aprenderá a utilizar el paquete spark-csv con el cuaderno de Jupyter Notebook.In this article, you'll see how to use the spark-csv package with the Jupyter Notebook.

  1. Abra la configuración del intérprete.Open interpreter settings. Desde la esquina superior derecha, seleccione el nombre de usuario registrado y, a continuación, seleccione Interpreter (Intérprete).From the top-right corner, select the logged in user name, then select Interpreter.

    Inicio del intérprete

  2. Desplácese hasta livy2 y seleccione la opción de editar.Scroll to livy2, then select edit.

    Modificación de la configuración del intérprete 1

  3. Vaya a la clave livy.spark.jars.packages y establezca su valor en el formato group:id:version.Navigate to key livy.spark.jars.packages, and set its value in the format group:id:version. Por ejemplo, si desea usar el paquete spark-csv, debe establecer el valor de la clave en com.databricks:spark-csv_2.10:1.4.0.So, if you want to use the spark-csv package, you must set the value of the key to com.databricks:spark-csv_2.10:1.4.0.

    Modificación de la configuración del intérprete 2

    Seleccione Guardar y luego Aceptar para reiniciar el intérprete de Livy.Select Save and then OK to restart the Livy interpreter.

  4. Si desea saber cómo acceder al valor de la clave especificada anteriormente, siga estos pasos.If you want to understand how to arrive at the value of the key entered above, here's how.

    a.a. Busque el paquete en el repositorio de Maven.Locate the package in the Maven Repository. En este artículo, hemos utilizado spark-csv.For this article, we used spark-csv.

    b.b. En el repositorio, recopile los valores de GroupId, ArtifactId y Version.From the repository, gather the values for GroupId, ArtifactId, and Version.

    Uso de paquetes externos con Jupyter Notebook

    c.c. Concatene los tres valores separados por dos puntos ( : ).Concatenate the three values, separated by a colon (:).

    com.databricks:spark-csv_2.10:1.4.0
    

¿Dónde se guardan los cuadernos de Zeppelin Notebook?Where are the Zeppelin notebooks saved?

Los cuadernos de Zeppelin Notebook se guardan en los nodos principales del clúster.The Zeppelin notebooks are saved to the cluster headnodes. Por tanto, si se elimina el clúster, también se eliminarán los cuadernos.So, if you delete the cluster, the notebooks will be deleted as well. Si desea guardar los cuadernos para utilizarlos más adelante en otros clústeres, debe exportarlos cuando haya terminado de ejecutar los trabajos.If you want to preserve your notebooks for later use on other clusters, you must export them after you have finished running the jobs. Para exportar un cuaderno, haga clic en el icono Export (Exportar), tal y como se muestra en la imagen siguiente.To export a notebook, select the Export icon as shown in the image below.

Descarga del cuaderno

De este modo, el cuaderno se guarda como un archivo JSON en la ubicación de descarga.This action saves the notebook as a JSON file in your download location.

Uso de Shiro para configurar el acceso a los intérpretes de Zeppelin en clústeres de Enterprise Security Package (ESP)Use Shiro to Configure Access to Zeppelin Interpreters in Enterprise Security Package (ESP) Clusters

Como se indicó anteriormente, el intérprete %sh no se admite desde HDInsight 4.0 en adelante.As noted above, the %sh interpreter isn't supported from HDInsight 4.0 onwards. Además, dado que el intérprete %sh introduce posibles problemas de seguridad, como el acceso a keytabs mediante comandos de shell, se ha quitado también de los clústeres de ESP de HDInsight 3.6.Furthermore, since %sh interpreter introduces potential security issues, such as access keytabs using shell commands, it has been removed from HDInsight 3.6 ESP clusters as well. Es decir, el intérprete %sh no está disponible cuando se hace clic en Crear nueva nota ni en la interfaz de usuario del intérprete de forma predeterminada.It means %sh interpreter isn't available when clicking Create new note or in the Interpreter UI by default.

Los usuarios de dominio con privilegios pueden usar el archivo Shiro.ini para controlar el acceso a la interfaz de usuario del intérprete.Privileged domain users can use the Shiro.ini file to control access to the Interpreter UI. Solo estos usuarios pueden crear nuevos intérpretes %sh y establecer permisos en cada nuevo intérprete %sh.Only these users can create new %sh interpreters and set permissions on each new %sh interpreter. Para controlar el acceso mediante el archivo shiro.ini, siga estos pasos:To control access using the shiro.ini file, use the following steps:

  1. Defina un nuevo rol con un nombre de grupo de dominio existente.Define a new role using an existing domain group name. En el ejemplo siguiente, adminGroupName es un grupo de usuarios con privilegios de AAD.In the following example, adminGroupName is a group of privileged users in AAD. No use caracteres especiales ni espacios en blanco en el nombre del grupo.Don't use special characters or white spaces in the group name. Los caracteres después de = conceden los permisos para este rol.The characters after = give the permissions for this role. * significa que el grupo tiene permisos completos.* means the group has full permissions.

    [roles]
    adminGroupName = *
    
  2. Agregue el nuevo rol para el acceso a los intérpretes de Zeppelin.Add the new role for access to Zeppelin interpreters. En el ejemplo siguiente, a todos los usuarios de adminGroupName se les concede acceso a los intérpretes de Zeppelin y pueden crear intérpretes nuevos.In the following example, all users in adminGroupName are given access to Zeppelin interpreters and can create new interpreters. Puede colocar varios roles entre corchetes en roles[], separados por comas.You can put multiple roles between the brackets in roles[], separated by commas. A continuación, los usuarios que tienen los permisos necesarios pueden acceder a los intérpretes de Zeppelin.Then, users that have the necessary permissions, can access Zeppelin interpreters.

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

Administración de sesiones de LivyLivy session management

El primer párrafo de código del cuaderno de Zeppelin crea una nueva sesión de Livy en el clúster.The first code paragraph in your Zeppelin notebook creates a new Livy session in your cluster. Esta sesión se compartirá con todos los cuadernos de Zeppelin Notebook que cree en el futuro.This session is shared across all Zeppelin notebooks that you later create. Si la sesión Livy se elimina por cualquier motivo, los trabajos no se ejecutarán desde el cuaderno de Zeppelin Notebook.If the Livy session is killed for any reason, jobs won't run from the Zeppelin notebook.

En este caso, debe seguir los pasos que se indican a continuación para poder ejecutar trabajos desde un cuaderno de Zeppelin Notebook.In such a case, you must do the following steps before you can start running jobs from a Zeppelin notebook.

  1. Reinicie el intérprete de Livy desde el cuaderno de Zeppelin Notebook.Restart the Livy interpreter from the Zeppelin notebook. Para ello, abra la configuración del intérprete haciendo clic en el nombre del usuario conectado que encontrará en la esquina superior derecha y después en Interpreter (Intérprete).To do so, open interpreter settings by selecting the logged in user name from the top-right corner, then select Interpreter.

    Inicio del intérprete

  2. Desplácese hasta livy2 y seleccione la opción para reiniciar.Scroll to livy2, then select restart.

    Reinicio del intérprete de Livy

  3. Ejecute una celda de código desde el cuaderno de Zeppelin Notebook existente.Run a code cell from an existing Zeppelin notebook. Este código creará una nueva sesión de Livy en el clúster de HDInsight.This code creates a new Livy session in the HDInsight cluster.

Información generalGeneral information

Validar servicioValidate service

Para validar el servicio desde Ambari, navegue hasta https://CLUSTERNAME.azurehdinsight.net/#/main/services/ZEPPELIN/summary, donde CLUSTERNAME es el nombre del clúster.To validate the service from Ambari, navigate to https://CLUSTERNAME.azurehdinsight.net/#/main/services/ZEPPELIN/summary where CLUSTERNAME is the name of your cluster.

Para validar el servicio desde una línea de comandos, use SSH en el nodo principal.To validate the service from a command line, SSH to the head node. Cambie el usuario a Zeppelin con el comando sudo su zeppelin.Switch user to zeppelin using command sudo su zeppelin. Comandos de estado:Status commands:

Get-HelpCommand DescripciónDescription
/usr/hdp/current/zeppelin-server/bin/zeppelin-daemon.sh status Estado del servicio.Service status.
/usr/hdp/current/zeppelin-server/bin/zeppelin-daemon.sh --version Versión del servicio.Service version.
ps -aux | grep zeppelin Identificar PID.Identify PID.

Ubicaciones de registroLog locations

ServicioService PathPath
zeppelin-serverzeppelin-server /usr/hdp/current/zeppelin-server//usr/hdp/current/zeppelin-server/
Registros del servidorServer Logs /var/log/zeppelin/var/log/zeppelin
Intérprete de configuración, Shiro, site.xml, log4jConfiguration Interpreter, Shiro, site.xml, log4j /usr/hdp/current/zeppelin-server/conf o /etc/zeppelin/conf/usr/hdp/current/zeppelin-server/conf or /etc/zeppelin/conf
Directorio de PIDPID directory /var/run/zeppelin/var/run/zeppelin

Habilitación del registro de depuraciónEnable debug logging

  1. Vaya a https://CLUSTERNAME.azurehdinsight.net/#/main/services/ZEPPELIN/summary, donde CLUSTERNAME es el nombre del clúster.Navigate to https://CLUSTERNAME.azurehdinsight.net/#/main/services/ZEPPELIN/summary where CLUSTERNAME is the name of your cluster.

  2. Navegue hasta CONFIGs > Advanced zeppelin-log4j-properties > log4j_properties_content.Navigate to CONFIGS > Advanced zeppelin-log4j-properties > log4j_properties_content.

  3. Cambie log4j.appender.dailyfile.Threshold = INFO por log4j.appender.dailyfile.Threshold = DEBUG.Modify log4j.appender.dailyfile.Threshold = INFO to log4j.appender.dailyfile.Threshold = DEBUG.

  4. Agregue log4j.logger.org.apache.zeppelin.realm=DEBUG.Add log4j.logger.org.apache.zeppelin.realm=DEBUG.

  5. Guarde los cambios y reinicie el servicio.Save changes and restart service.

Pasos siguientesNext steps