Optimización de Apache Hive con Apache Ambari en Azure HDInsight

Apache Ambari es una interfaz web para administrar y supervisar clústeres de HDInsight. Para más información sobre el uso de la interfaz de usuario web de Ambari, consulte Administración de clústeres de HDInsight con la interfaz de usuario web de Apache Ambari.

En las siguientes secciones se describen las opciones de configuración para optimizar el rendimiento general de Apache Hive.

  1. Para modificar los parámetros de configuración de Hive, seleccione Hive de la barra lateral Servicios.
  2. Navegue hasta la pestaña Configs (Configuraciones).

Establecer el motor de ejecución de Hive

Hive proporciona dos motores de ejecución: MapReduce de Apache Hadoop y Apache TEZ. Tez es más rápido que MapReduce. Tez es el motor de ejecución predeterminado de los clústeres de HDInsight Linux. Para cambiar el motor de ejecución:

  1. En la pestaña Configs (Configuraciones) de Hive, escriba motor de ejecución en el cuadro de filtro.

    Apache Ambari Search execution engine.

  2. El valor predeterminado de la propiedad Optimización es Tez.

    Optimization - Apache Tez engine.

Optimizar asignadores

Hadoop intenta dividir (asignar) un único archivo en varios archivos y procesar los archivos resultantes en paralelo. El número de asignadores depende del número de divisiones. Los siguientes dos parámetros de configuración controlan el número de divisiones del motor de ejecución Tez:

  • tez.grouping.min-size: límite inferior en el tamaño de una división agrupada, con un valor predeterminado de 16 MB (16 777 216 bytes).
  • tez.grouping.max-size: límite superior en el tamaño de una división agrupada, con un valor predeterminado de 1 GB (1 073 741 824 bytes).

Como directriz de rendimiento, disminuya estos dos parámetros para mejorar la latencia y aumentar el rendimiento.

Por ejemplo, para establecer cuatro tareas de asignador para un tamaño de datos de 128 MB, debe establecer cada uno de estos parámetros en 32 MB (33 554 432 bytes).

  1. Para modificar los parámetros de límite, navegue a la pestaña Configs (Configuraciones) del servicio Tez. Expanda el panel General y busque los parámetros tez.grouping.max-size y tez.grouping.min-size.

  2. Establezca ambos parámetros en 33 554 432 bytes (32 MB).

    Apache Ambari Tez grouping sizes.

Estos cambios afectan a todos los trabajos de Tez en el servidor. Para obtener un resultado óptimo, elija valores de parámetro adecuados.

Optimizar reductores

Apache ORC y Snappy ofrecen un alto rendimiento. Sin embargo, es posible que Hive tenga muy pocos reductores de forma predeterminada, y provoque cuellos de botella.

Por ejemplo, supongamos que tiene un tamaño de datos de entrada de 50 GB. Esos datos en formato ORC con compresión Snappy tiene un tamaño de 1 GB. Hive estima el número de reductores necesarios según esta fórmula: (número de bytes de entrada para los asignadores/hive.exec.reducers.bytes.per.reducer).

Con la configuración predeterminada, este ejemplo es de cuatro reductores.

El parámetro hive.exec.reducers.bytes.per.reducer especifica el número de bytes procesados por reductor. El valor predeterminado es de 64 MB. Ajustar este valor a la baja aumenta el paralelismo y puede mejorar el rendimiento. Ajustarlo demasiado a la baja también podría generar demasiados reductores y afectar negativamente al rendimiento. Este parámetro se basa en sus requisitos de datos específicos, la configuración de compresión y otros factores del entorno.

  1. Para modificar el parámetro, navegue hasta la pestaña Configs (Configuraciones) de Hive y busque el parámetro Data per Reducer (Datos por reductor) en la página Configuración.

    Apache Ambari Data per Reducer.

  2. Seleccione Editar para modificar el valor a 128 MB (134 217 728 bytes) y, a continuación, presione ENTRAR para guardar los cambios.

    Ambari Data per Reducer - edited.

    Dado un tamaño de entrada de 1024 MB, con 128 MB de datos por reductor, hay ocho reductores (1024/128).

  3. Un valor incorrecto para el parámetro Data per Reducer (Datos por reductor) puede dar lugar a un gran número de reductores, lo que afectaría negativamente al rendimiento de las consultas. Para limitar el número máximo de reductores, establezca hive.exec.reducers.max en un valor adecuado. El valor predeterminado es 1009.

