Compartir a través de


Uso del kit de herramientas de Azure para IntelliJ para depurar aplicaciones de Apache Spark de forma remota en HDInsight a través de VPN

Se recomienda depurar aplicaciones de Apache Spark de forma remota a través de SSH. Para obtener instrucciones, consulte Depurar remotamente aplicaciones de Apache Spark en un clúster de HDInsight utilizando Azure Toolkit para IntelliJ mediante SSH.

En este artículo se proporcionan instrucciones paso a paso sobre cómo usar las herramientas de HDInsight del kit de herramientas de Azure para IntelliJ para enviar un trabajo de Spark en un clúster de HDInsight Spark y, a continuación, depurarlo de forma remota desde el equipo de escritorio. Para completar estas tareas, debe realizar los siguientes pasos generales:

  1. Cree una red virtual de Azure de sitio a sitio o de punto a sitio. En los pasos de este documento se supone que usa una red de sitio a sitio.
  2. Cree un clúster de Spark en HDInsight que forme parte de la red virtual de sitio a sitio.
  3. Compruebe la conectividad entre el nodo principal del clúster y el escritorio.
  4. Cree una aplicación de Scala en IntelliJ IDEA y configúrela para la depuración remota.
  5. Ejecute y depure la aplicación.

Prerrequisitos

Paso 1: Creación de una red virtual de Azure

Siga las instrucciones de los vínculos siguientes para crear una red virtual de Azure y, a continuación, compruebe la conectividad entre el equipo de escritorio y la red virtual:

Paso 2: Creación de un clúster de HDInsight Spark

Se recomienda crear también un clúster de Apache Spark en Azure HDInsight que forme parte de la red virtual de Azure que creó. Use la información disponible en Creación de clústeres basados en Linux en HDInsight. Como parte de la configuración opcional, seleccione la red virtual de Azure que creó en el paso anterior.

Paso 3: Comprobar la conectividad entre el nodo principal del clúster y el escritorio

  1. Obtenga la dirección IP del nodo principal. Abra la interfaz de usuario de Ambari para el clúster. En la hoja del clúster, seleccione Panel.

    Seleccione Dashboard en Apache Ambari.

  2. En la interfaz de usuario de Ambari, seleccione Hosts.

    Seleccione anfitriones en Apache Ambari.

  3. Verá una lista de nodos principales, nodos de trabajo y nodos de zookeeper. Los nodos principales tienen un prefijo hn*. Seleccione el primer nodo principal.

    Busque el nodo principal en Apache Ambari.

  4. En el panel Resumen de la parte inferior de la página que se abre, copie la dirección IP del nodo principal y el nombre de host.

    Busque la dirección IP en Apache Ambari.

  5. Agregue la dirección IP y el nombre de host del nodo principal al archivo de hosts en el equipo donde desea ejecutar y depurar de forma remota el trabajo de Spark. Esto le permite comunicarse con el nodo principal mediante la dirección IP, así como el nombre de host.

    a) Abra un archivo del Bloc de notas con permisos elevados. En el menú Archivo , seleccione Abrir y busque la ubicación del archivo hosts. En un equipo Windows, la ubicación es C:\Windows\System32\Drivers\etc\hosts.

    b. Agregue la siguiente información al archivo de 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. Desde el equipo que ha conectado a la red virtual de Azure que usa el clúster de HDInsight, compruebe que puede hacer ping a los nodos principales mediante la dirección IP, así como el nombre de host.

  7. Use SSH para conectarse al nodo principal del clúster siguiendo las instrucciones de Conexión a un clúster de HDInsight mediante SSH. En el nodo principal del clúster, haga ping a la dirección IP del equipo de escritorio. Pruebe la conectividad a ambas direcciones IP asignadas al equipo:

    • Una para la conexión de red
    • Una para la red virtual de Azure
  8. Repita los pasos para el otro nodo principal.

