sql >> Base de Datos >  >> NoSQL >> HBase

Las 6 mejores técnicas de optimización de trabajos de MapReduce

El ajuste del rendimiento ayudará a optimizar su Hadoop actuación. En este blog, vamos a discutir todas esas técnicas para las optimizaciones de MapReduce Job.

En este tutorial de MapReduce, le proporcionaremos 6 consejos importantes para la optimización del trabajo de MapReduce, como la configuración adecuada de su clúster, el uso de compresión LZO, el ajuste adecuado de la cantidad de tareas de MapReduce, etc.

Consejos para la optimización de trabajos de MapReduce

A continuación, se incluyen algunas técnicas de optimización de trabajos de MapReduce que le ayudarán a optimizar el rendimiento del trabajo de MapReduce.

1. Configuración adecuada de su clúster

  • Con -noatime Se montan las opciones de almacenamiento Dfs y MapReduce. Esto deshabilitará el tiempo de acceso. Por lo tanto, mejora el rendimiento de E/S.
  • Intente evitar el RAID en las máquinas TaskTracker y datanode. Esto generalmente reduce el rendimiento.
  • Asegúrese de haber configurado mapred.local.dir y dfs.data.dir para apuntar a un directorio en cada uno de sus discos. Esto es para garantizar que se utilice toda su capacidad de E/S.
  • Debe monitorear el gráfico de uso de intercambio y uso de red con software. Si ve que se está utilizando el intercambio, debe reducir la cantidad de RAM asignada a cada tarea en mapred.child.java.opts .
  • Asegúrese de tener un control inteligente del estado de salud de sus unidades de disco. Esta es una de las prácticas importantes para  el ajuste del rendimiento de MapReduce.

2. Uso de compresión LZO

Para datos intermedios, esta siempre es una buena idea. Cada trabajo de Hadoop que genera una cantidad no despreciable de resultados de mapas se beneficiará de la compresión de datos intermedia con LZO.

Aunque LZO agrega un poco de sobrecarga a la CPU, ahorra tiempo al reducir la cantidad de E/S del disco durante la reproducción aleatoria.

Establecer mapred.compress.map.output a verdadero para habilitar la compresión LZO

3. Ajuste adecuado del número de tareas de MapReduce

  • En el trabajo de MapReduce, si cada tarea tarda entre 30 y 40 segundos o más, se reducirá la cantidad de tareas. El mapeador reductor  El proceso implica lo siguiente:primero, debe iniciar JVM (JVM cargado en la memoria). Entonces necesita inicializar JVM. Y después del procesamiento (asignador/reductor), debe desinicializar JVM. Y estas tareas de JVM son muy costosas. Supongamos un caso en el que el mapeador ejecuta una tarea solo durante 20-30 segundos. Para esto, necesitamos iniciar/iniciar/detener JVM. Esto puede tomar una cantidad considerable de tiempo. Por lo tanto, se recomienda estrictamente ejecutar la tarea durante al menos 1 minuto.
  • Si un trabajo tiene más de 1 TB de entrada. Entonces debería considerar aumentar el tamaño de bloque del conjunto de datos de entrada a 256M o incluso a 512M. Así que el número de tareas será menor. Puede cambiar el tamaño del bloque usando el comando Hadoop distcp –Hdfs.block.size=$[256*1024*1024] /path/to/inputdata /path/to/inputdata-with-largeblocks
  • Como sabemos, cada tarea se ejecuta durante al menos 30-40 segundos. Debe aumentar la cantidad de tareas del mapeador a un múltiplo de la cantidad de ranuras del mapeador en el clúster.
  • No ejecute demasiadas tareas de reducción, para la mayoría de los trabajos. El número de tareas de reducción es igual o un poco menor que el número de ranuras de reducción en el clúster.

4. Combinador entre Mapper y Reducer

Si el algoritmo implica calcular agregados de cualquier tipo, entonces deberíamos usar un Combinador. Combiner realiza alguna agregación antes de que los datos lleguen al reductor.

El marco Hadoop MapReduce se ejecuta de manera inteligente para reducir la cantidad de datos que se escriben en el disco. Y esos datos deben transferirse entre las etapas de cálculo Map y Reduce.

5. Uso del tipo de escritura más apropiado y compacto para datos

Los usuarios de big data usan el tipo de escritura Text innecesariamente para cambiar de Hadoop Streaming a Java MapReduce. El texto puede ser conveniente. Es ineficiente convertir datos numéricos hacia y desde cadenas UTF8. Y en realidad puede representar una parte significativa del tiempo de CPU.

6. Reutilización de escrituras

Muchos usuarios de MapReduce cometen un error muy común que consiste en asignar un nuevo objeto de escritura para cada salida de un mapeador/reductor. Suponga, por ejemplo, la implementación del mapeador de conteo de palabras de la siguiente manera:

public void map(...) {
...
for (String word: words) {
output.collect(new Text(word), new IntWritable(1));
}

Esta implementación provoca la asignación de miles de objetos de corta duración. Si bien el recolector de basura de Java hace un trabajo razonable al lidiar con esto, es más eficiente escribir:

class MyMapper ... {
Text wordText = new Text();
IntWritable one = new IntWritable(1);
public void map(...) {
... for (String word: words)
{
wordText.set(word);
output.collect(word, one); }
}
}

Conclusión

Por lo tanto, existen varias técnicas de optimización de trabajos de MapReduce que lo ayudan a optimizar el trabajo de MapReduce. Como usar el combinador entre mapeador y Reducer, mediante el uso de compresión LZO, el ajuste adecuado de la cantidad de tareas de MapReduce, la reutilización de escritura.

Si encuentra alguna otra técnica para la optimización del trabajo de MapReduce, háganoslo saber en la sección de comentarios que aparece a continuación.