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?
Respostas:
Você também deve configurar corretamente as alocações máximas de memória para MapReduce. Deste tutorial do HortonWorks :
Resumindo:
mapreduce
configurações, nãomapred
aquelas. EDITAR: Este comentário não é mais aplicável agora que você editou sua pergunta.java.opts
configurações listadas acima.Finalmente, você pode querer verificar esta outra questão do SO que descreve um problema semelhante (e solução).
fonte
mapreduce.map.java.opts
emapreduce.reduce.java.opts
resolvendo meu problema. Você sabe se a memória real atribuída à tarefa é definida apenas pormapreduce.map/reduce.memory.mb
? Como issoyarn.scheduler.minimum-allocation-mb
afeta a atribuição de memória real?Há uma verificação colocada no nível do Yarn para a proporção de uso de memória virtual e física. O problema não é apenas que a VM não tem memória física suficiente. Mas é porque o uso da memória virtual é mais do que o esperado para determinada memória física.
Nota : Isso está acontecendo no Centos / RHEL 6 devido à sua alocação agressiva de memória virtual.
Isso pode ser resolvido por:
Desative a verificação de uso de memória virtual definindo yarn.nodemanager.vmem-check-enabled para false ;
Aumente a proporção VM: PM definindo yarn.nodemanager.vmem-pmem-ratio para um valor mais alto.
Referências :
https://issues.apache.org/jira/browse/HADOOP-11364
http://blog.cloudera.com/blog/2014/04/apache-hadoop-yarn-avoiding-6-time-consuming-gotchas/
Adicione a seguinte propriedade em yarn-site.xml
fonte
Tive um problema muito semelhante ao usar o HIVE no EMR. Nenhuma das soluções existentes funcionou para mim - ou seja, nenhuma das configurações do mapreduce funcionou para mim; e nem a configuração
yarn.nodemanager.vmem-check-enabled
como falsa.Porém, o que acabou dando certo foi a configuração
tez.am.resource.memory.mb
, por exemplo:Outra configuração a considerar é o ajuste
yarn.app.mapreduce.am.resource.mb
fonte
Não posso comentar a resposta aceita, devido à baixa reputação. No entanto, gostaria de acrescentar que esse comportamento é intencional. O NodeManager está matando seu contêiner. Parece que você está tentando usar o streaming hadoop, que está sendo executado como um processo filho da tarefa de redução de mapa. O NodeManager monitora toda a árvore de processo da tarefa e se consumir mais memória do que o máximo definido em mapreduce.map.memory.mb ou mapreduce.reduce.memory.mb respectivamente, esperaríamos que o Nodemanager encerrasse a tarefa, caso contrário sua tarefa é roubar memória pertencente a outros contêineres, que você não quer.
fonte
Enquanto trabalhava com o Spark no EMR, estava tendo o mesmo problema e a configuração
maximizeResourceAllocation=true
funcionou; espero que ajude alguém. Você deve configurá-lo ao criar o cluster. De documentos EMR:Onde myConfig.json deve dizer:
fonte
Também enfrentamos esse problema recentemente. Se o problema estiver relacionado à memória do mapeador, algumas coisas que eu gostaria de sugerir que precisam ser verificadas são.
fonte
Executando yarn no subsistema Windows Linux com Ubunto OS, erro "executando além dos limites de memória virtual, Killing container" Eu resolvi desabilitando a verificação de memória virtual no arquivo yarn-site.xml
fonte
Eu não verifiquei pessoalmente, mas hadoop-yarn-container-virtual-memory -standing-and-solving-container-is-running-beyond-virtual-memory-limits-errors parece muito razoável
Resolvi o problema mudando
yarn.nodemanager.vmem-pmem-ratio
para um valor mais alto e concordo que:fonte