Configurar una tabla de Hive para ejecutar comandos de Hive - Amazon EMR

Configurar una tabla de Hive para ejecutar comandos de Hive

Apache Hive es una aplicación de almacenamiento de datos que se puede utilizar para consultar los datos contenidos en es de Amazon EMR con un lenguaje de tipo SQL. Para obtener más información acerca de Hive, consulte http://hive.apache.org.

El siguiente procedimiento supone que ya ha creado un clúster y especificado un par de claves de Amazon EC2. Para obtener información sobre cómo empezar a crear clústeres, consulte Introducción a Amazon EMR en la Guía de administración de Amazon EMR.

Configuración de Hive para usar MapReduce

Cuando se usa Hive en Amazon EMR para consultar tablas de DynamoDB, se pueden producir errores si Hive usa el motor de ejecución predeterminado, Tez. Por este motivo, cuando cree un clúster con Hive que se integre con DynamoDB tal como se describe en esta sección, le recomendamos que use una clasificación de configuración que configure Hive para usar MapReduce. Para obtener más información, consulte Configuración de aplicaciones.

El siguiente fragmento de código muestra la clasificación de configuración y la propiedad que se deben usar para configurar MapReduce como el motor de ejecución de Hive:

[ { "Classification": "hive-site", "Properties": { "hive.execution.engine": "mr" } } ]
Para ejecutar comandos de Hive de forma interactiva
  1. Conecte al nodo principal. Para obtener más información, consulte Conexión al nodo maestro mediante SSH en la Guía de administración de Amazon EMR.

  2. En el símbolo del sistema de comandos para el nodo principal, escriba hive.

    Debería ver un símbolo del sistema de Hive: hive>

  3. Escriba un comando de Hive que asigna una tabla en la aplicación de Hive a los datos de DynamoDB. Esta tabla actúa como una referencia para los datos almacenados en Amazon DynamoDB; los datos no se almacenan localmente en Hive y las consultas que utilizan esta tabla se ejecutan frente a los datos en vivo en DynamoDB, consumiendo capacidad de lectura o escritura de la tabla cada vez que se ejecuta un comando. Si espera ejecutar varios comandos de Hive respecto al mismo conjunto de datos, plantéese en primer lugar la opción de exportar.

    A continuación, se muestra la sintaxis para el mapeo de una tabla de Hive a una tabla de DynamoDB.

    CREATE EXTERNAL TABLE hive_tablename (hive_column1_name column1_datatype, hive_column2_name column2_datatype...) STORED BY 'org.apache.hadoop.hive.dynamodb.DynamoDBStorageHandler' TBLPROPERTIES ("dynamodb.table.name" = "dynamodb_tablename", "dynamodb.column.mapping" = "hive_column1_name:dynamodb_attribute1_name,hive_column2_name:dynamodb_attribute2_name...");

    Al crear una tabla en Hive desde DynamoDB, debe crearla como tabla externa mediante la palabra clave EXTERNAL. La diferencia entre las tablas internas y externas es que los datos en tablas internas se eliminan cuando se anula una tabla interna. Este no es el comportamiento deseado cuando hay conexión a Amazon DynamoDB y, por lo tanto, solo se admiten las tablas externas.

    Por ejemplo, el siguiente comando de Hive crea una tabla denominada hivetable1 en Hive que hace referencia a la tabla de DynamoDB denominada dynamodbtable1. La tabla de DynamoDB dynamodbtable1 tiene un esquema de clave principal hash y de rango. El elemento de clave hash es name (tipo cadena), el elemento de clave de rango es year (tipo numérico) y cada elemento tiene un valor de atributo para holidays (tipo conjunto de cadenas).

    CREATE EXTERNAL TABLE hivetable1 (col1 string, col2 bigint, col3 array<string>) STORED BY 'org.apache.hadoop.hive.dynamodb.DynamoDBStorageHandler' TBLPROPERTIES ("dynamodb.table.name" = "dynamodbtable1", "dynamodb.column.mapping" = "col1:name,col2:year,col3:holidays");

    La línea 1 utiliza la instrucción CREATE EXTERNAL TABLE de HiveQL. Para hivetable1, debe establecer una columna para cada par de atributos nombre-valor en la tabla de DynamoDB y proporcionar el tipo de datos. Estos valores no distinguen entre mayúsculas y minúsculas y puede proporcionar a las columnas cualquier nombre (excepto palabras reservadas).

    La línea 2 utiliza la instrucción STORED BY. El valor STORED BY es el nombre de la clase que se encarga de la conexión entre Hive y DynamoDB. Debe definirse en 'org.apache.hadoop.hive.dynamodb.DynamoDBStorageHandler'.

    La línea 3 utiliza la instrucción TBLPROPERTIES para asociar "hivetable1" con la tabla y el esquema correctos en DynamoDB. Proporcione a TBLPROPERTIES valores para el parámetro dynamodb.table.name y el parámetro dynamodb.column.mapping. Estos valores distinguen entre mayúsculas y minúsculas.

    nota

    Todos los nombres de atributos de DynamoDB de la tabla deben tener las columnas correspondientes en la tabla de Hive. En función de la versión de Amazon EMR, se producen las siguientes situaciones si el mapeo de uno a uno no existe:

    • En la versión 5.27.0 de Amazon EMR y posteriores, el conector tiene validaciones que garantizan un mapeo uno a uno entre los nombres de atributos de DynamoDB y las columnas de la tabla de Hive. Se producirá un error si el mapeo uno a uno no existe.

    • En la versión 5.26.0 de Amazon EMR y anteriores, la tabla de Hive no incluirá el par nombre-valor de DynamoDB. Si no asigna los atributos de clave principal de DynamoDB, Hive devuelve un error. Si no asigna un atributo de clave no principal, no se genera ningún error, pero no verá los datos en la tabla de Hive. Si los tipos de datos no coinciden, el valor es nulo.

