El contenedor se está ejecutando más allá de los límites de memoria


En Hadoop v1, he asignado cada ranura de mapeador y reductor de 7 con un tamaño de 1 GB, mis mapeadores y reductores funcionan bien. Mi máquina tiene memoria 8G, procesador 8. Ahora con YARN, cuando ejecute la misma aplicación en la misma máquina, obtuve un error de contenedor. Por defecto, tengo esta configuración:

  <property>
    <name>yarn.scheduler.minimum-allocation-mb</name>
    <value>1024</value>
  </property>
  <property>
    <name>yarn.scheduler.maximum-allocation-mb</name>
    <value>8192</value>
  </property>
  <property>
    <name>yarn.nodemanager.resource.memory-mb</name>
    <value>8192</value>
  </property>

Me dio error:

Container [pid=28920,containerID=container_1389136889967_0001_01_000121] is running beyond virtual memory limits. Current usage: 1.2 GB of 1 GB physical memory used; 2.2 GB of 2.1 GB virtual memory used. Killing container.

Luego traté de establecer el límite de memoria en mapred-site.xml:

  <property>
    <name>mapreduce.map.memory.mb</name>
    <value>4096</value>
  </property>
  <property>
    <name>mapreduce.reduce.memory.mb</name>
    <value>4096</value>
  </property>

Pero aún obteniendo error:

Container [pid=26783,containerID=container_1389136889967_0009_01_000002] is running beyond physical memory limits. Current usage: 4.2 GB of 4 GB physical memory used; 5.2 GB of 8.4 GB virtual memory used. Killing container.

Estoy confundido por qué la tarea del mapa necesita esto mucha memoria. En mi opinión, 1 GB de memoria es suficiente para mi tarea map / reduce. ¿Por qué a medida que asigne más memoria al contenedor, la tarea usará más? ¿Es porque cada tarea se divide más? Creo que es más eficiente disminuir un poco el tamaño del contenedor y crear más contenedores, para que más tareas se ejecuten en paralelo. El problema es cómo puedo asegurarme de que a cada contenedor no se le asignen más divisiones de las que pueda manejar.

Author: Lishu, 2014-01-09

6 answers

También debe configurar correctamente las asignaciones máximas de memoria para MapReduce. De este tutorial de HortonWorks :

[...]

Cada máquina de nuestro clúster tiene 48 GB de RAM. Parte de esta RAM debe estar >reservada para el uso del Sistema operativo. En cada nodo, asignaremos 40 GB de RAM para >YARN para usar y mantener 8 GB para el Sistema Operativo

Para nuestro cluster de ejemplo, tenemos la RAM mínima para un Contenedor (hilo.programador.minimum-allocation-mb) = 2 GB. Así asignaremos 4 GB para asignar contenedores de tareas y 8 GB para Reducir contenedores de tareas.

En mapred-site.xml:

mapreduce.map.memory.mb: 4096

mapreduce.reduce.memory.mb: 8192

Cada contenedor ejecutará JVMs para el Mapa y Reducirá las tareas. La JVM el tamaño del montón se debe establecer en menor que el mapa y reducir la memoria definido anteriormente, de modo que están dentro de los límites del Contenedor memoria asignada por HILO.

En mapred-site.xml:

mapreduce.map.java.opts: -Xmx3072m

mapreduce.reduce.java.opts: -Xmx6144m

Los ajustes anteriores configuran el límite superior de la RAM física que Map and Reduce tasks will use .

Para resumirlo:

  1. En YARN, debes usar las configuraciones mapreduce, no las mapred. EDITAR: Este comentario ya no es aplicable ahora que ha editado su pregunta.
  2. Lo que está configurando es realmente cuánto desea solicitar, no lo que es el máximo para asignar.
  3. Los límites máximos se configuran con la configuración java.opts mencionada anteriormente.

Por último, es posible que desee comprobar este otro ASÍ pregunta que describe un problema similar (y solución).

 74
Author: cabad,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2017-05-23 12:26:20

Hay una comprobación a nivel de hilo para la relación de uso de memoria Vertual y Física. El problema no es solo que la VM no tiene suficiente memoria física. Pero es porque el uso de memoria virtual es más de lo esperado para la memoria física dada.

Nota : Esto está sucediendo en Centos/RHEL 6 debido a su agresiva asignación de memoria virtual.

Puede resolverse mediante:

  1. Desactivar la comprobación del uso de la memoria virtual configuración hilado.nodemanager.vmem-check-enabled to false;

  2. Aumente la relación VM: PM configurando hilo.nodemanager.vmem-pmem-ratio a algún valor más alto.

