Esecuzione di processi MapReduce con Apache Hadoop in HDInsight usando REST

Informazioni su come usare l'API REST Apache Hive WebHCat per eseguire processi MapReduce in un cluster Apache Hadoop in HDInsight. Curl viene usato per illustrare come sia possibile interagire con HDInsight usando richieste HTTP non elaborate per eseguire processi MapReduce.

Nota

Se si ha già familiarità con l'uso di server Hadoop basati su Linux, ma non si ha esperienza con HDInsight, vedere il documento Informazioni sull'uso di HDInsight in Linux.

Prerequisiti

Una delle due versioni seguenti:

  • Windows PowerShell o
  • Curl con jq

Eseguire un processo MapReduce

Nota

Quando si usa Curl o qualsiasi altra forma di comunicazione REST con WebHCat, è necessario autenticare le richieste fornendo il nome utente e la password da amministratore del cluster HDInsight. È necessario specificare il nome del cluster come parte dell'URI usato per inviare le richieste al server.

L'API REST viene protetta tramite l' autenticazione dell'accesso di base. È necessario effettuare sempre le richieste usando il protocollo HTTPS per essere certi che le credenziali vengano inviate in modo sicuro al server.

Curl

  1. Per semplificare l'uso, impostare le variabili seguenti. Questo esempio si basa su un ambiente Windows, rivedere in base alle esigenze per l'ambiente.

    set CLUSTERNAME=
    set PASSWORD=
    
  2. Da una riga di comando usare il comando seguente per verificare che sia possibile connettersi al cluster HDInsight:

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

    I parametri usati in questo comando sono i seguenti:

    • -u: il nome utente e la password usati per autenticare la richiesta.
    • -G: indica che questa operazione è una richiesta GET

    La parte iniziale dell'URI, https://CLUSTERNAME.azurehdinsight.net/templeton/v1, è uguale per tutte le richieste.

    Si riceverà una risposta simile al testo JSON seguente:

    {"version":"v1","status":"ok"}
    
  3. Per inviare un processo MapReduce, usare il comando seguente. Modificare il percorso in jq in base alle esigenze.

    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
    

    La fine dell'URI (/mapreduce/jar) indica a WebHCat che la richiesta avvia un processo MapReduce da una classe in un file con estensione jar. I parametri usati in questo comando sono i seguenti:

    • -d: -G non viene usato, quindi la richiesta viene utilizzata per impostazione predefinita per il metodo POST. -d specifica i valori di dati che vengono inviati con la richiesta.
      • user.name: l'utente che esegue il comando.
      • jar: il percorso del file con estensione jar che contiene la classe da eseguire.
      • class: la classe che contiene la logica MapReduce.
      • arg: gli argomenti da passare al processo MapReduce. In questo caso, il file di testo di input e la directory usata per l'output

    Questo comando deve restituire un ID processo che può essere usato per controllare lo stato del processo: job_1415651640909_0026.

  4. Per verificare lo stato del processo, usare il seguente comando. Sostituire il valore di JOBID con il valore effettivo restituito nel passaggio precedente. Rivedere la posizione di jq in base alle esigenze.

    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. Per semplificare l'uso, impostare le variabili seguenti. Sostituire CLUSTERNAME con il nome effettivo del cluster. Eseguire il comando e immettere la password di accesso del cluster quando richiesto.

    $clusterName="CLUSTERNAME"
    $creds = Get-Credential -UserName admin -Message "Enter the cluster login password"
    
  2. Usare il comando seguente per verificare che sia possibile connettersi al cluster HDInsight:

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

    Si riceverà una risposta simile al testo JSON seguente:

    {"version":"v1","status":"ok"}
    
  3. Per inviare un processo MapReduce, usare il seguente 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
    

    La fine dell'URI (/mapreduce/jar) indica a WebHCat che la richiesta avvia un processo MapReduce da una classe in un file con estensione jar. I parametri usati in questo comando sono i seguenti:

    • user.name: l'utente che esegue il comando.
    • jar: il percorso del file con estensione jar che contiene la classe da eseguire.
    • class: la classe che contiene la logica MapReduce.
    • arg: gli argomenti da passare al processo MapReduce. In questo caso, il file di testo di input e la directory usata per l'output

    Questo comando deve restituire un ID processo che può essere usato per controllare lo stato del processo: job_1415651640909_0026.

  4. Per verificare lo stato del processo, usare il seguente 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
    

Entrambi i metodi

  1. Se il processo è stato completato, lo stato restituito è SUCCEEDED.

  2. Dopo che lo stato del processo risulta essere SUCCEEDED, è possibile recuperare i risultati del processo dall'archivio BLOB di Azure. Il parametro statusdir passato con la query contiene il percorso del file di output. In questo esempio la località è /example/curl. Questo indirizzo archivia l'output del processo nella risorsa di archiviazione predefinita dei cluster in /example/curl.

È possibile elencare e scaricare questi file usando l' Interfaccia della riga di comando di Azure. Per altre informazioni sull'uso dell'interfaccia della riga di comando di Azure per l'uso dell'archiviazione BLOB di Azure, vedere Avvio rapido: Creare, scaricare ed elencare BLOB con l'interfaccia della riga di comando di Azure.

Passaggi successivi

Per informazioni su altre modalità d'uso di Hadoop in HDInsight:

Per altre informazioni sull'interfaccia REST usata in questo articolo, vedere le informazioni di riferimento su WebHCat.