Como os contêineres são criados com base em vcores e memória no MapReduce2?

Eu tenho um pequeno cluster composto de 1 mestre (namenode, secundárionamenode, resourcemanager) e 2 escravos (datanode, nodemanager).

Eu configurei no yarn-site.xml do master:

yarn.scheduler.minimum-allocation-mb : 512yarn.scheduler.maximum-allocation-mb : 1024yarn.scheduler.minimum-allocation-vcores : 1yarn.scheduler.maximum-allocation-vcores : 2

Eu configurei no yarn-site.xml do slave, s:

yarn.nodemanager.resource.memory-mb : 2048yarn.nodemanager.resource.cpu-vcores : 4

Então, no mestre, eu configurei no mapred-site.xml:

mapreduce.map.memory.mb : 512mapreduce.map.java.opts : -Xmx500mmapreduce.map.cpu.vcores : 1mapreduce.reduce.memory.mb : 512mapreduce.reduce.java.opts : -Xmx500mmapreduce.reduce.cpu.vcores : 1

Portanto, eu entendo que, ao executar um trabalho, o ApplicationMaster de mapreduce tentará criar quantos contêineres de 512 Mb e 1 vCore nos dois escravos, que têm apenas 2048 Mb e 4 vCores disponíveis, o que dá espaço para 4 contêineres em cada escravo. É exatamente isso que está acontecendo nos meus trabalhos, então não há problema até agora.

No entanto, quando eu incremento omapreduce.map.cpu.vcores emapreduce.reduce.cpu.vcores de 1 a 2, teoricamente, deve haver apenas vCores suficientes para criar 2 contêineres por escravo, certo? Mas não, ainda tenho 4 contêineres por escravo.

Eu então tentei aumentar omapreduce.map.memory.mb emapreduce.reduce.memory.mb de 512 a 768. Isso deixa espaço para 2 contêineres (2048/768 = 2).

Não importa se os vCores estão definidos como 1 ou 2 para mapeadores e redutores, isso sempre produzirá 2 contêineres por escravo com 768mb e 4 contêineres com 512mb. Então, para que servem os vCores? O ApplicationMaster parece não se importar.

Além disso, ao definir a memória como 768 e vCores como 2, tenho essas informações exibidas na interface do usuário do nodemanager para um contêiner mapeador:

Os 768 Mb se transformaram em 1024 TotalMemoryNeeded e os 2 vCores são ignorados e exibidos como 1 TotalVCoresNeeded.

Então, para dividir a pergunta "como funciona" em várias perguntas:

Somente a memória é usada (e vCores ignorada) para calcular o número de contêineres?É omapreduce.map.memory.mb valor apenas um valor completamente abstrato para calcular o número de contêineres (e é por isso que pode ser arredondado para a próxima potência de 2)? Ou isso representa alocação de memória real de alguma forma?Por que especificamos algum valor -Xmx emmapreduce.map.java.opts ? Por que o fio não usa o valor demapreduce.map.memory.mb alocar memória para o contêiner?O que é TotalVCoresNeeded e por que é sempre igual a 1? Eu tentei mudarmapreduce.map.cpu.vcores em todos os nós (mestre e escravos), mas isso nunca muda.

questionAnswers(1)

yourAnswerToTheQuestion