Referencias :

Https://issues.apache.org/jira/browse/HADOOP-11364

Http://blog.cloudera.com/blog/2014/04/apache-hadoop-yarn-avoiding-6-time-consuming-gotchas/

Agregar la siguiente propiedad en hilado-sitio.xml

 <property>
   <name>yarn.nodemanager.vmem-check-enabled</name>
    <value>false</value>
    <description>Whether virtual memory limits will be enforced for containers</description>
  </property>
 <property>
   <name>yarn.nodemanager.vmem-pmem-ratio</name>
    <value>4</value>
    <description>Ratio between virtual memory to physical memory when setting memory limits for containers</description>
  </property>
 37
Author: Sanjiv,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2015-07-16 09:23:44

Tuve un problema muy similar al usar HIVE en EMR. Ninguna de las soluciones existentes funcionó para mí ie es decir, ninguna de las configuraciones de mapreduce funcionó para mí; y tampoco lo hizo establecer yarn.nodemanager.vmem-check-enabled a false.

Sin embargo, lo que terminó funcionando fue configurar tez.am.resource.memory.mb, por ejemplo:

hive -hiveconf tez.am.resource.memory.mb=4096

Otro ajuste a considerar es yarn.app.mapreduce.am.resource.mb

 10
Author: hiroprotagonist,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2016-11-09 23:41:13

No puedo comentar la respuesta aceptada, debido a la baja reputación. Sin embargo, me gustaría añadir, este comportamiento es por diseño. El NodeManager está matando tu contenedor. Parece que está tratando de usar la transmisión de hadoop que se ejecuta como un proceso hijo de la tarea map-reduce. El NodeManager supervisa todo el árbol de procesos de la tarea y si consume más memoria que el máximo establecido en mapreduce.asignar.memoria.mb o mapreduce.reducir.memoria.mb respectivamente, esperaríamos la Nodemanager para matar a la tarea, de lo contrario su tarea está robando la memoria que pertenece a otros contenedores, que no desea.

 8
Author: Brian G,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2014-08-15 03:51:42

Mientras trabajaba con spark en EMR estaba teniendo el mismo problema y configurar maximizeResourceAllocation=true hizo el truco; espero que ayude a alguien. Debe configurarlo cuando cree el clúster. De los documentos del EMR:

aws emr create-cluster --release-label emr-5.4.0 --applications Name=Spark \
--instance-type m3.xlarge --instance-count 2 --service-role EMR_DefaultRole --ec2-attributes InstanceProfile=EMR_EC2_DefaultRole --configurations https://s3.amazonaws.com/mybucket/myfolder/myConfig.json

Donde MyConfig.json debería decir:

[
  {
    "Classification": "spark",
    "Properties": {
      "maximizeResourceAllocation": "true"
    }
  }
]
 1
Author: pandorabob,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2017-04-19 21:21:47

También nos enfrentamos a este problema recientemente. Si el problema está relacionado con la memoria del mapeador, un par de cosas que me gustaría sugerir que deben verificarse son.

  • Compruebe si combinador está habilitado o no? Si es así, entonces significa que la lógica de reducción tiene que ejecutarse en todos los registros (salida de mapper). Esto sucede en la memoria. En función de su aplicación, debe verificar si habilitar combinador ayuda o no. El intercambio es entre los bytes de transferencia de red y el tiempo / memoria / CPU para la lógica de reducción en' X ' número de registros.
    • Si siente que el combinador no es mucho de valor, simplemente deshabilítelo.
    • Si necesita combinador y 'X' es un número enorme (digamos millones de registros) entonces considere cambiar su lógica de división (Para los formatos de entrada predeterminados use menos tamaño de bloque, normalmente 1 tamaño de bloque = 1 división) para asignar menos número de registros a un solo mapeador.
  • Número de registros que se procesan en un solo mapeador. Recuerde que todos estos registros necesitan para ser ordenado en memoria (la salida del mapeador está ordenada). Considere establecer mapreduce.task.io.sort.mb (el valor predeterminado es 200MB) a un valor más alto si es necesario. mapred-configs.xml
  • Si cualquiera de los anteriores no ayudó, intente ejecutar la lógica del mapeador como una aplicación independiente y perfile la aplicación usando un generador de perfiles (como JProfiler) y vea dónde se usa la memoria. Esto puede darte muy buenas ideas.
 1
Author: Rathan,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2018-06-13 19:53:55