Paso 4: Creación de una aplicación de Apache Spark Scala mediante herramientas de HDInsight en el kit de herramientas de Azure para IntelliJ y configuración para la depuración remota

  1. Abra IntelliJ IDEA y cree un nuevo proyecto. En el cuadro de diálogo Nuevo proyecto , haga lo siguiente:

    Seleccione la nueva plantilla de proyecto en IntelliJ IDEA.

    a) Seleccione HDInsight>Spark en HDInsight (Scala).

    b. Seleccione Siguiente.

  2. En el siguiente cuadro de diálogo Nuevo proyecto , haga lo siguiente y seleccione Finalizar:

    • Escriba un nombre de proyecto y una ubicación.

    • En la lista desplegable SDK de Project, seleccione Java 1.8 para el clúster de Spark 2.x o seleccione Java 1.7 para el clúster de Spark 1.x.

    • En la lista desplegable Versión de Spark , el Asistente para la creación de proyectos de Scala integra la versión adecuada para el SDK de Spark y el SDK de Scala. Si la versión del clúster de Spark es anterior a 2.0, seleccione Spark 1.x. De lo contrario, seleccione Spark2.x. En este ejemplo se usa Spark 2.0.2 (Scala 2.11.8).

    Seleccione el SDK del proyecto y la versión de Spark.

  3. El proyecto de Spark crea automáticamente un artefacto. Para ver el artefacto, haga lo siguiente:

    a) En el menú Archivo , seleccione Estructura del proyecto.

    b. En el cuadro de diálogo Estructura del proyecto, seleccione Artefactos para ver el artefacto predeterminado que se ha creado. También puede crear su propio artefacto seleccionando el signo más (+).

    Los artefactos de IntelliJ IDEA crean un jar.

  4. Agregue bibliotecas al proyecto. Para agregar una biblioteca, haga lo siguiente:

    a) Haga clic con el botón derecho en el nombre del proyecto en el árbol del proyecto y seleccione Abrir configuración del módulo.

    b. En el cuadro de diálogo Estructura del proyecto , seleccione Bibliotecas, seleccione el símbolo (+) y, a continuación, seleccione Desde Maven.

    Descargar biblioteca de IntelliJ IDEA.

    c. En el cuadro de diálogo Descargar biblioteca del repositorio de Maven , busque y agregue las bibliotecas siguientes:

    • org.scalatest:scalatest_2.10:2.2.1
    • org.apache.hadoop:hadoop-azure:2.7.1
  5. Copie yarn-site.xml y core-site.xml desde el nodo principal del clúster y agréguelos al proyecto. Use los siguientes comandos para copiar los archivos. Puede usar Cygwin para ejecutar los siguientes scp comandos para copiar los archivos de los nodos principales del clúster:

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

    Dado que ya hemos agregado la dirección IP del nodo principal del clúster y los nombres de host para el archivo de hosts en el escritorio, podemos usar los scp comandos de la siguiente manera:

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

    Para agregar estos archivos al proyecto, cópielos en la carpeta /src del árbol del proyecto, por ejemplo <your project directory>\src.

  6. Actualice el core-site.xml archivo para realizar los cambios siguientes:

    a) Reemplace la clave cifrada. El core-site.xml archivo incluye la clave cifrada en la cuenta de almacenamiento asociada al clúster. En el core-site.xml archivo que agregó al proyecto, reemplace la clave cifrada por la clave de almacenamiento real asociada a la cuenta de almacenamiento predeterminada. Para obtener más información, consulte Administración de las claves de acceso de la cuenta de almacenamiento.

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

    b. Quite las siguientes entradas 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>
    

    c. Guarde el archivo.

  7. Agregue la clase principal para tu aplicación. En el Explorador de proyectos, haga clic con el botón derecho en src, seleccione Nuevo y, a continuación, seleccione Clase Scala.

    IntelliJ IDEA Seleccione la clase principal.

  8. En el cuadro de diálogo Crear nueva clase de Scala , proporcione un nombre, seleccione Objeto en el cuadro Tipo y, a continuación, seleccione Aceptar.

    IntelliJ IDEA Crea una nueva clase Scala.

  9. En el MyClusterAppMain.scala archivo, pegue el código siguiente. Este código crea el contexto de Spark y abre un executeJob método a partir del SparkSample objeto .

    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. Repita los pasos 8 y 9 para agregar un nuevo objeto Scala denominado *SparkSample. Agregue el siguiente código a esta clase. Este código lee los datos de la HVAC.csv (disponible en todos los clústeres de HDInsight Spark). Recupera las filas que solo tienen un dígito en la séptima columna del archivo CSV y, a continuación, escribe la salida en /HVACOut en el contenedor de almacenamiento predeterminado para el clúster.

    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. Repita los pasos 8 y 9 para agregar una nueva clase denominada RemoteClusterDebugging. Esta clase implementa el marco de pruebas de Spark que se usa para depurar las aplicaciones. Agregue el siguiente código a la clase 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")
         }
        }
    

    Hay un par de cosas importantes que debe tener en cuenta:

    • Para .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"), asegúrese de que el archivo JAR del ensamblado de Spark está disponible en el almacenamiento del clúster en la ubicación especificada.
    • En setJars, especifique la ubicación donde se crea el archivo JAR del artefacto. Normalmente, es <Your IntelliJ project directory>\out\<project name>_DefaultArtifact\default_artifact.jar.
  12. En la*RemoteClusterDebugging clase, haga clic con el botón derecho en la test palabra clave y, a continuación, seleccione Crear configuración de RemoteClusterDebugging.

    IntelliJ IDEA Crea una configuración remota.

  13. En el cuadro de diálogo Crear configuración RemoteClusterDebugging, proporcione un nombre para la configuración y, a continuación, seleccione Tipo de prueba como Test name. Deje todos los demás valores como la configuración predeterminada. Seleccione Aplicar y luego Aceptar.

    Crear configuración de RemoteClusterDebugging.

  14. Ahora debería ver una lista desplegable de "configuración de ejecución remota" en la barra de menús.

    Lista desplegable de ejecución remota en IntelliJ.

