Cómo configurar el número de mapas en Hive
1. Normalmente, un trabajo generará uno o más trabajos de mapas desde el directorio de entrada.
Los principales factores determinantes incluyen: el número total de archivos en la entrada, el tamaño del archivo de entrada y el tamaño de bloque establecido por el clúster (actualmente 128 M, que se puede ver en Hive a través del conjunto dfs.block). .size; comando y no se puede personalizar);
2. Ejemplo:
a) Supongamos que hay 1 archivo a en el directorio de entrada con un tamaño de 780 M, entonces hadoop se dividirá. archiva a en 7 bloques (6 bloques de 128 m y 1 bloque de 12 m), lo que da como resultado 7 números de mapeo
b) Supongamos que hay 3 archivos a, b, c en el directorio de entrada, con tamaños de 10 m, 20 m y 130 m respectivamente, luego hadoop los dividirá en 4 bloques (10 m, 20 m, 128 m, 2 m), lo que dará como resultado 4 números de mapeo
Es decir, si el archivo es más grande que el bloque. tamaño (128 m), el archivo se dividirá; si el archivo es más pequeño que el tamaño del bloque, el archivo se tratará como un solo bloque.
3. ¿Cuantos más mapas, mejor?
La respuesta es no. Si una tarea tiene muchos archivos pequeños (mucho más pequeños que el tamaño del bloque de 128 m), cada archivo pequeño también se considerará un bloque y habrá una tarea de mapeo que completar.
Y el inicio de una tarea de mapeo y El tiempo de inicialización es mucho más largo que el tiempo de procesamiento lógico, lo que provocará una gran pérdida de recursos.
Y el número de tareas de mapeo que se pueden realizar simultáneamente es limitado.
4. ¿Se garantiza que cada asignación manejará cerca de 128 millones de bloques de archivos y nada más?
La respuesta es no necesariamente. Por ejemplo, hay un archivo de 127 m. Normalmente, se utilizará un mapa para completarlo. Sin embargo, este archivo solo tiene uno o dos campos pequeños, pero tiene decenas de millones de registros.
Si el mapa. La lógica de procesamiento es más compleja y usar una tarea de mapa para hacerlo definitivamente llevará más tiempo.
Para los problemas 3 y 4 anteriores, debemos tomar dos métodos para resolverlos: reducir la cantidad de mapas y aumentar la cantidad de mapas;
Cómo fusionar archivos pequeños y reducir ¿El número de mapas?
Supongamos que hay una tarea SQL:
Seleccione count(1) de popt_tbaccountcopy_mes donde pt = '2012-07-04';
Directorio de entrada de tarea/ group/p_sdoo_data/p_sdoo_data_etl/pt/popt_tbaccountcopy_mes/pt=2012-07-04
***** tiene 194 archivos, muchos de los cuales son mucho más pequeños que 128 m, con un tamaño total de 9G, normal La ejecución utilizará 194 tareas de mapeo.
Mapa total *** Recursos informáticos consumidos: min.split.size.per.rack=100000000;
set hive.input.format=org: SLOTS_MILLIS_MAPS= 333,500
Para esta sencilla tarea SQL, el tiempo de ejecución puede ser aproximadamente el mismo, pero ahorra la mitad de los recursos informáticos.
Para una explicación aproximada, 100000000 significa 100M, configure hive.input.format=org.apache.hadoop.hive.ql.io.CombineHiveInputFormat= 100M.
CombineHiveInputFormat; este parámetro indica la fusión de archivos pequeños antes de la ejecución
Los primeros tres parámetros determinan el tamaño de los bloques de archivos fusionados. Los tamaños de bloques de archivos mayores a 128 m se separan según 128 m, y los archivos menores a 128 m se separan según. a 128 m Para separar, los de más de 100 m se separan según 100 m, y los de menos de 100 m (incluidos los archivos pequeños y los separados de otros archivos grandes) se fusionan y finalmente se generan 74 bloques.
¿Cómo aumentar adecuadamente el número de mapas?
Cuando el archivo de entrada es muy grande, la lógica de la tarea es compleja y la velocidad de ejecución del mapeo es muy lenta, puede considerar aumentar el número de mapeos para reducir la cantidad de datos procesados por cada mapeo. mejorando así la eficiencia de la ejecución de tareas.
Supongamos que existe una tarea de este tipo:
Seleccione data_desc,
count(1),
count(distinct id),
p>
suma(caso cuando...),
suma(caso cuando...),
suma(caso cuando... ),
suma(caso cuando...). cuando...)
suma(...)
de un grupo por data_desc p>
Si la tabla a tiene solo un archivo con un tamaño de 120 M, pero contiene decenas de millones de registros, definitivamente llevará mucho tiempo usar un mapa para completar esta tarea. En este caso, debemos considerar la división. este archivo en varios archivos.
De esta manera, se pueden utilizar varias tareas de mapa para completar esta tarea.
establecer mapred.reduce.tasks=10;
crear la tabla a_1 como
select * from a
distribuir por rand(123 );
Esto asignará aleatoriamente los registros de la tabla a a la tabla a_1 que contiene los 10 archivos de la tabla a_1, y luego reemplazará la tabla a con a_1 en el sql anterior, lo que requerirá 10 tareas de mapa para completarse.
Cada tarea de mapeo procesa más de 12 millones de datos (varios millones de registros) y la eficiencia es, sin duda, mucho mayor.
Parece que hay alguna contradicción entre los dos. Uno es fusionar archivos pequeños y el otro es dividir archivos grandes en archivos pequeños. Esto es exactamente en lo que hay que centrarse.
Según la situación real, el control del número de mapas debe seguir dos principios: permitir que grandes volúmenes de datos utilicen un número adecuado de mapas; permitir que una sola tarea de mapa procese una cantidad adecuada de datos;