Executar tarefas do MapReduce com o Apache Hadoop no HDInsight com REST

Saiba como utilizar a API REST WebHCat do Apache Hive para executar tarefas do MapReduce num cluster do Apache Hadoop no HDInsight. O Curl é utilizado para demonstrar como pode interagir com o HDInsight com pedidos HTTP não processados para executar tarefas do MapReduce.

Nota

Se já estiver familiarizado com a utilização de servidores Hadoop baseados em Linux, mas não estiver familiarizado com o HDInsight, consulte o documento O que precisa de saber sobre o Apache Hadoop baseado em Linux no HDInsight .

Pré-requisitos

Uma das seguintes opções:

  • Windows PowerShell ou,
  • Curl com jq

Executar uma tarefa do MapReduce

Nota

Quando utiliza o Curl ou qualquer outra comunicação REST com o WebHCat, tem de autenticar os pedidos ao fornecer o nome de utilizador e a palavra-passe do administrador do cluster do HDInsight. Tem de utilizar o nome do cluster como parte do URI que é utilizado para enviar os pedidos para o servidor.

A API REST é protegida através da autenticação de acesso básica. Deve sempre fazer pedidos com HTTPS para garantir que as suas credenciais são enviadas de forma segura para o servidor.

Curl

  1. Para facilitar a utilização, defina as variáveis abaixo. Este exemplo baseia-se num ambiente do Windows, reveja conforme necessário para o seu ambiente.

    set CLUSTERNAME=
    set PASSWORD=
    
  2. Numa linha de comandos, utilize o seguinte comando para verificar que se consegue ligar ao cluster do HDInsight:

    curl -u admin:%PASSWORD% -G https://%CLUSTERNAME%.azurehdinsight.net/templeton/v1/status
    

    Os parâmetros utilizados neste comando são os seguintes:

    • -u: Indica o nome de utilizador e a palavra-passe utilizados para autenticar o pedido
    • -G: Indica que esta operação é um pedido GET

    O início do URI, https://CLUSTERNAME.azurehdinsight.net/templeton/v1, é o mesmo para todos os pedidos.

    Recebe uma resposta semelhante à seguinte JSON:

    {"version":"v1","status":"ok"}
    
  3. Para submeter uma tarefa do MapReduce, utilize o seguinte comando. Modifique o caminho para jq conforme necessário.

    curl -u admin:%PASSWORD% -d user.name=admin ^
    -d jar=/example/jars/hadoop-mapreduce-examples.jar ^
    -d class=wordcount -d arg=/example/data/gutenberg/davinci.txt -d arg=/example/data/output ^
    https://%CLUSTERNAME%.azurehdinsight.net/templeton/v1/mapreduce/jar | ^
    C:\HDI\jq-win64.exe .id
    

    O fim do URI (/mapreduce/jar) indica ao WebHCat que este pedido inicia uma tarefa do MapReduce a partir de uma classe num ficheiro jar. Os parâmetros utilizados neste comando são os seguintes:

    • -d: -G não é utilizado, pelo que o pedido é predefinido para o método POST. -d especifica os valores de dados que são enviados com o pedido.
      • user.name: o utilizador que está a executar o comando
      • jar: A localização do ficheiro jar que contém a classe a ser executada
      • classe: A classe que contém a lógica MapReduce
      • arg: os argumentos a serem transmitidos para a tarefa MapReduce. Neste caso, o ficheiro de texto de entrada e o diretório que são utilizados para a saída

    Este comando deve devolver um ID de tarefa que pode ser utilizado para verificar o estado da tarefa: job_1415651640909_0026.

  4. Para verificar o estado da tarefa, utilize o seguinte comando. Substitua o valor para pelo JOBID valor real devolvido no passo anterior. Reveja a localização do jq conforme necessário.

    set JOBID=job_1415651640909_0026
    
    curl -G -u admin:%PASSWORD% -d user.name=admin https://%CLUSTERNAME%.azurehdinsight.net/templeton/v1/jobs/%JOBID% | ^
    C:\HDI\jq-win64.exe .status.state
    

