En Hadoop v1, he asignado cada 7 ranuras de mapeador y reductor con un tamaño de 1GB, mis mapeadores y reductores funcionan bien. Mi máquina tiene memoria 8G, procesador 8. Ahora con YARN, cuando ejecuto la misma aplicación en la misma máquina, obtengo 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 intenté 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 todavía aparece el 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 tanta memoria. Según tengo entendido, 1 GB de memoria es suficiente para mi tarea de mapa / reducción. ¿Por qué a medida que asigno más memoria al contenedor, la tarea consume más? ¿Es porque cada tarea tiene más divisiones? Siento que es más eficiente disminuir un poco el tamaño del contenedor y crear más contenedores, de modo que se ejecuten más tareas en paralelo. El problema es ¿cómo puedo asegurarme de que a cada contenedor no se le asignen más divisiones de las que puede manejar?