A continuación, puede comenzar a ejecutar operaciones de Hive en hivetable1. Las consultas que se ejecutan en hivetable1 se ejecutan internamente en la tabla de DynamoDB dynamodbtable1 de su cuenta de DynamoDB, y consumen unidades de lectura o escritura con cada ejecución.

Cuando ejecuta consultas de Hive frente a una tabla de DynamoDB, debe asegurarse de que ha aprovisionado una cantidad suficiente de unidades de capacidad de lectura.

Por ejemplo, suponga que ha aprovisionado 100 unidades de capacidad de lectura para su tabla de DynamoDB. Esto le permite realizar 100 lecturas o 409 600 bytes, por segundo. Si dicha tabla contiene 20 GB de datos (21 474 836 480 bytes) y la consulta de Hive realiza un análisis completo de la tabla, puede calcular aproximadamente cuánto tardará la consulta en ejecutarse:

21 474 836 480 / 409 600 = 52 429 segundos = 14,56 horas

La única forma de reducir el tiempo necesario, sería ajustar las unidades de capacidad de lectura en el origen de la tabla de DynamoDB. Agregar más nodos de Amazon EMR no le ayudará.

En la salida de Hive, el porcentaje completado se actualiza cuando finalizan uno o varios procesos de mapeador. Para una tabla de DynamoDB grande con un ajuste bajo de capacidad de lectura aprovisionada, la salida de porcentaje de finalización podría no actualizarse durante mucho tiempo; en el caso anterior, el trabajo aparecerá con un 0% completo durante varias horas. Para ver un estado más detallado del progreso del trabajo, acceda a la consola de Amazon EMR; podrá ver el estado de la tarea de asignador individual y estadísticas de lecturas de datos. También puede iniciar sesión en la interfaz de usuario de Hadoop en el nodo principal y ver las estadísticas de Hadoop. Esto le mostrará el estado de tareas de mapeo individuales y algunos datos de estadísticas de lectura. Para obtener más información, consulte los temas siguientes:

Para obtener más información sobre las instrucciones de HiveQL de ejemplo para realizar tareas tales como la exportación o importación de datos desde DynamoDB y la unión de tablas, consulte Ejemplo de comandos de Hive para la exportación, importación y consulta de datos en DynamoDB.

Para cancelar una solicitud de Hive

Cuando se ejecuta una consulta de Hive, la respuesta inicial del servidor incluye el comando para cancelar la solicitud. Para cancelar la solicitud en cualquier momento del proceso, utilice Kill Command (Comando de cancelación) de la respuesta del servidor.

  1. Introduzca Ctrl+C para salir del cliente de línea de comando.

  2. En el símbolo del shell, introduzca el Kill Command (Comando de cancelación) de la respuesta inicial del servidor a su solicitud.

    También puede ejecutar el siguiente comando desde la línea de comandos del nodo principal para terminar el trabajo de Hadoop, donde job-id es el identificador del trabajo de Hadoop y se puede recuperar desde la interfaz de usuario de Hadoop.

    hadoop job -kill job-id