PowerShell

  1. Para facilitar a utilização, defina as variáveis abaixo. Substitua CLUSTERNAME pelo nome real do cluster. Execute o comando e introduza a palavra-passe de início de sessão do cluster quando lhe for pedido.

    $clusterName="CLUSTERNAME"
    $creds = Get-Credential -UserName admin -Message "Enter the cluster login password"
    
  2. Utilize o seguinte comando para verificar se consegue ligar ao cluster do HDInsight:

    $resp = Invoke-WebRequest -Uri "https://$clustername.azurehdinsight.net/templeton/v1/status" `
        -Credential $creds `
        -UseBasicParsing
    $resp.Content
    

    Recebe uma resposta semelhante à seguinte JSON:

    {"version":"v1","status":"ok"}
    
  3. Para submeter uma tarefa do MapReduce, utilize o seguinte comando:

    $reqParams = @{}
    $reqParams."user.name" = "admin"
    $reqParams.jar = "/example/jars/hadoop-mapreduce-examples.jar"
    $reqParams.class = "wordcount"
    $reqParams.arg = @()
    $reqParams.arg += "/example/data/gutenberg/davinci.txt"
    $reqparams.arg += "/example/data/output"
    $resp = Invoke-WebRequest -Uri "https://$clusterName.azurehdinsight.net/templeton/v1/mapreduce/jar" `
       -Credential $creds `
       -Body $reqParams `
       -Method POST `
       -UseBasicParsing
    $jobID = (ConvertFrom-Json $resp.Content).id
    $jobID
    

    O fim do URI (/mapreduce/jar) indica ao WebHCat que este pedido inicia uma tarefa do MapReduce a partir de uma classe num ficheiro jar. Os parâmetros utilizados neste comando são os seguintes:

    • user.name: o utilizador que está a executar o comando
    • jar: A localização do ficheiro jar que contém a classe a ser executada
    • classe: A classe que contém a lógica MapReduce
    • arg: os argumentos a serem transmitidos para a tarefa MapReduce. Neste caso, o ficheiro de texto de entrada e o diretório que são utilizados para a saída

    Este comando deve devolver um ID de tarefa que pode ser utilizado para verificar o estado da tarefa: job_1415651640909_0026.

  4. Para verificar o estado da tarefa, utilize o seguinte comando:

    $reqParams=@{"user.name"="admin"}
    $resp = Invoke-WebRequest -Uri "https://$clusterName.azurehdinsight.net/templeton/v1/jobs/$jobID" `
       -Credential $creds `
       -Body $reqParams `
       -UseBasicParsing
    
    # ConvertFrom-JSON can't handle duplicate names with different case
    # So change one to prevent the error
    $fixDup=$resp.Content.Replace("jobID","job_ID")
    (ConvertFrom-Json $fixDup).status.state
    

Ambos os métodos

  1. Se a tarefa estiver concluída, o estado devolvido é SUCCEEDED.

  2. Quando o estado da tarefa for alterado para SUCCEEDED, pode obter os resultados da tarefa a partir do Armazenamento de Blobs do Azure. O statusdir parâmetro transmitido com a consulta contém a localização do ficheiro de saída. Neste exemplo, a localização é /example/curl. Este endereço armazena a saída da tarefa no armazenamento predefinido dos clusters em /example/curl.

Pode listar e transferir estes ficheiros com a CLI do Azure. Para obter mais informações sobre como utilizar a CLI do Azure para trabalhar com o armazenamento de Blobs do Azure, veja Início Rápido: Criar, transferir e listar blobs com a CLI do Azure.

Passos seguintes

Para obter informações sobre outras formas de trabalhar com o Hadoop no HDInsight:

Para obter mais informações sobre a interface REST que é utilizada neste artigo, consulte a Referência de WebHCat.