Uso de la API de REST de Apache Spark para enviar trabajos remotos a un clúster Spark de HDInsightUse Apache Spark REST API to submit remote jobs to an HDInsight Spark cluster

Obtenga información sobre cómo usar Apache Livy, la API REST de Apache Spark, que se usa para enviar trabajos remotos a un clúster de Azure HDInsight Spark.Learn how to use Apache Livy, the Apache Spark REST API, which is used to submit remote jobs to an Azure HDInsight Spark cluster. Para obtener documentación detallada, consulte https://livy.incubator.apache.org/.For detailed documentation, see https://livy.incubator.apache.org/.

Puede usar Livy para ejecutar shells de Spark interactivos o enviar trabajos por lotes que se ejecutarán en Spark.You can use Livy to run interactive Spark shells or submit batch jobs to be run on Spark. Este artículo trata acerca de cómo utilizar Livy para enviar trabajos por lotes.This article talks about using Livy to submit batch jobs. Los fragmentos de código de este artículo usan cURL para realizar llamadas de la API de REST al punto de conexión de Livy Spark.The snippets in this article use cURL to make REST API calls to the Livy Spark endpoint.

Requisitos previos:Prerequisites:

Envío de un trabajo por lotes de Apache Livy SparkSubmit an Apache Livy Spark batch job

Antes de enviar un trabajo por lotes, debe cargar el archivo jar de aplicación en el almacenamiento del clúster asociado al clúster.Before you submit a batch job, you must upload the application jar on the cluster storage associated with the cluster. Puede usar AzCopy, una utilidad de línea de comandos, para hacerlo.You can use AzCopy, a command-line utility, to do so. Hay muchos otros clientes que se pueden usar para cargar datos.There are various other clients you can use to upload data. Puede encontrar más información al respecto en Carga de datos para trabajos de Apache Hadoop en HDInsight.You can find more about them at Upload data for Apache Hadoop jobs in HDInsight.

curl -k --user "<hdinsight user>:<user password>" -v -H "Content-Type: application/json" -X POST -d '{ "file":"<path to application jar>", "className":"<classname in jar>" }' 'https://<spark_cluster_name>.azurehdinsight.net/livy/batches' -H "X-Requested-By: admin"

Ejemplos:Examples:

  • Si el archivo jar se encuentra en el almacenamiento de clúster (WASB)If the jar file is on the cluster storage (WASB)

      curl -k --user "admin:mypassword1!" -v -H "Content-Type: application/json" -X POST -d '{ "file":"wasb://mycontainer@mystorageaccount.blob.core.windows.net/data/SparkSimpleTest.jar", "className":"com.microsoft.spark.test.SimpleFile" }' "https://mysparkcluster.azurehdinsight.net/livy/batches" -H "X-Requested-By: admin"
    
  • Si quiere pasar el nombre del archivo jar y el nombre de clase como parte de un archivo de entrada (en este ejemplo, input.txt)If you want to pass the jar filename and the classname as part of an input file (in this example, input.txt)

      curl -k  --user "admin:mypassword1!" -v -H "Content-Type: application/json" -X POST --data @C:\Temp\input.txt "https://mysparkcluster.azurehdinsight.net/livy/batches" -H "X-Requested-By: admin"
    

Obtención de información sobre los lotes de Livy Spark que se ejecutan en el clústerGet information on Livy Spark batches running on the cluster

curl -k --user "<hdinsight user>:<user password>" -v -X GET "https://<spark_cluster_name>.azurehdinsight.net/livy/batches"

Ejemplos:Examples:

  • Si desea recuperar todos los lotes de Livy Spark que se ejecutan en el clúster:If you want to retrieve all the Livy Spark batches running on the cluster:

      curl -k --user "admin:mypassword1!" -v -X GET "https://mysparkcluster.azurehdinsight.net/livy/batches" 
    
  • Si desea recuperar un lote específico con un determinado identificador de loteIf you want to retrieve a specific batch with a given batchId

      curl -k --user "admin:mypassword1!" -v -X GET "https://mysparkcluster.azurehdinsight.net/livy/batches/{batchId}"
    

Eliminación de un trabajo por lotes de Livy SparkDelete a Livy Spark batch job

curl -k --user "<hdinsight user>:<user password>" -v -X DELETE "https://<spark_cluster_name>.azurehdinsight.net/livy/batches/{batchId}"

Ejemplo:Example:

curl -k --user "admin:mypassword1!" -v -X DELETE "https://mysparkcluster.azurehdinsight.net/livy/batches/{batchId}"

Livy Spark y alta disponibilidadLivy Spark and high-availability