Tipos de datos para Hive y DynamoDB

En la siguiente tabla se muestran los tipos de datos de Hive disponibles, el tipo predeterminado de DynamoDB al que se corresponden y los tipos alternativos de DynamoDB a los que también se pueden asignar.

Tipo de Hive Tipo predeterminado de DynamoDB Tipos alternativos de DynamoDB
cadena

cadena (S)

bigint o doble

número (N)

binario

binario (B)

boolean

booleano (BOOL)

matriz lista (L)

conjunto de números (NS), un conjunto de cadenas (SS) o un conjunto de binarios (BS)

mapa <string,string> elemento

mapa (M)

mapa <string,?> mapa (M)
nulo (NULL)

Si desea escribir los datos de Hive como un correspondiente tipo alternativo de DynamoDB o si los datos de DynamoDB incluyen valores de atributo de un tipo alternativo de DynamoDB, puede especificar la columna y el tipo de DynamoDB con el parámetro dynamodb.type.mapping. En el siguiente ejemplo se muestra la sintaxis para especificar un mapeo de tipo alternativo.

CREATE EXTERNAL TABLE hive_tablename (hive_column1_name column1_datatype, hive_column2_name column2_datatype...) STORED BY 'org.apache.hadoop.hive.dynamodb.DynamoDBStorageHandler' TBLPROPERTIES ("dynamodb.table.name" = "dynamodb_tablename", "dynamodb.column.mapping" = "hive_column1_name:dynamodb_attribute1_name,hive_column2_name:dynamodb_attribute2_name...", "dynamodb.type.mapping" = "hive_column1_name:dynamodb_attribute1_datatype");

El parámetro de mapeo de tipos es opcional y solo tiene que especificarse para las columnas que utilizan tipos alternativos.

Por ejemplo, el siguiente comando de Hive crea una tabla denominada hivetable2 que hace referencia a la tabla dynamodbtable2 de DynamoDB. Es similar a hivetable1, salvo que asigna la columna col3 al tipo de conjunto de cadenas (SS).

CREATE EXTERNAL TABLE hivetable2 (col1 string, col2 bigint, col3 array<string>) STORED BY 'org.apache.hadoop.hive.dynamodb.DynamoDBStorageHandler' TBLPROPERTIES ("dynamodb.table.name" = "dynamodbtable2", "dynamodb.column.mapping" = "col1:name,col2:year,col3:holidays", "dynamodb.type.mapping" = "col3:SS");

En Hive, hivetable1 y hivetable2 son idénticos. Sin embargo, cuando los datos de esas tablas se escriben en sus correspondientes tablas de DynamoDB, dynamodbtable1 incluirá listas, mientras que dynamodbtable2 incluirá conjuntos de cadenas.

Si desea escribir valores null de Hive como atributos de tipo null de DynamoDB, puede hacerlo con el parámetro dynamodb.null.serialization. En el siguiente ejemplo se muestra la sintaxis para especificar la serialización null.

CREATE EXTERNAL TABLE hive_tablename (hive_column1_name column1_datatype, hive_column2_name column2_datatype...) STORED BY 'org.apache.hadoop.hive.dynamodb.DynamoDBStorageHandler' TBLPROPERTIES ("dynamodb.table.name" = "dynamodb_tablename", "dynamodb.column.mapping" = "hive_column1_name:dynamodb_attribute1_name,hive_column2_name:dynamodb_attribute2_name...", "dynamodb.null.serialization" = "true");

El parámetro de serialización null es opcional y se establece en false si no se especifica. Tenga en cuenta que los atributos null de DynamoDB se leen como valores null en Hive con independencia de la configuración del parámetro. Las colecciones de Hive con valores null solo pueden escribirse en DynamoDB si el parámetro de serialización null se especifica como true. De lo contrario, se produce un error de Hive.