Habilitar la ejecución en paralelo

Una consulta de Hive se ejecuta en una o varias fases. Si las fases independientes se pueden ejecutar en paralelo, aumentará el rendimiento de las consultas.

  1. Para habilitar la ejecución de consultas en paralelo, navegue hasta la pestaña Configs (Configuraciones) de Hive y busque la propiedad hive.exec.parallel. El valor predeterminado es false. Cambie el valor a true y, a continuación, presione ENTRAR para guardar el valor.

  2. Para limitar el número de trabajos que se van a ejecutar en paralelo, modifique la propiedad hive.exec.parallel.thread.number. El valor predeterminado es 8.

    Apache Hive exec parallel display.

Habilitar la vectorización

Hive procesa los datos fila por fila. La vectorización dirige Hive para que procese los datos en bloques de 1024 filas en lugar de hacerlo fila por fila. La vectorización solo es aplicable al formato de archivo ORC.

  1. Para habilitar la ejecución de consultas vectorizadas, navegue hasta la pestaña Configs (Configuraciones) de Hive y busque el parámetro hive.vectorized.execution.enabled. El valor predeterminado es true para Hive 0.13.0 o posterior.

  2. Para habilitar la ejecución vectorizada para el lado de reducción de la consulta, establezca el parámetro hive.vectorized.execution.reduce.enabled en true. El valor predeterminado es false.

    Apache Hive vectorized execution.

Habilitar la optimización basada en costos (CBO)

De forma predeterminada, Hive sigue un conjunto de reglas para buscar un plan de ejecución de consultas óptimo. La optimización basada en costos (CBO) evalúa varios planes para ejecutar una consulta. Luego asigna un costo a cada plan y, a continuación, determina el plan más barato para ejecutar una consulta.

Para habilitar CBO, vaya a Hive>Configs>Settings (Hive > Configuraciones > Configuración) y busque Enable Cost Based Optimizer (Habilitar optimizador basado en el costo) y, a continuación, cambie el botón de alternancia a On (Activado).

HDInsight cost-based optimizer.

Los siguientes parámetros de configuración adicionales aumentan el rendimiento de las consulta de Hive cuando CBO está habilitado:

  • hive.compute.query.using.stats

    Si se establece en true, Hive usa las estadísticas almacenadas en su Metastore para responder a consultas simples como count(*).

    Apache Hive compute query using stats.

  • hive.stats.fetch.column.stats

    Las estadísticas de columnas se crean cuando se habilita CBO. Hive usa estadísticas de columnas, que se almacenan en Metastore, para optimizar las consultas. Capturar estadísticas de columnas para cada columna tarda más tiempo cuando el número de columnas es elevado. Si se establece en false, este valor deshabilita la captura de estadísticas de columnas de Metastore.

    Apache Hive stats set column stats.

  • hive.stats.fetch.partition.stats

    Las estadísticas de partición básicas, como el número de filas, el tamaño de datos y el tamaño de archivo se almacenan en Metastore. Si se establece en true, las estadísticas de partición se capturan de Metastore. Cuando es false, el tamaño del archivo se captura desde el sistema de archivos. Y el número de filas se captura del esquema de fila.

    Hive stats set partition stats.

Consulte la entrada de blog Hive Cost Based Optimization (Optimización basada en costos de Hive) en Analytics en el blog de Azure para más información.

Habilitar la compresión intermedia

Las tareas de asignación crean archivos intermedios que se usan en las tareas de reductor. La compresión intermedia reduce el tamaño de los archivos intermedios.

