Partilhar via


Orientações de otimização do desempenho para o MapReduce no HDInsight e Azure Data Lake Storage Gen1

Pré-requisitos

Parâmetros

Ao executar tarefas do MapReduce, eis os parâmetros mais importantes que pode configurar para aumentar o desempenho no Data Lake Storage Gen1:

Parâmetro Description
Mapreduce.map.memory.mb A quantidade de memória a alocar a cada mapeador.
Mapreduce.job.maps O número de tarefas de mapa por tarefa.
Mapreduce.reduce.memory.mb A quantidade de memória a alocar a cada redutor.
Mapreduce.job.reduces O número de tarefas de redução por trabalho.

Mapreduce.map.memory / Mapreduce.reduce.memory

Ajuste este número com base na quantidade de memória necessária para a tarefa de mapa e/ou redução. Pode ver os valores predefinidos de mapreduce.map.memory e mapreduce.reduce.memory no Ambari através da configuração do Yarn. No Ambari, navegue para YARN e veja o separador Configurações . A memória do YARN será apresentada.

Mapreduce.job.maps / Mapreduce.job.reduces

Isto determina o número máximo de mapeadores ou redutores a criar. O número de divisões determina quantos mapeadores são criados para a tarefa mapReduce. Por conseguinte, poderá obter menos mapeadores do que o pedido se existirem menos divisões do que o número de mapeadores pedido.

Orientação

Passo 1: determinar o número de trabalhos em execução

Por predefinição, o MapReduce utilizará todo o cluster para a sua tarefa. Pode utilizar menos cluster com menos mapeadores do que os contentores disponíveis. A documentação de orientação neste documento pressupõe que a sua aplicação é a única aplicação em execução no cluster.

Passo 2: Definir mapreduce.map.memory/mapreduce.reduce.memory

O tamanho da memória para mapear e reduzir tarefas estará dependente da sua tarefa específica. Pode reduzir o tamanho da memória se quiser aumentar a simultaneidade. O número de tarefas em execução em simultâneo depende do número de contentores. Ao diminuir a quantidade de memória por mapeador ou redutor, podem ser criados mais contentores, o que permite que mais mapeadores ou redutores sejam executados em simultâneo. Diminuir demasiado a quantidade de memória pode fazer com que alguns processos fiquem sem memória. Se receber um erro de área dinâmica ao executar a tarefa, aumente a memória por mapeador ou redutor. Considere que adicionar mais contentores adiciona sobrecarga adicional para cada contentor adicional, o que pode potencialmente degradar o desempenho. Outra alternativa é obter mais memória através de um cluster que tenha maiores quantidades de memória ou aumente o número de nós no cluster. Mais memória permitirá a utilização de mais contentores, o que significa mais simultaneidade.

Passo 3: Determinar a memória total do YARN

Para otimizar mapreduce.job.maps/mapreduce.job.reduces, considere a quantidade total de memória YARN disponível para utilização. Estas informações estão disponíveis no Ambari. Navegue para YARN e veja o separador Configurações . A memória YARN é apresentada nesta janela. Multiplique a memória YARN com o número de nós no cluster para obter a memória yarn total.

Total YARN memory = nodes * YARN memory per node

Se estiver a utilizar um cluster vazio, a memória pode ser a memória yarn total do cluster. Se outras aplicações estiverem a utilizar memória, pode optar por utilizar apenas uma parte da memória do cluster ao reduzir o número de mapeadores ou redutores para o número de contentores que pretende utilizar.

Passo 4: Calcular o número de contentores YARN

Os contentores yarn ditam a quantidade de simultaneidade disponível para a tarefa. Pegue na memória total do YARN e divida-a por mapreduce.map.memory.

# of YARN containers = total YARN memory / mapreduce.map.memory

Passo 5: Definir mapreduce.job.maps/mapreduce.job.reduces

Defina mapreduce.job.maps/mapreduce.job.reduces para, pelo menos, o número de contentores disponíveis. Pode experimentar mais ao aumentar o número de mapeadores e redutores para ver se obtém um melhor desempenho. Tenha em atenção que mais mapeadores terão sobrecarga adicional, pelo que ter demasiados mapeadores pode degradar o desempenho.

O agendamento da CPU e o isolamento da CPU são desativados por predefinição, pelo que o número de contentores YARN está limitado pela memória.

Cálculo de exemplo

Digamos que tem atualmente um cluster composto por 8 nós D14 e quer executar uma tarefa intensiva de E/S. Eis os cálculos que deve fazer:

Passo 1: determinar o número de trabalhos em execução

Para o nosso exemplo, assumimos que o nosso trabalho é o único em execução.

Passo 2: Definir mapreduce.map.memory/mapreduce.reduce.memory

Para o nosso exemplo, está a executar uma tarefa intensiva de E/S e decide que 3 GB de memória para tarefas de mapa são suficientes.

mapreduce.map.memory = 3GB

Passo 3: Determinar a memória total do YARN

total memory from the cluster is 8 nodes * 96GB of YARN memory for a D14 = 768GB

Passo 4: Calcular o nº de contentores YARN

# of YARN containers = 768 GB of available memory / 3 GB of memory = 256

Passo 5: Definir mapreduce.job.maps/mapreduce.job.reduces

mapreduce.map.jobs = 256

Limitações

limitação de Data Lake Storage Gen1

Como um serviço multi-inquilino, Data Lake Storage Gen1 define os limites de largura de banda ao nível da conta. Se atingir estes limites, começará a ver falhas de tarefas. Isto pode ser identificado ao observar erros de limitação nos registos de tarefas. Se precisar de mais largura de banda para o seu trabalho, contacte-nos.

Para verificar se está a ser limitado, tem de ativar o registo de depuração no lado do cliente. Eis como pode fazê-lo:

  1. Coloque a seguinte propriedade nas propriedades log4j no Ambari > YARN > Config > Advanced yarn-log4j: log4j.logger.com.microsoft.azure.datalake.store=DEBUG

  2. Reinicie todos os nós/serviço para que a configuração entre em vigor.

  3. Se estiver a ser limitado, verá o código de erro HTTP 429 no ficheiro de registo do YARN. O ficheiro de registo do YARN está em /tmp/<user>/yarn.log

Exemplos a executar

Para demonstrar como o MapReduce é executado no Data Lake Storage Gen1, seguem-se alguns códigos de exemplo que foram executados num cluster com as seguintes definições:

  • 16 nós D14v2
  • Cluster do Hadoop a executar o HDI 3.6

Para um ponto de partida, eis alguns comandos de exemplo para executar MapReduce Teragen, Terasort e Teravalidate. Pode ajustar estes comandos com base nos seus recursos.

Teragen

yarn jar /usr/hdp/current/hadoop-mapreduce-client/hadoop-mapreduce-examples.jar teragen -Dmapreduce.job.maps=2048 -Dmapreduce.map.memory.mb=3072 10000000000 adl://example/data/1TB-sort-input

Terasort

yarn jar /usr/hdp/current/hadoop-mapreduce-client/hadoop-mapreduce-examples.jar terasort -Dmapreduce.job.maps=2048 -Dmapreduce.map.memory.mb=3072 -Dmapreduce.job.reduces=512 -Dmapreduce.reduce.memory.mb=3072 adl://example/data/1TB-sort-input adl://example/data/1TB-sort-output

Teravalidate

yarn jar /usr/hdp/current/hadoop-mapreduce-client/hadoop-mapreduce-examples.jar teravalidate -Dmapreduce.job.maps=512 -Dmapreduce.map.memory.mb=3072 adl://example/data/1TB-sort-output adl://example/data/1TB-sort-validate