HBase
 sql >> Base de Dados >  >> NoSQL >> HBase

6 melhores técnicas de otimização de trabalho MapReduce


O ajuste de desempenho ajudará a otimizar seu Hadoop atuação. Neste blog, vamos discutir todas essas técnicas para otimizações do MapReduce Job.

Neste tutorial do MapReduce, forneceremos 6 dicas importantes para a otimização do trabalho do MapReduce, como a configuração adequada do seu cluster, o uso da compactação LZO, o ajuste adequado do número de tarefas do MapReduce etc.


Dicas para otimização do trabalho MapReduce


Abaixo estão algumas técnicas de otimização de trabalho do MapReduce que ajudariam você a otimizar o desempenho do trabalho do MapReduce.

1. Configuração adequada do seu cluster

  • Com -noatime opção Dfs e armazenamento MapReduce são montados. Isso desativará o tempo de acesso. Assim, melhora o desempenho de E/S.
  • Tente evitar o RAID em máquinas TaskTracker e datanode. Isso geralmente reduz o desempenho.
  • Verifique se você configurou mapred.local.dir e dfs.data.dir para apontar para um diretório em cada um de seus discos. Isso é para garantir que toda a sua capacidade de E/S seja usada.
  • Você deve monitorar o gráfico de uso de swap e uso de rede com software. Se você perceber que a troca está sendo usada, reduza a quantidade de RAM alocada para cada tarefa em mapred.child.java.opts .
  • Certifique-se de ter um monitoramento inteligente do status de integridade de suas unidades de disco. Essa é uma das práticas importantes para o ajuste de desempenho do MapReduce.

2. Uso de compactação LZO


Para dados intermediários, isso é sempre uma boa ideia. Cada trabalho do Hadoop que gera uma quantidade não desprezível de saída de mapa se beneficiará da compactação de dados intermediária com LZO.

Embora o LZO adicione um pouco de sobrecarga à CPU, ele economiza tempo reduzindo a quantidade de E/S de disco durante o embaralhamento.

Definir mapred.compress.map.output para true para habilitar a compactação LZO

3. Ajuste adequado do número de tarefas MapReduce

  • No trabalho MapReduce, se cada tarefa levar de 30 a 40 segundos ou mais, o número de tarefas será reduzido. O mapeador  ou redutor  processo envolve as seguintes coisas:primeiro, você precisa iniciar a JVM (JVM carregada na memória). Então você precisa inicializar a JVM. E após o processamento (mapeador/redutor) você precisa desinicializar a JVM. E essas tarefas JVM são muito caras. Suponha um caso em que o mapeador executa uma tarefa apenas por 20 a 30 segundos. Para isso, precisamos iniciar/inicializar/parar a JVM. Isso pode levar um tempo considerável. Portanto, é estritamente recomendado executar a tarefa por pelo menos 1 minuto.
  • Se um trabalho tiver mais de 1 TB de entrada. Então você deve considerar aumentar o tamanho do bloco do conjunto de dados de entrada para 256M ou até 512M. Assim, o número de tarefas será menor. Você pode alterar o tamanho do bloco usando o comando Hadoop distcp –Hdfs.block.size=$[256*1024*1024] /path/to/inputdata /path/to/inputdata-with-largeblocks
  • Como sabemos, cada tarefa é executada por pelo menos 30 a 40 segundos. Você deve aumentar o número de tarefas do mapeador para um múltiplo do número de slots do mapeador no cluster.
  • Não execute muitas tarefas de redução – para a maioria dos trabalhos. O número de tarefas de redução igual ou um pouco menor que o número de slots de redução no cluster.

4. Combinador entre Mapeador e Redutor


Se o algoritmo envolver agregações de computação de qualquer tipo, devemos usar um Combiner. O Combiner executa alguma agregação antes que os dados atinjam o redutor.

As execuções da estrutura Hadoop MapReduce combinam-se de forma inteligente para reduzir a quantidade de dados a serem gravados no disco. E esses dados devem ser transferidos entre os estágios de cálculo Map e Reduce.

5. Uso do tipo gravável mais apropriado e compacto para dados


Os usuários de big data usam o tipo gravável de texto desnecessariamente para alternar do Hadoop Streaming para o Java MapReduce. O texto pode ser conveniente. É ineficiente converter dados numéricos de e para strings UTF8. E pode realmente compor uma parte significativa do tempo de CPU.

6. Reutilização de graváveis


Muitos usuários do MapReduce cometem um erro muito comum que é alocar um novo objeto Writable para cada saída de um mapeador/redutor. Suponha, por exemplo, a implementação do mapeador de contagem de palavras da seguinte forma:
public void map(...) {
...
for (String word: words) {
output.collect(new Text(word), new IntWritable(1));
}

Essa implementação causa a alocação de milhares de objetos de curta duração. Embora o coletor de lixo Java faça um trabalho razoável para lidar com isso, é mais eficiente escrever:
class MyMapper ... {
Text wordText = new Text();
IntWritable one = new IntWritable(1);
public void map(...) {
... for (String word: words)
{
wordText.set(word);
output.collect(word, one); }
}
}

Conclusão


Portanto, existem várias técnicas de otimização de trabalho do MapReduce que ajudam você a otimizar o trabalho do MapReduce. Como usar o combinador entre o mapeador e o redutor, pelo uso da compactação LZO, ajuste adequado do número de tarefas MapReduce, reutilização de graváveis.

Se você encontrar outra técnica para otimização de trabalho do MapReduce, informe-nos na seção de comentários abaixo.