Ejecución de consultas de Apache Hive con Apache Hadoop en HDInsight mediante REST

Obtenga información acerca de cómo usar la API REST de WebHCat para ejecutar consultas de Apache Hive con Apache Hadoop en un clúster de Azure HDInsight.

Requisitos previos

URI base para la API de REST

El identificador uniforme de recursos (URI) base de la API REST en HDInsight es https://CLUSTERNAME.azurehdinsight.net/api/v1/clusters/CLUSTERNAME, donde CLUSTERNAME es el nombre del clúster. Los nombres de clúster en los URI distinguen mayúsculas de minúsculas. Si bien el nombre del clúster en la parte del nombre de dominio completo (FQDN) del URI (CLUSTERNAME.azurehdinsight.net) no distingue entre mayúsculas y minúsculas, otras apariciones en el identificador URI sí lo hacen.

Authentication

Al usar Curl o cualquier otra comunicación REST con WebHCat, debe proporcionar el nombre de usuario y la contraseña del administrador del clúster de HDInsight para autenticar las solicitudes. La API de REST se protege con la autenticación básica. Para garantizar que las credenciales se envían de manera segura al servidor, siempre debe crear solicitudes usando HTTP segura (HTTPS).

Configuración (conservar las credenciales)

Conserve las credenciales para evitar volver a escribirlas en cada ejemplo. El nombre del clúster se conservará en un paso independiente.

A. Bash
Edite el siguiente script, reemplazando PASSWORD por su contraseña real. Luego, escriba el comando.

export PASSWORD='PASSWORD'

B. PowerShell Ejecute el código siguiente y escriba sus credenciales en la ventana emergente:

$creds = Get-Credential -UserName "admin" -Message "Enter the HDInsight login"

Identificación del nombre del clúster con las mayúsculas y minúsculas correctas

Las mayúsculas y minúsculas reales del nombre del clúster pueden no ser como cabría esperar, dependen de la forma en que se haya creado el clúster. Estos pasos mostrarán las mayúsculas y minúsculas reales y después las almacenarán en una variable para todos los ejemplos posteriores.

Edite los siguientes scripts para reemplazar CLUSTERNAME por su nombre de clúster. Luego, escriba el comando. (El nombre del clúster para el nombre de dominio completo no distingue mayúsculas de minúsculas).

