Orientação de ajuste de desempenho para o MapReduce no HDInsight e no Armazenamento de Data Lake do Azure Gen1

Pré-requisitos

Parâmetros

Ao executar trabalhos do MapReduce, aqui estão os parâmetros mais importantes que você pode configurar para aumentar o desempenho no Data Lake armazenamento Gen1:

Parâmetro Descrição
Mapreduce.map.memory.mb A quantidade de memória a ser alocada a cada mapeador.
Mapreduce.job.maps O número de tarefas de mapeamento por trabalho.
Mapreduce.reduce.memory.mb A quantidade de memória a ser alocada 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 de acordo com a quantidade de memória necessária para a tarefa de mapeamento e/ou redução. Você pode exibir os valores padrão de mapreduce.map.memory e mapreduce.reduce.memory no Ambari por meio da configuração do Yarn. No Ambari, navegue até o YARN para exibir a guia Configurações. A memória YARN será exibida.

Mapreduce.job.maps / Mapreduce.job.reduces

Isso determina o número máximo de mapeadores ou redutores a serem criados. O número de divisões determina quantos mapeadores são criados para o trabalho MapReduce. Portanto, você pode obter menos mapeadores do que o solicitado se houver menos divisões do que o número de mapeadores solicitados.

Diretrizes

Etapa 1: Determinar o número de trabalhos em execução

Por padrão, o MapReduce usará o cluster inteiro para o trabalho. Você pode usar uma parte menor do cluster ao usar um número de mapeadores menor do que o número de contêineres disponíveis existentes. As diretrizes neste documento pressupõem que seu aplicativo é o único aplicativo em execução no cluster.

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

O tamanho da memória para tarefas de mapeamento e redução dependerá do trabalho específico. Caso deseje aumentar a simultaneidade, você poderá reduzir o tamanho da memória. O número de tarefas em execução simultânea depende do número de contêineres. Diminuindo a quantidade de memória por mapeador ou redutor, mais contêineres podem ser criados, o que permite a execução simultânea de mais mapeadores ou redutores. Diminuir muito a quantidade de memória pode fazer com que alguns processos fiquem sem memória. Se você receber um erro de heap quando executar seu trabalho, você deverá aumentar a memória por mapeador ou redutor. Considere que adicionar mais contêineres adicionará sobrecarga extra para cada contêiner adicional, o que pode degradar o desempenho. Outra alternativa é de obter mais memória pelo uso de um cluster com maiores quantidades de memória ou pelo aumento do número de nós no cluster. Mais memória permitirá o uso de mais contêineres, o que significa mais simultaneidade.

Etapa 3: Determinar o total de memória YARN

Para ajustar mapreduce.job.maps/mapreduce.job.reduces, você deve considerar a quantidade total de memória YARN disponível para uso. Essas informações estão disponíveis no Ambari. Navegue até o YARN para exibir a guia Configurações. A memória YARN é exibida nessa janela. Multiplique a memória YARN com o número de nós no cluster para obter a memória total do YARN.

Total YARN memory = nodes * YARN memory per node

Se você estiver usando um cluster vazio, a memória poderá ser a memória YARN total para seu cluster. Se outros aplicativos estiverem usando memória, você poderá usar apenas uma parte da memória do cluster, reduzindo o número de mapeadores ou redutores para o número de contêineres que você deseja usar.

Etapa 4: Calcular o número de contêineres YARN

Contêineres YARN determinam a quantidade de simultaneidade disponível para o trabalho. Pegar a memória YARN total e divida-a por mapreduce.map.memory.

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

Etapa 5: definir mapreduce.job.maps/mapreduce.job.reduces

Defina mapreduce.job.maps/mapreduce.job.reduces para, no mínimo, o número de contêineres disponíveis. Você pode experimentar ainda mais aumentando o número de mapeadores e redutores para ver se obtém um melhor desempenho. Tenha em mente que mais mapeadores terão uma sobrecarga adicional, então ter um número excessivo de mapeadores pode degradar o desempenho.

O isolamento de CPU e agendamento de CPU são desligados por padrão para que o número de contêineres YARN seja restrito pela memória.

Exemplo de cálculo

Suponhamos que você tenha um cluster composto de oito nós D14 e deseje executar um trabalho com uso intensivo de E/S. Aqui estão os cálculos que você deve fazer:

Etapa 1: Determinar o número de trabalhos em execução

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

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

Para nosso exemplo, você está executando um trabalho com uso intensivo de E/S e decide que 3 GB de memória para tarefas de mapeamento são suficientes.

mapreduce.map.memory = 3GB

Etapa 3: Determinar o total de memória YARN

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

Etapa 4: calcular o número de contêineres YARN

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

Etapa 5: definir mapreduce.job.maps/mapreduce.job.reduces

mapreduce.map.jobs = 256

Limitações

Limitação do data Lake armazenamento Gen1

Como um serviço multilocatário, o Data Lake Storage Gen1 define limites de largura de banda de nível de conta. Se você atingir esses limites, começará a ver falhas de tarefas. Isso pode ser identificado observando os erros de limitação nos logs de tarefa. Se precisar de mais largura de banda para seu trabalho, entre em contato conosco.

Para verificar se há problemas de limitação, você precisa habilitar o log de depuração no lado do cliente. Veja como fazer isso:

  1. Coloque a seguinte propriedade nas propriedades de log4j em Ambari > YARN > Configuração > Avançado yarn-log4j: log4j.logger.com.microsoft.azure.datalake.store=DEBUG

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

  3. Se o problema for de limitação, você verá o código de erro HTTP 429 no arquivo de log do YARN. O arquivo de log do YARN está em /tmp/<usuário>/yarn.log

Exemplos para execução

Para demonstrar como o MapReduce é executado no Data Lake Storage Gen1, abaixo está um código de exemplo que foi executado em um cluster com as seguintes configurações:

  • 16 nós D14v2
  • Cluster Hadoop executando HDI 3.6

Para um ponto de partida, aqui estão alguns comandos de exemplo para executar o MapReduce Teragen, Terasort e Teravalidate. Você pode ajustar esses comandos com base em 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