No Hadoop v1, atribuí cada slot de 7 mapeadores e redutores com tamanho de 1 GB, meus mapeadores e redutores funcionam bem. Minha máquina tem 8G de memória e 8 processadores. Agora com o YARN, ao executar o mesmo aplicativo na mesma máquina, recebo um erro de contêiner. Por padrão, tenho estas configurações:
<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>
Deu-me um erro:
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.
Em seguida, tentei definir o limite de memória em 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>
Mas ainda obtendo erro:
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.
Estou confuso por que a tarefa do mapa precisa de tanta memória. No meu entendimento, 1 GB de memória é suficiente para minha tarefa de mapear / reduzir. Por que, conforme atribuo mais memória ao contêiner, a tarefa usa mais? É porque cada tarefa recebe mais divisões? Acho que é mais eficiente diminuir um pouco o tamanho do container e criar mais containers, para que mais tarefas sejam executadas em paralelo. O problema é como posso ter certeza de que cada contêiner não receberá mais divisões do que pode suportar?