Notas del estudio de Hive (cuatro) artículos de optimización 1

El ajuste de HiveQL es necesario para que los hermanos que a menudo usan HQL para el desarrollo de datos comprendan el libro. Aprenda los detalles de implementación detrás de hive y cómo usar hive de manera más eficiente. Creo que esto también es necesario entender. Ya sea en la entrevista o en el proceso de desarrollo, jugará un papel importante.
La versión de la colmena utilizada aquí es: 2.3.0

1 Utilice EXPLICAR

Explique puede imprimir el plan de ejecución de hive, lo que puede ayudarnos a comprender cómo hive convierte las declaraciones de consulta en tareas de MapReduce.

Uso: agregue explicar delante de la declaración hql

explain select sum(num) from bucket_num;

Resultados del:

STAGE DEPENDENCIES:
  Stage-1 is a root stage
  Stage-0 depends on stages: Stage-1

STAGE PLANS:
  Stage: Stage-1
    Map Reduce
      Map Operator Tree:
          TableScan
            alias: bucket_num
            Statistics: Num rows: 28 Data size: 114 Basic stats: COMPLETE Column stats: NONE
            Select Operator
              expressions: num (type: int)
              outputColumnNames: num
              Statistics: Num rows: 28 Data size: 114 Basic stats: COMPLETE Column stats: NONE
              Group By Operator
                aggregations: sum(num)
                mode: hash
                outputColumnNames: _col0
                Statistics: Num rows: 1 Data size: 8 Basic stats: COMPLETE Column stats: NONE
                Reduce Output Operator
                  sort order: 
                  Statistics: Num rows: 1 Data size: 8 Basic stats: COMPLETE Column stats: NONE
                  value expressions: _col0 (type: bigint)
      Reduce Operator Tree:
        Group By Operator
          aggregations: sum(VALUE._col0)
          mode: mergepartial
          outputColumnNames: _col0
          Statistics: Num rows: 1 Data size: 8 Basic stats: COMPLETE Column stats: NONE
          File Output Operator
            compressed: false
            Statistics: Num rows: 1 Data size: 8 Basic stats: COMPLETE Column stats: NONE
            table:
                input format: org.apache.hadoop.mapred.SequenceFileInputFormat
                output format: org.apache.hadoop.hive.ql.io.HiveSequenceFileOutputFormat
                serde: org.apache.hadoop.hive.serde2.lazy.LazySimpleSerDe

  Stage: Stage-0
    Fetch Operator
      limit: -1
      Processor Tree:
        ListSink

Time taken: 0.268 seconds, Fetched: 44 row(s)
  1. A partir de los resultados del plan de ejecución: puede ver el nombre de la tabla: número_de_cubo, nombre del campo: num, tipo de datos: int y la función agregada sum ().
  2. Una tarea de colmena contendrá una o más etapas, y las diferentes etapas tendrán dependencias mutuas. Cuanto más compleja sea la consulta, por lo general, más etapas, y llevará más tiempo completarla. Una etapa puede ser una tarea de MapReduce, una etapa de muestreo, una etapa de fusión o una etapa límite. De forma predeterminada, hive ejecutará una etapa de ciervo.
  3. PLAN DE ETAPA
    Etapa-1: Contiene la mayor parte del procesamiento del trabajo.
    Etapa-0: Esta declaración es una etapa sin ningún orden de operación en esta etapa.
    Árbol del operador del mapa: el comienzo de la etapa del mapa.
    Reducir el árbol del operador: el comienzo de la etapa de reducción
    _col0: Este es un resultado temporal derivado del nombre del campo.
    4) Comprender el análisis de hive de cada consulta es una buena manera de analizar consultas complejas y ejecución ineficiente.
    5) Hay una forma más detallada, puede comparar:
explain extended select sum(num) from bucket_num;

2 Ajuste de límite

El ajuste de límite se refiere a: cuando ejecutamos la sentencia de consulta, necesitamos consultar la sentencia completa y devolver el resultado, esta situación es una pérdida de tiempo, por lo que debemos evitar esta situación tanto como sea posible. Por lo tanto, Hive tiene un atributo que se puede activar. Cuando se usa la declaración de límite, se puede muestrear su declaración:

<prperty>
	<name>hive.limit.optimize.enable</name>
	<value>true</value>
</property>

Entonces, una vez que la función está activada, también puede establecer el número de filas y el número de archivos que se muestrearán

<prperty>
	<name>hive.limit.row.max.size</name>
	<value>10000</value>
</property>
<prperty>
	<name>hive.limit.optimit.limit.file</name>
	<value>10</value>
</property>

Aunque la función es buena, también tiene desventajas, dado que es posible que el muestreo aleatorio no pueda procesar los datos útiles, puede producir resultados diferentes cada vez que opere otras funciones agregadas.

Recorte de 3 columnas y recorte de partición

Para decirlo sin rodeos, el recorte de columna significa que solo se verifica la columna correspondiente cuando se ejecuta la instrucción de consulta. El
recorte de zona también solo consulta la partición correspondiente.

