Ejecución de trabajos de MapReduce con Apache Hadoop en HDInsight con REST

Aprenda a usar la API REST de Apache Hive WebHCat para ejecutar trabajos de MapReduce en un clúster de Apache Hadoop en HDInsight. Curl se usa para demostrar cómo puede interactuar con HDInsight mediante solicitudes HTTP sin formato para ejecutar trabajos de MapReduce.

Nota

Si ya está familiarizado con el uso de servidores de Hadoop basado en Linux, pero no conoce HDInsight, consulte el documento Lo que necesita saber acerca de Apache Hadoop en HDInsight basado en Linux.

Requisitos previos

Opciones:

  • Windows PowerShell o
  • Curl con jq

Ejecución de un trabajo de MapReduce

Nota

Al usar Curl o cualquier otra comunicación REST con WebHCat, debe autenticar las solicitudes proporcionando el nombre de usuario y la contraseña de administrador del clúster de HDInsight. Debe utilizar el nombre de clúster como parte del identificador URI utilizado para enviar las solicitudes al servidor.

La API de REST se protege con la autenticación de acceso básica. Siempre debe crear solicitudes usando HTTPS para así garantizar que las credenciales se envían de manera segura al servidor.

Curl

  1. Para facilitar su uso, establezca las variables siguientes. Este ejemplo se basa en un entorno de Windows, revise según sea necesario para su entorno.

    set CLUSTERNAME=
    set PASSWORD=
    
  2. Desde una línea de comandos, utilice el siguiente comando para comprobar que puede conectarse al clúster de HDInsight.

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

    Los parámetros que se utilizan en este comando son los siguientes:

    • -u: el nombre de usuario y la contraseña que se utilizan para autenticar la solicitud.
    • -G: indica que esta operación es una solicitud GET.

    El principio del URI, https://CLUSTERNAME.azurehdinsight.net/templeton/v1, es el mismo para todas las solicitudes.

    La respuesta que recibe es similar al código JSON siguiente:

    {"version":"v1","status":"ok"}
    
  3. Para enviar un trabajo de MapReduce, use el siguiente comando: Modifique la ruta de acceso a jq según sea necesario.

    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
    

    El final del identificador URI (/mapreduce/jar) indica a WebHCat que esta solicitud inicia un trabajo de MapReduce desde una clase en un archivo jar. Los parámetros que se utilizan en este comando son los siguientes:

    • -d: -G no se usa, así que la solicitud establece como valor predeterminado el método POST. -d especifica los valores de datos que se envían con la solicitud.
      • user.name: el usuario que ejecuta el comando.
      • jar: la ubicación del archivo del producto que contiene la clase que se va a ejecutar.
      • class: la clase que contiene la lógica de MapReduce.
      • arg: los argumentos que se pasarán al trabajo de MapReduce. En este caso, el archivo de texto de entrada y el directorio que se utilizan para el resultado.

    Este comando debe devolver un identificador de trabajo que se pueda usar para comprobar el estado del trabajo: job_1415651640909_0026.

  4. Para revisar el estado del trabajo, use el siguiente comando. Reemplace el valor de JOBID por el valor real devuelto en el paso anterior. Revise la ubicación de jq según sea necesario.

    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 su uso, establezca las variables siguientes. Reemplace CLUSTERNAME por el nombre real del clúster. Ejecute el comando y escriba la contraseña de inicio de sesión del clúster cuando se le solicite.

    $clusterName="CLUSTERNAME"
    $creds = Get-Credential -UserName admin -Message "Enter the cluster login password"
    
  2. Use el siguiente comando para comprobar que puede conectarse al clúster de HDInsight:

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

    La respuesta que recibe es similar al código JSON siguiente:

    {"version":"v1","status":"ok"}
    
  3. Para enviar un trabajo de MapReduce, utilice lo siguiente:

    $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
    

    El final del identificador URI (/mapreduce/jar) indica a WebHCat que esta solicitud inicia un trabajo de MapReduce desde una clase en un archivo jar. Los parámetros que se utilizan en este comando son los siguientes:

    • user.name: el usuario que ejecuta el comando.
    • jar: la ubicación del archivo del producto que contiene la clase que se va a ejecutar.
    • class: la clase que contiene la lógica de MapReduce.
    • arg: los argumentos que se pasarán al trabajo de MapReduce. En este caso, el archivo de texto de entrada y el directorio que se utilizan para el resultado.

    Este comando debe devolver un identificador de trabajo que se pueda usar para comprobar el estado del trabajo: job_1415651640909_0026.

  4. Para revisar el estado del trabajo, use el siguiente 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 métodos

  1. Si se completa el trabajo, el estado devuelto es SUCCEEDED.

  2. Cuando el estado del trabajo haya cambiado a SUCCEEDED, puede recuperar los resultados del trabajo desde Azure Blob Storage. El parámetro statusdir transmitido con la consulta contiene la ubicación del archivo de salida. En este ejemplo, la ubicación es /example/curl. Esta dirección almacena el resultado del trabajo en los clústeres del almacenamiento predeterminado en /example/curl.

Puede enumerar y descargar estos archivos mediante la CLI de Azure. Para obtener más información sobre el uso de la CLI de Azure para trabajar con Azure Blob Storage, consulte Inicio rápido: Creación, descarga y enumeración de blobs mediante la CLI de Azure.

Pasos siguientes

Para obtener información sobre otras maneras de trabajar con Hadoop en HDInsight:

Para obtener más información sobre la interfaz REST utilizada en este artículo, consulte la referencia de WebHCat.