Utilizar a API REST do Apache Spark para submeter trabalhos remotos para um cluster do HDInsight Spark

Saiba como utilizar o Apache Livy, a API REST do Apache Spark, que é utilizada para submeter tarefas remotas a um cluster do Spark do Azure HDInsight. Para obter documentação detalhada, veja Apache Livy.

Pode utilizar o Livy para executar shells interativos do Spark ou submeter tarefas de lote para serem executadas no Spark. Este artigo aborda a utilização do Livy para submeter tarefas em lote. Os fragmentos neste artigo utilizam cURL para fazer chamadas à API REST para o ponto final do Livy Spark.

Pré-requisitos

Um cluster do Apache Spark no HDInsight. Para obter instruções, veja Criar clusters do Apache Spark no Azure HDInsight.

Submeter uma tarefa de lote do Apache Livy Spark

Antes de submeter uma tarefa de lote, tem de carregar o jar da aplicação no armazenamento do cluster associado ao cluster. Para o fazer, pode utilizar AzCopy, um utilitário de linha de comandos. Existem vários outros clientes que pode utilizar para carregar dados. Pode encontrar mais informações sobre as mesmas em Carregar dados para tarefas do Apache Hadoop no 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"

Exemplos

  • Se o ficheiro jar estiver no armazenamento do 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 quiser transmitir o nome de ficheiro jar e o nome da classe como parte de um ficheiro de entrada (neste exemplo, 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"
    

Obter informações sobre lotes do Livy Spark em execução no cluster

Sintaxe:

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

Exemplos

  • Se quiser obter todos os lotes do Livy Spark em execução no cluster:

    curl -k --user "admin:mypassword1!" -v -X GET "https://mysparkcluster.azurehdinsight.net/livy/batches"
    
  • Se quiser obter um lote específico com um determinado ID de lote

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

Eliminar uma tarefa de lote do Livy Spark

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

Exemplo

A eliminar uma tarefa de lote com o ID 5de lote .

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

Livy Spark e elevada disponibilidade

O Livy fornece elevada disponibilidade para tarefas do Spark em execução no cluster. Eis alguns exemplos.

  • Se o serviço Livy ficar inativo depois de ter submetido um trabalho remotamente para um cluster do Spark, a tarefa continuará a ser executada em segundo plano. Quando o Livy faz uma cópia de segurança, restaura o estado da tarefa e reporta-a novamente.
  • Os Jupyter Notebooks para HDInsight têm tecnologia Livy no back-end. Se um bloco de notas estiver a executar uma tarefa do Spark e o serviço Livy for reiniciado, o bloco de notas continuará a executar as células de código.

Mostrar-me um exemplo

Nesta secção, analisamos exemplos para utilizar o Livy Spark para submeter tarefas de lote, monitorizar o progresso da tarefa e, em seguida, eliminá-la. A aplicação que utilizamos neste exemplo é a que foi desenvolvida no artigo Criar uma aplicação Scala autónoma e para ser executada no cluster do HDInsight Spark. Os passos aqui pressupõem:

  • Já copiou o jar da aplicação para a conta de armazenamento associada ao cluster.
  • Instalou a Curl no computador onde está a experimentar estes passos.

Efetue os seguintes passos:

  1. Para facilitar a utilização, defina variáveis de ambiente. Este exemplo baseia-se num ambiente do Windows, reveja as variáveis conforme necessário para o seu ambiente. Substitua CLUSTERNAMEe PASSWORD pelos valores adequados.

    set clustername=CLUSTERNAME
    set password=PASSWORD
    
  2. Verifique se o Livy Spark está em execução no cluster. Podemos fazê-lo ao obter uma lista de lotes em execução. Se estiver a executar um trabalho com o Livy pela primeira vez, o resultado deverá devolver zero.

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

    Deverá obter um resultado semelhante ao seguinte fragmento:

    < 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
    

    Repare como a última linha na saída diz total:0, o que sugere que não existem lotes em execução.

  3. Vamos agora submeter uma tarefa de lote. O fragmento seguinte utiliza um ficheiro de entrada (input.txt) para transmitir o nome do jar e o nome da classe como parâmetros. Se estiver a executar estes passos a partir de um computador Windows, utilizar um ficheiro de entrada é a abordagem recomendada.

    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"
    

    Os parâmetros no ficheiro input.txt são definidos da seguinte forma:

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

    Deverá ver um resultado semelhante ao seguinte fragmento:

    < 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
    

    Repare como a última linha do resultado diz state:starting. Também diz , ID:0. Aqui, 0 é o ID do lote.

  4. Agora, pode obter o estado deste lote específico com o ID do lote.

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

    Deverá ver um resultado semelhante ao seguinte fragmento:

    < 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
    

    O resultado mostra agora state:success, o que sugere que a tarefa foi concluída com êxito.

  5. Se quiser, agora pode eliminar o lote.

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

    Deverá ver um resultado semelhante ao seguinte fragmento:

    < 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
    

    A última linha do resultado mostra que o lote foi eliminado com êxito. Eliminar um trabalho, enquanto está em execução, também acaba com o trabalho. Se eliminar uma tarefa que tenha concluído, com êxito ou de outra forma, elimina completamente as informações da tarefa.

Atualizações para a configuração do Livy a partir da versão do HDInsight 3.5

Por predefinição, os clusters do HDInsight 3.5 e superior desativam a utilização de caminhos de ficheiros locais para aceder a ficheiros ou jars de dados de exemplo. Recomendamos que utilize o wasbs:// caminho para aceder a jars ou ficheiros de dados de exemplo do cluster.

Submeter tarefas livy para um cluster numa rede virtual do Azure

Se ligar a um cluster do HdInsight Spark a partir de um Rede Virtual do Azure, pode ligar-se diretamente ao Livy no cluster. Nesse caso, o URL do ponto final do Livy é http://<IP address of the headnode>:8998/batches. Aqui, 8998 é a porta na qual o Livy é executado no nó principal do cluster. Para obter mais informações sobre como aceder a serviços em portas não públicas, veja Portas utilizadas pelos serviços do Apache Hadoop no HDInsight.

Passos seguintes