export CLUSTER_NAME=$(curl -u admin:$PASSWORD -sS -G "https://CLUSTERNAME.azurehdinsight.net/api/v1/clusters" | jq -r '.items[].Clusters.cluster_name')
echo $CLUSTER_NAME
# Identify properly cased cluster name
$resp = Invoke-WebRequest -Uri "https://CLUSTERNAME.azurehdinsight.net/api/v1/clusters" `
    -Credential $creds -UseBasicParsing
$clusterName = (ConvertFrom-Json $resp.Content).items.Clusters.cluster_name;

# Show cluster name
$clusterName

Ejecución de una consulta de Hive

  1. Utilice uno de los siguientes comandos para comprobar que puede conectarse al clúster de HDInsight:

    curl -u admin:$PASSWORD -G https://$CLUSTER_NAME.azurehdinsight.net/templeton/v1/status
    
    $resp = Invoke-WebRequest -Uri "https://$clusterName.azurehdinsight.net/templeton/v1/status" `
       -Credential $creds `
       -UseBasicParsing
    $resp.Content
    

    Debe recibir una respuesta similar al texto siguiente:

    {"status":"ok","version":"v1"}
    

    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 es una solicitud de operación GET.
  2. El principio de la dirección URL, https://$CLUSTERNAME.azurehdinsight.net/templeton/v1, es el mismo para todas las solicitudes. La ruta de acceso, /status, indica que la solicitud debe devolver un estado de WebHCat (también conocido como Templeton) al servidor. También puede solicitar la versión de Hive con el siguiente comando:

    curl -u admin:$PASSWORD -G https://$CLUSTER_NAME.azurehdinsight.net/templeton/v1/version/hive
    
    $resp = Invoke-WebRequest -Uri "https://$clusterName.azurehdinsight.net/templeton/v1/version/hive" `
       -Credential $creds `
       -UseBasicParsing
    $resp.Content
    

    Esta solicitud devuelve una respuesta similar al texto siguiente:

    {"module":"hive","version":"1.2.1000.2.6.5.3008-11"}
    
  3. Use lo siguiente para crear una tabla llamada log4jLogs:

    JOB_ID=$(curl -s -u admin:$PASSWORD -d user.name=admin -d execute="DROP+TABLE+log4jLogs;CREATE+EXTERNAL+TABLE+log4jLogs(t1+string,t2+string,t3+string,t4+string,t5+string,t6+string,t7+string)+ROW+FORMAT+DELIMITED+FIELDS+TERMINATED+BY+' '+STORED+AS+TEXTFILE+LOCATION+'/example/data/';SELECT+t4+AS+sev,COUNT(*)+AS+count+FROM+log4jLogs+WHERE+t4+=+'[ERROR]'+AND+INPUT__FILE__NAME+LIKE+'%25.log'+GROUP+BY+t4;" -d statusdir="/example/rest" https://$CLUSTER_NAME.azurehdinsight.net/templeton/v1/hive | jq -r .id)
    echo $JOB_ID
    
    $reqParams = @{"user.name"="admin";"execute"="DROP TABLE log4jLogs;CREATE EXTERNAL TABLE log4jLogs(t1 string, t2 string, t3 string, t4 string, t5 string, t6 string, t7 string) ROW FORMAT DELIMITED BY ' ' STORED AS TEXTFILE LOCATION '/example/data/;SELECT t4 AS sev,COUNT(*) AS count FROM log4jLogs WHERE t4 = '[ERROR]' GROUP BY t4;";"statusdir"="/example/rest"}
    $resp = Invoke-WebRequest -Uri "https://$clusterName.azurehdinsight.net/templeton/v1/hive" `
       -Credential $creds `
       -Body $reqParams `
       -Method POST `
       -UseBasicParsing
    $jobID = (ConvertFrom-Json $resp.Content).id
    $jobID
    

    Esta solicitud utiliza el método POST, que envía los datos como parte de la solicitud a la API de REST. Los siguientes valores de datos se envían con la solicitud:

    • user.name: el usuario que ejecuta el comando.
    • execute: las instrucciones HiveQL para ejecutar.
    • statusdir: el directorio donde se escribe el estado de este trabajo.

    Estas instrucciones realizan las acciones siguientes:

    • DROP TABLE: si la tabla ya existe, se elimina.

    • CREATE EXTERNAL TABLE: crea una nueva tabla "externa" en Hive. Las tablas externas solo almacenan la definición de tabla en Hive. Los datos permanecen en la ubicación original.

      Nota

      Las tablas externas se deben utilizar cuando se espera que un origen externo actualice los datos subyacentes. Por ejemplo, un proceso de carga de datos automatizado u otra operación de MapReduce.

      La eliminación de una tabla externa no elimina los datos, solamente la definición de tabla.

    • ROW FORMAT: indica el formato de los datos. Los campos de cada registro se separan mediante un espacio.

    • STORED AS TEXTFILE LOCATION: indica dónde se almacenan los datos (el directorio example/data) y que se almacenan como texto.

    • SELECT: selecciona un número de todas las filas donde la columna t4 contiene el valor [ERROR] . Esta instrucción devuelve un valor de 3 porque hay tres filas que contienen este valor.

      Nota

      Observe que los espacios entre las instrucciones HiveQL se reemplazan por el carácter + cuando se usa con Curl. Los valores entre comillas que contengan un espacio, como el delimitador, no se reemplazarán por +.

      Este comando devuelve un identificador de trabajo que se pueda usar para comprobar el estado del trabajo.

  4. Para revisar el estado del trabajo, use el siguiente comando:

    curl -u admin:$PASSWORD -d user.name=admin -G https://$CLUSTER_NAME.azurehdinsight.net/templeton/v1/jobs/$jobid | jq .status.state
    
    $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
    

    Si se ha completado el trabajo, el estado es SUCCEEDED.

  5. Una vez que el estado del trabajo cambió a SUCCEEDED, puede recuperar los resultados del trabajo desde Azure Blob Storage. El parámetro statusdir pasado con la consulta contiene la ubicación del archivo de salida; en este caso, /example/rest. Esta dirección almacena la salida en el directorio example/curl del almacenamiento predeterminado del clúster.

    Puede enumerar y descargar estos archivos mediante la CLI de Azure. Para más información acerca del uso de la CLI de Azure con Azure Storage, consulte el documento Uso de la CLI de Azure con Azure Storage.

Pasos siguientes

Para obtener información sobre otras formas en que puede trabajar con Hadoop en HDInsight:

Para obtener más información sobre la API de REST usada en este documento, consulte el documento WebHCat reference (Referencia de WebHCat).