Orientações de otimização do desempenho para o MapReduce no HDInsight e Azure Data Lake Storage Gen1
Pré-requisitos
- Uma subscrição do Azure. Consulte Obter versão de avaliação gratuita do Azure.
- Uma conta Azure Data Lake Storage Gen1. Para obter instruções sobre como criar uma, consulte Introdução ao Azure Data Lake Storage Gen1
- Cluster do Azure HDInsight com acesso a uma conta Data Lake Storage Gen1. Veja Criar um cluster do HDInsight com Data Lake Storage Gen1. Certifique-se de que ativa o Ambiente de Trabalho Remoto para o cluster.
- Utilizar o MapReduce no HDInsight. Para obter mais informações, veja Utilizar o MapReduce no Hadoop no HDInsight
- Veja as diretrizes de otimização do desempenho para Data Lake Storage Gen1. Para obter conceitos gerais de desempenho, veja Orientações de Otimização do Desempenho do Data Lake Storage Gen1
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:
Coloque a seguinte propriedade nas propriedades log4j no Ambari > YARN > Config > Advanced yarn-log4j: log4j.logger.com.microsoft.azure.datalake.store=DEBUG
Reinicie todos os nós/serviço para que a configuração entre em vigor.
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