Livy proporciona alta disponibilidad para los trabajos de Spark que se ejecuten en el clúster.Livy provides high-availability for Spark jobs running on the cluster. Estos son algunos ejemplos.Here is a couple of examples.

  • Si el servicio Livy deja de funcionar después de haber enviado un trabajo de forma remota a un clúster Spark, dicho trabajo continúa ejecutándose en segundo plano.If the Livy service goes down after you have submitted a job remotely to a Spark cluster, the job continues to run in the background. Cuando se restablece el funcionamiento de Livy, restaura el estado del trabajo e informa de ello.When Livy is back up, it restores the status of the job and reports it back.
  • Los cuadernos de Jupyter Notebook para HDInsight cuentan con la tecnología de Livy en el backend.Jupyter notebooks for HDInsight are powered by Livy in the backend. Si un cuaderno ejecuta un trabajo de Spark y se reinicia el servicio Livy, el cuaderno sigue ejecutando las celdas de código.If a notebook is running a Spark job and the Livy service gets restarted, the notebook continues to run the code cells.

Mostrar un ejemploShow me an example

En esta sección se verán ejemplos de uso de Livy Spark para enviar un trabajo por lotes, supervisar el progreso del trabajo y después eliminarlo.In this section, we look at examples to use Livy Spark to submit batch job, monitor the progress of the job, and then delete it. La aplicación que se usa en este ejemplo es la que se desarrolla en el artículo Creación de una aplicación de Scala independiente para ejecutarla en el clúster HDInsight Spark.The application we use in this example is the one developed in the article Create a standalone Scala application and to run on HDInsight Spark cluster. En los pasos siguientes se da por hecho que:The steps here assume that:

  • Ya ha copiado el archivo JAR de la aplicación en la cuenta de almacenamiento asociada con el clúster.You have already copied over the application jar to the storage account associated with the cluster.
  • Tiene CuRL instalado en el equipo donde intenta seguir estos pasos.You have CuRL installed on the computer where you are trying these steps.

