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
: 2Eu configurei no yarn-site.xml do slave, s:
yarn.nodemanager.resource.memory-mb
: 2048yarn.nodemanager.resource.cpu-vcores
: 4Entã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
: 1Portanto, 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.