2010-08-01 15 views
14

Estoy ejecutando un trabajo de Hadoop de más de 1,5 TB de datos haciendo muchas coincidencias de patrones. Tengo varias máquinas con 16 GB de RAM cada una, y siempre obtengo OutOfMemoryException en este trabajo con estos datos (estoy usando Hive).Cómo evitar OutOfMemoryException al ejecutar Hadoop?

Me gustaría saber cómo establecer de forma óptima la opción HADOOP_HEAPSIZE en el archivo hadoop-env.sh, por lo tanto, mi trabajo no fallaría. ¿Es posible incluso configurar esta opción para que mis trabajos no fallen?

Cuando configuré HADOOP_HEAPSIZE en 1,5 GB y eliminé la mitad de la coincidencia de patrones de la consulta, la tarea se ejecutó correctamente. Entonces, ¿para qué sirve esta opción si no ayuda a evitar fallas en el trabajo?

Voy a hacer más experimentos con la configuración óptima, pero dado que esos trabajos tardan más de 10 horas en ejecutarse, les pido su consejo.

+0

¿Qué te hace pensar que 'HADOOP_HEAPSIZE' no * ayuda a evitar la falla? Suena como si tu experiencia lo hiciera. Por razones que solo pueden conocerse al examinar sus datos/trabajo, su situación requiere un tamaño de almacenamiento dinámico al menos tan grande. ¿Puede refactorizar su trabajo para que no necesite un montón tan grande? –

+0

He modificado mi trabajo, por lo que no usa un montón tan grande, pero también en este momento he cambiado 'HADOOP_HEAPSIZE'. Y no veo el resultado real de este chagne, quiero decir: ¿Por qué configurar el montón más pequeño que: amount_of_my_RAM/number_of_mappers_or_reducers? – wlk

Respuesta

13

¿El trabajo está fallando o su servidor se bloquea? Si su trabajo está fallando debido a OutOfMemmory en los nodos, puede cambiar el número de mapas máximos y reductores, y la JVM opta por cada uno de ellos para que eso nunca suceda. mapred.child.java.opts (el valor predeterminado es 200Xmx) por lo general debe aumentarse en función del hardware específico de los nodos de datos.

http://allthingshadoop.com/2010/04/28/map-reduce-tips-tricks-your-first-real-cluster/

tareas Max se pueden configurar en el NameNode o anulado (y último set) en los nodos de datos que pueden tener diferentes configuraciones de hardware. Las tareas máximas están configuradas tanto para los mapeadores como para los reductores. Para calcular esto, se basa en la CPU (núcleos) y la cantidad de RAM que tiene, y también la JVM max que configuró en mapred.child.java.opts (el valor predeterminado es 200). El nodo de datos y el rastreador de tareas están configurados en 1 GB, por lo que para una máquina de 8 GB, mapred.tasktracker.map.tasks.maximum podría establecerse en 7 y mapred.tasktracker.reduce.tasks.maximum en 7 con mapred.child.java .opts establecido en -400Xmx (suponiendo 8 núcleos). Tenga en cuenta que estas tareas máximas son realizadas por su CPU si solo tiene 1 CPU con 1 núcleo, entonces es hora de obtener nuevo hardware para su nodo de datos o establecer las tareas de máscara en 1. Si tiene 1 CPU con 4 núcleos, entonces establecer el mapa en 3 y reducir a 3 sería bueno (guardando 1 núcleo para el daemon).

Por defecto solo hay un reductor y necesita configurar mapred.reduce.tasks para que sea más de uno. Este valor debe estar entre .95 y 1.75 veces el número de tareas máximas por nodo multiplicado por el número de nodos de datos. Entonces, si tiene 3 nodos de datos y está configurado para tareas máximas de 7, configúrelo entre 25 y 36.

Si su servidor falla con problemas de OutOfMemory, entonces es donde HADOOP_HEAPSIZE entra solo para el montón de procesos (no la ejecución de la tarea).

Por último, si su trabajo tarda tanto, puede verificar si tiene otra buena adición de configuración es mapred.compress.map.output. Establecer este valor como verdadero (equilibrio entre el tiempo para comprimir y transferir) acelere la copia de los reductores en gran medida, especialmente cuando se trabaja con grandes conjuntos de datos. A menudo, los trabajos llevan tiempo, pero también hay opciones para modificar para ayudar a acelerar las cosas = 8 ^)

Cuestiones relacionadas