Lleve a cabo los siguiente pasos:Perform the following steps:

  1. Nos gustaría comprobar primero que Livy Spark se está ejecutando en el clúster.Let us first verify that Livy Spark is running on the cluster. Podemos hacerlo mediante la obtención de una lista de lotes en ejecución.We can do so by getting a list of running batches. Si es la primera vez que ejecuta un trabajo con Livy, la salida debe devolver cero.If you are running a job using Livy for the first time, the output should return zero.

     curl -k --user "admin:mypassword1!" -v -X GET "https://mysparkcluster.azurehdinsight.net/livy/batches"
    

    Debería obtener una salida similar al siguiente fragmento de código:You should get an output similar to the following snippet:

     < HTTP/1.1 200 OK
     < Content-Type: application/json; charset=UTF-8
     < Server: Microsoft-IIS/8.5
     < X-Powered-By: ARR/2.5
     < X-Powered-By: ASP.NET
     < Date: Fri, 20 Nov 2015 23:47:53 GMT
     < Content-Length: 34
     <
     {"from":0,"total":0,"sessions":[]}* Connection #0 to host mysparkcluster.azurehdinsight.net left intact
    

    Observe que la última línea de la salida indica total: 0, lo que sugiere que no hay lotes en ejecución.Notice how the last line in the output says total:0, which suggests no running batches.

  2. Ahora vamos a enviar un trabajo por lotes.Let us now submit a batch job. El fragmento de código siguiente usa un archivo de entrada (input.txt) para pasar el nombre del archivo jar y el nombre de clase como parámetros.The following snippet uses an input file (input.txt) to pass the jar name and the class name as parameters. Si ejecuta estos pasos desde un equipo Windows, el enfoque recomendado es usar un archivo de entrada.If you are running these steps from a Windows computer, using an input file is the recommended approach.

     curl -k --user "admin:mypassword1!" -v -H "Content-Type: application/json" -X POST --data @C:\Temp\input.txt "https://mysparkcluster.azurehdinsight.net/livy/batches" -H "X-Requested-By: admin"
    

    A continuación se definen los parámetros del archivo input.txt :The parameters in the file input.txt are defined as follows:

     { "file":"wasb:///example/jars/SparkSimpleApp.jar", "className":"com.microsoft.spark.example.WasbIOTest" }
    

    Debería ver una salida similar al siguiente fragmento de código:You should see an output similar to the following snippet:

     < HTTP/1.1 201 Created
     < Content-Type: application/json; charset=UTF-8
     < Location: /0
     < Server: Microsoft-IIS/8.5
     < X-Powered-By: ARR/2.5
     < X-Powered-By: ASP.NET
     < Date: Fri, 20 Nov 2015 23:51:30 GMT
     < Content-Length: 36
     <
     {"id":0,"state":"starting","log":[]}* Connection #0 to host mysparkcluster.azurehdinsight.net left intact
    

    Observe que la última línea del resultado indica state:starting.Notice how the last line of the output says state:starting. También indica id:0.It also says, id:0. Aquí, 0 es el identificador de lote.Here, 0 is the batch ID.

  3. Ahora puede recuperar el estado de este lote concreto con el identificador de lote.You can now retrieve the status of this specific batch using the batch ID.

     curl -k --user "admin:mypassword1!" -v -X GET "https://mysparkcluster.azurehdinsight.net/livy/batches/0"
    

    Debería ver una salida similar al siguiente fragmento de código:You should see an output similar to the following snippet:

     < HTTP/1.1 200 OK
     < Content-Type: application/json; charset=UTF-8
     < Server: Microsoft-IIS/8.5
     < X-Powered-By: ARR/2.5
     < X-Powered-By: ASP.NET
     < Date: Fri, 20 Nov 2015 23:54:42 GMT
     < Content-Length: 509
     <
     {"id":0,"state":"success","log":["\t diagnostics: N/A","\t ApplicationMaster host: 10.0.0.4","\t ApplicationMaster RPC port: 0","\t queue: default","\t start time: 1448063505350","\t final status: SUCCEEDED","\t tracking URL: http://hn0-myspar.lpel1gnnvxne3gwzqkfq5u5uzh.jx.internal.cloudapp.net:8088/proxy/application_1447984474852_0002/","\t user: root","15/11/20 23:52:47 INFO Utils: Shutdown hook called","15/11/20 23:52:47 INFO Utils: Deleting directory /tmp/spark-b72cd2bf-280b-4c57-8ceb-9e3e69ac7d0c"]}* Connection #0 to host mysparkcluster.azurehdinsight.net left intact
    

    La salida muestra ahora state:success, lo que sugiere que el trabajo se ha completado correctamente.The output now shows state:success, which suggests that the job was successfully completed.

  4. Si lo desea, ahora puede eliminar el lote.If you want, you can now delete the batch.

     curl -k --user "admin:mypassword1!" -v -X DELETE "https://mysparkcluster.azurehdinsight.net/livy/batches/0"
    

    Debería ver una salida similar al siguiente fragmento de código:You should see an output similar to the following snippet:

     < HTTP/1.1 200 OK
     < Content-Type: application/json; charset=UTF-8
     < Server: Microsoft-IIS/8.5
     < X-Powered-By: ARR/2.5
     < X-Powered-By: ASP.NET
     < Date: Sat, 21 Nov 2015 18:51:54 GMT
     < Content-Length: 17
     <
     {"msg":"deleted"}* Connection #0 to host mysparkcluster.azurehdinsight.net left intact
    

    La última línea de la salida indica que el lote se ha eliminado correctamente.The last line of the output shows that the batch was successfully deleted. Al eliminar un trabajo mientras se está ejecutando también se termina.Deleting a job, while it is running, also kills the job. Si elimina un trabajo que se ha completado correctamente o incorrectamente, elimina la información del trabajo por completo.If you delete a job that has completed, successfully or otherwise, it deletes the job information completely.

Actualizaciones de configuración de Livy, a partir de la versión 3.5 de HDInsightUpdates to Livy configuration starting with HDInsight 3.5 version

Los clústeres de HDInsight 3.5 y versiones posteriores, de forma predeterminada, deshabilitan el uso de rutas de acceso a archivos locales para el acceso a archivos de datos de ejemplo o archivos jar.HDInsight 3.5 clusters and above, by default, disable use of local file paths to access sample data files or jars. Le recomendamos que use la ruta de acceso wasb:// en su lugar para tener acceso a archivos jar o archivos de datos de ejemplo desde el clúster.We encourage you to use the wasb:// path instead to access jars or sample data files from the cluster.

Envío de trabajos de Livy para un clúster en una red virtual de AzureSubmitting Livy jobs for a cluster within an Azure virtual network

Si se conecta a un clúster de HDInsight Spark desde una instancia de Azure Virtual Network, puede conectarse directamente a Livy en el clúster.If you connect to an HDInsight Spark cluster from within an Azure Virtual Network, you can directly connect to Livy on the cluster. En tal caso, la dirección URL del punto de conexión de Livy es http://<IP address of the headnode>:8998/batches.In such a case, the URL for Livy endpoint is http://<IP address of the headnode>:8998/batches. Aquí, 8998 es el puerto en el que se ejecuta Livy en el nodo principal del clúster.Here, 8998 is the port on which Livy runs on the cluster headnode. Para más información sobre el acceso a los servicios en puertos no públicos, vea Puertos utilizados por los servicios Apache Hadoop en HDInsight.For more information on accessing services on non-public ports, see Ports used by Apache Hadoop services on HDInsight.

Paso siguienteNext step