In Hadoop v1, ho assegnato a ciascuno 7 slot di mappatura e riduttore con dimensioni di 1 GB, i miei mappatori e riduttori funzionano bene. La mia macchina ha una memoria 8G, 8 processori. Ora con YARN, quando si esegue la stessa applicazione sulla stessa macchina, ho ricevuto un errore del contenitore. Per impostazione predefinita, ho queste impostazioni:
<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>
Mi ha dato un errore:
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.
Ho quindi provato a impostare il limite di memoria in 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>
Ma continua a ricevere errore:
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.
Sono confuso perché l'attività della mappa necessita di così tanta memoria. A quanto mi risulta, 1 GB di memoria è sufficiente per la mia attività di mappa / riduzione. Perché quando assegno più memoria al contenitore, l'attività ne utilizza di più? È perché ogni attività ottiene più suddivisioni? Ritengo sia più efficiente ridurre un po 'le dimensioni del contenitore e creare più contenitori, in modo che più attività vengano eseguite in parallelo. Il problema è come posso assicurarmi che a ogni contenitore non vengano assegnate più suddivisioni di quante ne possa gestire?