El tipo bigint en Hive es igual al tipo long en Java y el tipo de doble de Hive es igual que el tipo doble de Java en términos de precisión. Esto significa que, si dispone de datos numéricos almacenados en DynamoDB con precisión superior a la disponible en los tipos de datos de Hive, el uso de Hive para exportar, importar o hacer referencia a los datos de DynamoDB podría dar lugar a una pérdida de precisión o un error en la consulta de Hive.

Las exportaciones del tipo binario desde DynamoDB a Amazon Simple Storage Service (Amazon S3) o HDFS se almacenan como cadena codificada en Base64. Si está importando datos desde Amazon S3 o HDFS al tipo binario de DynamoDB, deberían estar codificados como una cadena Base64.

Opciones de Hive

Puede definir las siguientes opciones de Hive para gestionar la transferencia de datos fuera de Amazon DynamoDB. Estas opciones solo persisten para la sesión de Hive actual. Si cierra el símbolo del sistema de Hive y vuelve a abrirlo más adelante en el clúster, estos ajustes habrán vuelto a los valores predeterminados.

Opciones de Hive Descripción
dynamodb.throughput.read.percent

Define la velocidad de las operaciones de lectura para mantener la tasa de rendimiento aprovisionada de DynamoDB en el rango asignado para la tabla. El valor está entre 0.1 y 1.5, ambos incluidos.

El valor de 0,5 es la tasa de lectura predeterminada, lo que significa que Hive intentará consumir la mitad de la lectura aprovisionada a través de los recursos de la tabla. Al aumentar este valor por encima de 0,5 se aumenta la tasa de solicitud de lectura. Si se reduce el valor por debajo de 0,5 se reduce la tasa de solicitud de lectura. Esta tasa de lectura es aproximada. La tasa de lectura real dependerá de factores tales como el hecho de que exista una distribución uniforme de claves en DynamoDB.

Si encuentra que la operación de Hive suele superar el rendimiento aprovisionado o si el tráfico de lectura en directo se está demasiado limitado, entonces reduzca este valor por debajo de 0.5. Si dispone de suficiente capacidad y desea una operación de Hive más rápida, defina este valor por encima de 0.5. También puede suscribir en exceso definiendo este valor en 1,5 si cree que hay operaciones de entrada/salida sin utilizar disponibles.

dynamodb.throughput.write.percent

Establece la velocidad de las operaciones de escritura para mantener la tasa de rendimiento aprovisionada de DynamoDB en el rango asignado para la tabla. El valor está entre 0.1 y 1.5, ambos incluidos.

El valor de 0,5 es la tasa de escritura predeterminada, lo que significa que Hive intentará consumir la mitad de la escritura aprovisionada a través de los recursos de la tabla. Al aumentar este valor por encima de 0,5 se aumenta la tasa de solicitud de escritura. Si se reduce el valor por debajo de 0,5 se reduce la tasa de solicitud de escritura. Esta tasa de escritura es aproximada. La tasa de escritura real dependerá de factores tales como el hecho de que exista una distribución uniforme de claves en DynamoDB

Si encuentra que la operación de Hive suele superar el rendimiento aprovisionado o si el tráfico de escritura en directo se está demasiado limitado, entonces reduzca este valor por debajo de 0.5. Si dispone de suficiente capacidad y desea una operación de Hive más rápida, defina este valor por encima de 0.5. También puede suscribir en exceso definiendo este valor en 1,5 si cree que hay operaciones de entrada/salida sin utilizar disponibles o que estos son los datos iniciales cargados en la tabla y no hay tráfico activo todavía.

dynamodb.endpoint

Especifique el punto de conexión del servicio de DynamoDB. Para obtener más información sobre los puntos de conexión de DynamoDB disponibles, consulte Regiones y puntos de conexión.

dynamodb.max.map.tasks

Especifique el número máximo de tareas de asignación al leer datos desde DynamoDB. Este valor debe ser igual o superior a 1.

dynamodb.retry.duration

Especifique el número de minutos que utilizar como duración de tiempo de inactividad para volver a intentar ejecutar los comandos de Hive. Este valor debe ser un entero igual o superior a 0. El tiempo de espera predeterminado tiene una duración de dos minutos.

Estas opciones se establecen utilizando el comando SET tal y como se muestra en el siguiente ejemplo.

SET dynamodb.throughput.read.percent=1.0; INSERT OVERWRITE TABLE s3_export SELECT * FROM hiveTableName;