Los trabajos de Hadoop suelen ser un cuello de botella de E/S. La compresión de datos puede acelerar la E/S y transferencia de red en general.

Los tipos de compresión disponibles son:

Formato Herramienta Algoritmo Extensión de archivo ¿Divisible?
Gzip Gzip DEFLATE .gz No
Bzip2 Bzip2 Bzip2 .bz2
LZO Lzop LZO .lzo Sí, si está indexado
Snappy N/D Snappy Snappy No

Como norma general, es importante tener un método de compresión divisible, ya que, de lo contrario, se crearán pocos mapeadores. Si los datos de entrada son texto, bzip2 es la mejor opción. Para el formato ORC, Snappy es la opción de compresión más rápida.

  1. Para habilitar la compresión intermedia, navegue hasta la pestaña Configs (Configuraciones) de Hive y, a continuación, establezca el parámetro hive.exec.compress.intermediate en true. El valor predeterminado es false.

    `Hive exec compress intermediate`.

    Nota:

    Para comprimir archivos intermedios, elija un códec de compresión con un costo de CPU más bajo, aunque el códec no tenga una salida de compresión alta.

  2. Para establecer el códec de compresión intermedio, agregue la propiedad personalizada mapred.map.output.compression.codec al archivo hive-site.xml o mapred-site.xml.

  3. Para agregar un valor personalizado:

    a. Vaya a Hive>Configs>Advanced>Custom hive-site (Hive > Configuraciones > Avanzadas > Sitio de Hive personalizado).

    b. Seleccione Add Property... (Agregar propiedad) en la parte inferior del panel Custom hive-site (Sitio de Hive personalizado).

    c. En la ventana Agregar propiedad, escriba mapred.map.output.compression.codec como la clave y org.apache.hadoop.io.compress.SnappyCodec como el valor.

    d. Seleccione Agregar.

    `Apache Hive custom property add`.

    Este valor comprimirá el archivo intermedio mediante la compresión Snappy. Una vez agregada, la propiedad aparece en el panel Custom hive-site (Sitio de Hive personalizado).

    Nota

    Este procedimiento modifica el archivo $HADOOP_HOME/conf/hive-site.xml.

Comprimir la salida final

También es posible comprimir la salida final de Hive.

  1. Para habilitar la salida final de Hive, navegue hasta la pestaña Configs (Configuraciones) de Hive y, a continuación, establezca el parámetro hive.exec.compress.output en true. El valor predeterminado es false.

  2. Para elegir el códec de compresión de salida, agregue la propiedad personalizada mapred.output.compression.codec al panel Custom hive-site (Sitio de Hive personalizado), como se describe en el paso 3 de la sección anterior.

    Apache Hive custom property add2.

Habilitar de ejecución especulativa

La ejecución especulativa inicia un cierto número de tareas duplicadas para detectar y denegar la lista del seguimiento de tareas de ejecución lenta. A la vez mejora la ejecución general del trabajo mediante la optimización de los resultados de las tareas individuales.

La ejecución especulativa no debe activarse para las tareas MapReduce de ejecución prolongada con grandes cantidades de entradas.

  • Para habilitar la ejecución especulativa, navegue hasta la pestaña Configs (Configuraciones) de Hive y, a continuación, establezca el parámetro hive.mapred.reduce.tasks.speculative.execution en true. El valor predeterminado es false.

    `Hive mapred reduce tasks speculative execution`.

Optimizar las particiones dinámicas