Paso 5: Ejecución de la aplicación en modo de depuración

  1. En el proyecto IntelliJ IDEA, abra SparkSample.scala y cree un punto de interrupción junto a val rdd1. En el menú emergente Crear punto de interrupción para, seleccione línea en la función executeJob.

    IntelliJ IDEA Agregue un punto de interrupción.

  2. Para ejecutar la aplicación, seleccione el botón Depurar ejecutar situado junto a la lista desplegable Configuración de ejecución remota.

    IntelliJ IDEA Seleccione el botón Ejecutar de depuración.

  3. Cuando la ejecución del programa alcanza el punto de interrupción, verá una pestaña Depurador en el panel inferior.

    IntelliJ IDEA Ver la pestaña Depurador.

  4. Para agregar un reloj, seleccione el icono (+).

    IntelliJ debug-add-watch-variable.

    En este ejemplo, la aplicación se rompió antes de crear la variable rdd1 . Con este reloj, podemos ver las cinco primeras filas de la variable rdd. Seleccione Escriba.

    IntelliJ Ejecute el programa en modo de depuración.

    Lo que ve en la imagen anterior es que, durante el tiempo de ejecución, podría consultar terabytes de datos y depurar cómo progresa su aplicación. Por ejemplo, en la salida que se muestra en la imagen anterior, puede ver que la primera fila de la salida es un encabezado. En función de esta salida, puede modificar el código de la aplicación para omitir la fila de encabezado, si es necesario.

  5. Ahora puede seleccionar el icono Reanudar programa para continuar con la ejecución de la aplicación.

    IntelliJ IDEA Seleccione Reanudar programa.

  6. Si la aplicación finaliza correctamente, debería ver una salida similar a la siguiente:

    Salida de la consola del depurador en IntelliJ IDEA.

Pasos siguientes

Escenarios

Creación y ejecución de aplicaciones

Herramientas y extensiones

Gestionar recursos