Cuando hay muchas columnas o una gran cantidad de datos, si selecciona * o no especifica particiones, la eficiencia del escaneo de columna completa y el escaneo de tabla completo es muy baja. El elemento de configuración relacionado con la optimización del recorte de columna en Hive es hive.optimize .cp, que está relacionado con el recorte de particiones. La optimización relacionada es hive.optimize.pruner, que es verdadera por defecto. En la fase de análisis de HiveQL, corresponde al optimizador lógico ColumnPruner.

4 Empuje hacia abajo de predicados

Impulsión de predicado, este concepto también existe en bases de datos relacionales, y ahora también existe en declaraciones HQL, lo que significa que la declaración de predicado de la consulta de condición de filtro se ejecuta de antemano para reducir la cantidad de datos a consultar.

select a.uid,a.event_type,b.topic_id,b.title
from calendar_record_log a
left outer join (
  select uid,topic_id,title from forum_topic
  where pt_date = 20190224 and length(content) >= 100
) b on a.uid = b.uid
where a.pt_date = 20190224 and status = 0;

La oración para filtrar forum_topic se escribe dentro de la subconsulta, no afuera. Hive tiene el elemento de configuración hive.optimize.ppd para la optimización de inserción de predicados, el valor predeterminado es verdadero y el optimizador lógico correspondiente es PredicatePushDown. El optimizador debe elevar el FilterOperator en OperatorTree, como se muestra en la figura siguiente.
Inserte la descripción de la imagen aquí
Como se muestra en la figura: La ubicación de FIL (9) ahora se ha mencionado anteriormente. La ventaja de esto es que puede filtrar una parte de los datos originales, mejorando así la eficiencia de la consulta. Por supuesto, tal consulta puede no ser correcto para el resultado Sí, el significado estricto del predicado depende de la situación.
Puede consultar este artículo para dar una introducción detallada a los cuatro movimientos de predicados hacia abajo: https://blog.csdn.net/pengzonglu7292/article/details/81036712

5 ordenar por 代替 ordenar por

1) El método de clasificación de ordenar por, que se clasifica globalmente como otros dialectos SQL. En este caso, todos los datos en el lado del mapa entrarán en el lado de reducción. Si la cantidad de datos es grande, esto aumentará la cantidad de cálculo en el lado del reductor, e incluso puede haber tiempo de inactividad.
Si tiene que usar el orden por, debe estar en modo estricto. En este modo, y use con límite para limitar el número de elementos, el orden por no se ordenará globalmente (esto no se recomienda)
set hive.mapred.mode = estricto;

2) El método de clasificación de clasificación por es clasificación parcial Dependiendo de la situación, se activarán múltiples reductores para clasificar y cada reductor se ordenará internamente. Para controlar la clave asignada al reductor de los datos del lado del mapa, a menudo se usa junto con distribuir por. La función de distribuir por es distribuir a diferentes reductores de acuerdo con ciertas reglas, y los datos en el lado del mapa no se distribuirán aleatoriamente a los reductores.

select uid,upload_time,event_type,record_data
from calendar_record_log
where pt_date >= 20190201 and pt_date <= 20190224
distribute by uid
sort by upload_time desc,event_type desc;

Seis grupos por configuración

Echemos un vistazo al principio de agrupación por agregación: cuando
Inserte la descripción de la imagen aquí
agrupa por, si inicia un combinador para realizar una agregación previa parcial en el lado del mapa, puede reducir efectivamente la cantidad de datos aleatorios. El elemento de configuración agregado previamente es hive.map.aggr, el valor predeterminado es verdadero y el optimizador correspondiente es GroupByOptimizer, que es simple y conveniente.
A través del parámetro hive.groupby.mapaggr.checkinterval, también puede establecer el umbral para el número de filas agregadas previamente en el lado del mapa. Si se excede este valor, el trabajo se dividirá. El valor predeterminado es 100000.

Por supuesto, en el grupo por, si la cantidad de datos para algunos valores clave es demasiado grande, se producirá un sesgo de datos. Para esto, Hive tiene su propia función de balance: el valor predeterminado es falso
hive.groupby.skewindata = true
El método de implementación es iniciar dos trabajos de MR durante el grupo. El primer trabajo ingresará aleatoriamente los datos del lado del mapa en el reductor, y cada reductor se agregará parcialmente y la misma clave se distribuirá en diferentes reductores. El segundo trabajo agrega los datos preprocesados ​​previamente por clave y genera el resultado, que tiene un efecto equilibrado.
Sin embargo, el elemento de configuración está muerto después de todo y, a veces, no puede resolver el problema fundamentalmente. Por lo tanto, se recomienda que comprenda los detalles del sesgo de datos por sí mismo y optimice la declaración de consulta.

Supongo que te gusta

Origin blog.csdn.net/u013963379/article/details/90183073
Recomendado
Clasificación