Hive permite crear particiones dinámicas al insertar registros en una tabla, sin predefinir cada una de las particiones. Esta capacidad es una característica muy eficaz. Aunque, por otra parte, puede dar lugar a la creación de un gran número de particiones. También puede crear un gran número de archivos para cada partición.

  1. Para que Hive realice particiones dinámicas, el valor del parámetro hive.exec.dynamic.partition debe ser true (valor predeterminado).

  2. Cambie el modo de partición dinámica a strict. En modo strict, al menos una partición debe ser estática. Este valor impide las consultas sin filtro de partición en la cláusula WHERE, es decir, strict impide las consultas que examinan todas las particiones. Navegue hasta la pestaña Configs (Configuraciones) de Hive y, a continuación, establezca hive.exec.dynamic.partition.mode en strict. El valor predeterminado es nonstrict.

  3. Para limitar el número de particiones dinámicas que se va a crear, modifique el parámetro hive.exec.max.dynamic.partitions. El valor predeterminado es 5 000.

  4. Para limitar el número total de particiones dinámicas por nodo, modifique hive.exec.max.dynamic.partitions.pernode. El valor predeterminado es 2 000.

Habilitar el modo local

El modo local permite que Hive realice todas las tareas de un trabajo en una único máquina. A veces incluso en un único proceso. Este valor mejora el rendimiento de las consultas si los datos de entrada son pequeños y la sobrecarga que supone el inicio de las tareas para las consultas, consume un porcentaje significativo de la ejecución de la consulta global.

Para habilitar el modo local, agregue el parámetro hive.exec.mode.local.auto al panel Custom hive-site (Sitio de Hive personalizado), como se explica en el paso 3 de la sección Habilitar la compresión intermedia.

Apache Hive exec mode local auto.

Establecer una consulta MultiGROUP BY de MapReduce única

Cuando esta propiedad está establecida en true, una consulta MultiGROUP BY con claves de agrupación comunes genera un único trabajo de MapReduce.

Para habilitar el comportamiento, agregue el parámetro hive.multigroupby.singlereducer al panel Custom hive-site (Sitio de Hive personalizado), como se explica en el paso 3 de la sección Habilitar la compresión intermedia.

Hive set single MapReduce MultiGROUP BY.

Optimizaciones de Hive adicionales

En las secciones siguientes se describen las optimizaciones adicionales relacionadas con Hive que puede establecer.

Unir optimizaciones

El tipo de unión predeterminado en Hive es una unión aleatoria. En Hive, asignadores especiales leen la entrada y emiten un par de clave-valor de unión a un archivo intermedio. Hadoop ordena y combina estos pares en una fase aleatoria. Esta fase aleatoria es costosa. Al seleccionar la unión correcta en función de los datos puede mejorar significativamente el rendimiento.

Tipo de unión Si Cómo Configuración de Hive Comentarios
Unión aleatoria
  • Opción predeterminada
  • Siempre funciona
  • Lee parte de una de las tablas
  • Cubos y ordenaciones por clave de unión
  • Envía un cubo a cada elemento reduce
  • La unión se realiza en el elemento Reduce
No se requiere ninguna configuración de Hive importante Funciona siempre
Unión de asignación
  • Una tabla puede caber en memoria
  • Lee una tabla pequeña en la tabla de hash en memoria
  • Transmite parte del archivo de gran tamaño
  • Une todos los registros de la tabla de hash
  • Las uniones las realiza el asignador solamente
hive.auto.confvert.join=true Acción rápida, pero limitada
Ordenar el cubo de fusión mediante combinación Si ambas tablas están:
  • Ordenadas igual
  • Incluidas en cubos iguales
  • Unión de la columna/incluida en cubos
Cada proceso:
  • Lee un cubo de cada tabla.
  • Procesa la fila con el valor más bajo.
hive.auto.convert.sortmerge.join=true Eficaz

Optimizaciones del motor de ejecución

Recomendaciones adicionales para optimizar el motor de ejecución de Hive:

Configuración Recomendado Valor predeterminado de HDInsight
hive.mapjoin.hybridgrace.hashtable True = más seguro y más lento; false = más rápido false
tez.am.resource.memory.mb Límite superior de 4 GB para la mayor parte Ajustado automáticamente
tez.session.am.dag.submit.timeout.secs 300+ 300
tez.am.container.idle.release-timeout-min.millis 20000+ 10000
tez.am.container.idle.release-timeout-max.millis 40000+ 20000

Pasos siguientes