Usare l'API REST di Apache Spark per inviare i processi remoti a un cluster HDInsight Spark

Informazioni su come usare Apache Livy, l'API REST di Apache Spark per inviare processi remoti a un cluster Azure HDInsight Spark. Per una documentazione dettagliata, vedere Apache Livy.

È possibile usare Livy per l'esecuzione interattiva di shell Spark o per inviare processi batch da eseguire su Spark. Questo articolo parla dell'uso di Livy per inviare processi batch. I frammenti di codice in questo articolo usano cURL per eseguire chiamate API REST all'endpoint Livy Spark.

Prerequisiti

Un cluster Apache Spark in HDInsight. Per istruzioni, vedere l'articolo dedicato alla creazione di cluster Apache Spark in Azure HDInsight.

Inviare un processo batch Apache Livy Spark

Prima di inviare un processo batch, è necessario caricare il file con estensione jar dell'applicazione nell'archivio del cluster associato al cluster. A tale scopo è possibile usare AzCopy, un'utilità della riga di comando. Sono disponibili molti altri client da usare per caricare i dati. Altre informazioni in merito sono disponibili in Caricare dati per processi Apache Hadoop in HDInsight.

curl -k --user "admin: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"

Esempio

  • Se il file JAR si trova nell'archiviazione cluster (WASBS)

    curl -k --user "admin:mypassword1!" -v -H "Content-Type: application/json" -X POST -d '{ "file":"wasbs://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"
    
  • Se si vuole trasferire il nome del file con estensione JAR e il nome della classe come parte di un file di input, in questo esempio 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"
    

Ottenere informazioni sui batch Livy Spark in esecuzione nel cluster

Sintassi:

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

Esempio

  • Per recuperare tutti i batch Livy Spark in esecuzione nel cluster:

    curl -k --user "admin:mypassword1!" -v -X GET "https://mysparkcluster.azurehdinsight.net/livy/batches"
    
  • Se si vuole recuperare un batch specifico con un ID batch specificato

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

Eliminare un processo batch Livy Spark

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

Esempio

Eliminazione di un processo batch con ID 5batch.

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

Livy Spark e disponibilità elevata

Livy fornisce disponibilità elevata per i processi Spark in esecuzione nel cluster. Ecco alcuni esempi.

  • Se il servizio Livy si arresta dopo aver inviato un processo in remoto a un cluster Spark, il processo continua a essere eseguito in background. Quando Livy ritorna attivo, ripristina lo stato del processo e crea un report.
  • I notebook di Jupyter per HDInsight sono basati su Livy nel back-end. Se un notebook è in esecuzione in un processo Spark e il servizio Livy viene riavviato, il notebook continuerà a eseguire le celle del codice.

Mostra un esempio

Questa sezione esamina alcuni esempi di come usare Livy Spark per inviare un processo batch, monitorare il progresso del processo e quindi eliminarlo. L'applicazione usata in questo esempio è quella sviluppata nell'articolo Creare un'applicazione Scala autonoma da eseguire nel cluster HDInsight Spark. I passaggi riportati di seguito presuppongono:

  • Il file JAR dell'applicazione è già stato copiato nell'account di archiviazione associato al cluster.
  • È stato installato CuRL nel computer in cui si sta provando questa procedura.

Eseguire questa procedura:

  1. Per semplificare l'uso, impostare le variabili di ambiente. Questo esempio si basa su un ambiente Windows, rivedere le variabili in base alle esigenze per l'ambiente. Sostituire CLUSTERNAMEe PASSWORD con i valori appropriati.

    set clustername=CLUSTERNAME
    set password=PASSWORD
    
  2. Verificare che Livy Spark sia in esecuzione nel cluster. È possibile eseguire questa operazione ottenendo un elenco di batch in esecuzione. Se si esegue un processo usando Livy per la prima volta, l'output dovrebbe restituire zero.

    curl -k --user "admin:%password%" -v -X GET "https://%clustername%.azurehdinsight.net/livy/batches"
    

    L'output dovrebbe essere simile al seguente frammento di codice:

    < 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
    

    Si noti che l'ultima riga nell'output corrisponde a total:0, che indica che non sono presenti batch in esecuzione.

  3. Inviare ora un processo batch. Il frammento di codice seguente usa un file di input (input.txt) per trasferire il nome del file con estensione JAR e il nome della classe come parametri. Se si eseguono questi passaggi da un computer Windows, l'uso di un file di input è l'approccio consigliato.

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

    I parametri nel file input.txt sono definiti come segue:

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

    L'output visualizzato dovrebbe essere simile al frammento di codice seguente:

    < 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
    

    Si noti che l'ultima riga dell'output indica state:starting. Indica anche id:0. 0 è l'ID del batch.

  4. È ora possibile recuperare lo stato di questo batch specifico usando l'ID del batch.

    curl -k --user "admin:%password%" -v -X GET "https://%clustername%.azurehdinsight.net/livy/batches/0"
    

    L'output visualizzato dovrebbe essere simile al frammento di codice seguente:

    < 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://myspar.lpel.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
    

    L'output ora indica state:success, il che suggerisce che il processo è stato completato.

  5. Se si vuole, è ora possibile eliminare il batch.

    curl -k --user "admin:%password%" -v -X DELETE "https://%clustername%.azurehdinsight.net/livy/batches/0"
    

    L'output visualizzato dovrebbe essere simile al frammento di codice seguente:

    < 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
    

    L'ultima riga dell'output indica che il batch è stato correttamente eliminato. L'eliminazione di un processo, mentre è in esecuzione, termina anche il processo. Se si elimina un processo completato correttamente o non correttamente, le informazioni sul processo vengono eliminate completamente.

Aggiornamenti alla configurazione di Livy a partire dalla versione 3.5 di HDInsight

I cluster HDInsight 3.5 e superiori, per impostazione predefinita, disabilitano l'uso di percorsi di file locali per accedere ai file di dati di esempio o a file JAR. Si consiglia di usare invece il percorso wasbs:// per accedere a file JAR o a file di dati di esempio dal cluster.

Invio di processi Livy per un cluster all'interno di una rete virtuale di Azure

Se ci si connette a un cluster HDInsight Spark all'interno di una rete virtuale di Azure, è possibile connettersi direttamente a Livy nel cluster. In tal caso, l'URL per l'endpoint di Livy è http://<IP address of the headnode>:8998/batches. In questo caso, 8998 è la porta su cui viene eseguito Livy sul nodo head del cluster. Per altre informazioni sull'accesso ai servizi sulle porte non pubbliche, vedere Porte usate dai servizi Apache Hadoop su HDInsight.

Passaggi successivi