Otimizar o Apache Hive com o Apache Ambari no Azure HDInsight

O Apache Ambari é uma interface web para gerenciar e monitorar clusters HDInsight. Para obter uma introdução à interface do usuário da Web do Ambari, consulte Gerenciar clusters HDInsight usando a interface do usuário da Web do Apache Ambari.

As seções a seguir descrevem as opções de configuração para otimizar o desempenho geral do Apache Hive.

  1. Para modificar os parâmetros de configuração do Hive, selecione Hive na barra lateral Serviços.
  2. Navegue até a guia Configurações .

Definir o mecanismo de execução do Hive

O Hive fornece dois mecanismos de execução: Apache Hadoop MapReduce e Apache TEZ. Tez é mais rápido do que MapReduce. Os clusters Linux do HDInsight têm o Tez como mecanismo de execução padrão. Para alterar o mecanismo de execução:

  1. Na guia Configurações do Hive, digite mecanismo de execução na caixa de filtro.

    Apache Ambari Search execution engine.

  2. O valor padrão da propriedade Optimization é Tez.

    Optimization - Apache Tez engine.

Sintonizar mapeadores

O Hadoop tenta dividir (mapear) um único arquivo em vários arquivos e processar os arquivos resultantes em paralelo. O número de mapeadores depende do número de divisões. Os dois parâmetros de configuração a seguir determinam o número de divisões para o mecanismo de execução Tez:

  • tez.grouping.min-size: Limite inferior no tamanho de uma divisão agrupada, com um valor padrão de 16 MB (16.777.216 bytes).
  • tez.grouping.max-size: Limite superior do tamanho de uma divisão agrupada, com um valor padrão de 1 GB (1.073.741.824 bytes).

Como diretriz de desempenho, diminua ambos os parâmetros para melhorar a latência, aumente para obter mais taxa de transferência.

Por exemplo, para definir quatro tarefas de mapeador para um tamanho de dados de 128 MB, você definiria ambos os parâmetros para 32 MB cada (33.554.432 bytes).

  1. Para modificar os parâmetros de limite, navegue até a guia Configurações do serviço Tez. Expanda o painel Geral e localize os tez.grouping.max-size parâmetros e tez.grouping.min-size .

  2. Defina ambos os parâmetros como 33.554.432 bytes (32 MB).

    Apache Ambari Tez grouping sizes.

Essas alterações afetam todos os trabalhos Tez no servidor. Para obter um resultado ideal, escolha os valores de parâmetros apropriados.

Redutores de sintonia

Apache ORC e Snappy oferecem alto desempenho. No entanto, o Hive pode ter poucos redutores por padrão, causando gargalos.

Por exemplo, digamos que você tenha um tamanho de dados de entrada de 50 GB. Esses dados no formato ORC com compressão Snappy é de 1 GB. Hive estima o número de redutores necessários como: (número de bytes de entrada para mapeadores / hive.exec.reducers.bytes.per.reducer).

Com as configurações padrão, este exemplo são quatro redutores.

O hive.exec.reducers.bytes.per.reducer parâmetro especifica o número de bytes processados por redutor. O valor padrão é 64 MB. Ajustar esse valor para baixo aumenta o paralelismo e pode melhorar o desempenho. Ajustá-lo muito baixo também pode produzir muitos redutores, potencialmente afetando negativamente o desempenho. Esse parâmetro é baseado em seus requisitos de dados específicos, configurações de compactação e outros fatores ambientais.

  1. Para modificar o parâmetro, navegue até a guia Configurações do Hive e localize o parâmetro Data per Reducer na página Configurações.

    Apache Ambari Data per Reducer.

  2. Selecione Editar para modificar o valor para 128 MB (134.217.728 bytes) e pressione Enter para salvar.

    Ambari Data per Reducer - edited.

    Dado um tamanho de entrada de 1.024 MB, com 128 MB de dados por redutor, existem oito redutores (1024/128).

  3. Um valor incorreto para o parâmetro Data per Reducer pode resultar em um grande número de redutores, afetando negativamente o desempenho da consulta. Para limitar o número máximo de redutores, defina hive.exec.reducers.max para um valor apropriado. O valor padrão é 1009.

Habilitar execução paralela

Uma consulta do Hive é executada em um ou mais estágios. Se os estágios independentes puderem ser executados em paralelo, isso aumentará o desempenho da consulta.

  1. Para habilitar a execução de consultas paralelas, navegue até a guia Configuração do Hive e procure a hive.exec.parallel propriedade. O valor predefinido é false. Altere o valor para true e pressione Enter para salvar o valor.

  2. Para limitar o número de trabalhos a serem executados em paralelo, modifique a hive.exec.parallel.thread.number propriedade. O valor padrão é 8.

    Apache Hive exec parallel display.

Ativar vetorização

O Hive processa dados linha por linha. A vetorização direciona o Hive para processar dados em blocos de 1.024 linhas, em vez de uma linha de cada vez. A vetorização só é aplicável ao formato de arquivo ORC.

  1. Para habilitar uma execução de consulta vetorizada, navegue até a guia Configurações do Hive e procure o hive.vectorized.execution.enabled parâmetro. O valor padrão é true para Hive 0.13.0 ou posterior.

  2. Para habilitar a execução vetorizada para o lado de redução da consulta, defina o hive.vectorized.execution.reduce.enabled parâmetro como true. O valor predefinido é false.

    Apache Hive vectorized execution.

Habilite a otimização baseada em custos (CBO)

Por padrão, o Hive segue um conjunto de regras para encontrar um plano de execução de consulta ideal. A otimização baseada em custos (CBO) avalia vários planos para executar uma consulta. E atribui um custo a cada plano e, em seguida, determina o plano mais barato para executar uma consulta.

Para habilitar o CBO, navegue até Configurações de configurações do Hive>e encontre Ativar otimizador> baseado em custos e, em seguida, alterne o botão de alternância para Ativado.

HDInsight cost-based optimizer.

Os seguintes parâmetros de configuração adicionais aumentam o desempenho da consulta do Hive quando o CBO está habilitado:

  • hive.compute.query.using.stats

    Quando definido como true, o Hive usa estatísticas armazenadas em seu metastore para responder a consultas simples como count(*).

    Apache Hive compute query using stats.

  • hive.stats.fetch.column.stats

    As estatísticas de coluna são criadas quando o CBO está ativado. O Hive usa estatísticas de coluna, que são armazenadas no metastore, para otimizar consultas. Buscar estatísticas de coluna para cada coluna leva mais tempo quando o número de colunas é alto. Quando definida como false, essa configuração desabilita a busca de estatísticas de coluna no metastore.

    Apache Hive stats set column stats.

  • hive.stats.fetch.partition.stats

    As estatísticas básicas de partição, como número de linhas, tamanho dos dados e tamanho do arquivo, são armazenadas no metastore. Se definido como true, as estatísticas de partição são buscadas no metastore. Quando false, o tamanho do arquivo é buscado no sistema de arquivos. E o número de linhas é obtido a partir do esquema de linha.

    Hive stats set partition stats.

Consulte a postagem do blog Otimização Baseada em Custos do Hive no Blog do Analytics no Azure para ler mais

Habilitar compactação intermediária

As tarefas de mapeamento criam arquivos intermediários que são usados pelas tarefas do redutor. A compactação intermediária reduz o tamanho do arquivo intermediário.

Os trabalhos do Hadoop geralmente são congestionados de E/S. A compactação de dados pode acelerar a E/S e a transferência geral da rede.

Os tipos de compressão disponíveis são:

Formato Ferramenta Algoritmo Extensão de arquivo Dividir?
Gzip Gzip DEFLACIONAMENTO .gz Não
Bzip2 Bzip2 Bzip2 .bz2 Sim
LZO Lzop LZO .lzo Sim, se indexado
Ágil N/A Ágil Ágil Não

Como regra geral, ter o método de compressão splittable é importante, caso contrário, poucos mapeadores serão criados. Se os dados de entrada forem texto, bzip2 é a melhor opção. Para o formato ORC, o Snappy é a opção de compressão mais rápida.

  1. Para habilitar a compactação intermediária, navegue até a guia Configurações do Hive e defina o hive.exec.compress.intermediate parâmetro como true. O valor predefinido é false.

    `Hive exec compress intermediate`.

    Nota

    Para compactar arquivos intermediários, escolha um codec de compactação com menor custo de CPU, mesmo que o codec não tenha uma saída de alta compressão.

  2. Para definir o codec de compressão intermediário, adicione a propriedade mapred.map.output.compression.codec personalizada ao hive-site.xml arquivo ou mapred-site.xml .

  3. Para adicionar uma configuração personalizada:

    a. Navegue até Hive>Configs>Advanced>Custom hive-site.

    b. Selecione Adicionar propriedade... na parte inferior do painel Site de colmeia personalizado.

    c. Na janela Adicionar propriedade, insira mapred.map.output.compression.codec como a chave e org.apache.hadoop.io.compress.SnappyCodec como o valor.

    d. Selecione Adicionar.

    `Apache Hive custom property add`.

    Essa configuração compactará o arquivo intermediário usando a compactação Snappy. Depois que a propriedade é adicionada, ela aparece no painel Site de colmeia personalizado.

    Nota

    Este procedimento modifica o $HADOOP_HOME/conf/hive-site.xml arquivo.

Comprimir a saída final

A saída final do Hive também pode ser compactada.

  1. Para compactar a saída final do Hive, navegue até a guia Configurações do Hive e defina o hive.exec.compress.output parâmetro como true. O valor predefinido é false.

  2. Para escolher o codec de compactação de saída, adicione a mapred.output.compression.codec propriedade personalizada ao painel Site de colmeia personalizado, conforme descrito na etapa 3 da seção anterior.

    Apache Hive custom property add2.

Permitir execução especulativa

A execução especulativa inicia um certo número de tarefas duplicadas para detetar e negar a lista do rastreador de tarefas de execução lenta. Ao mesmo tempo em que melhora a execução geral do trabalho, otimizando os resultados de tarefas individuais.

A execução especulativa não deve ser ativada para tarefas MapReduce de longa duração com grandes quantidades de entrada.

  • Para habilitar a execução especulativa, navegue até a guia Configurações do Hive e defina o hive.mapred.reduce.tasks.speculative.execution parâmetro como true. O valor predefinido é false.

    `Hive mapred reduce tasks speculative execution`.

Ajuste partições dinâmicas

O Hive permite criar partições dinâmicas ao inserir registros em uma tabela, sem predefinir todas as partições. Esta capacidade é uma característica poderosa. Embora possa resultar na criação de um grande número de partições. E um grande número de arquivos para cada partição.

  1. Para que o Hive faça partições dinâmicas, o valor do hive.exec.dynamic.partition parâmetro deve ser true (o padrão).

  2. Altere o modo de partição dinâmica para strict. No modo estrito, pelo menos uma partição tem que ser estática. Essa configuração impede consultas sem o filtro de partição na cláusula WHERE, ou seja, impede estritamente consultas que verificam todas as partições. Navegue até a guia Configurações do Hive e defina hive.exec.dynamic.partition.mode como strict. O valor padrão é nonstrict.

  3. Para limitar o número de partições dinâmicas a serem criadas, modifique o hive.exec.max.dynamic.partitions parâmetro. O valor padrão é 5000.

  4. Para limitar o número total de partições dinâmicas por nó, modifique hive.exec.max.dynamic.partitions.pernodeo . O valor padrão é 2000.

Ativar o modo local

O modo local permite que o Hive execute todas as tarefas de um trabalho em uma única máquina. Ou, às vezes, em um único processo. Essa configuração melhora o desempenho da consulta se os dados de entrada forem pequenos. E a sobrecarga de iniciar tarefas para consultas consome uma porcentagem significativa da execução geral da consulta.

Para habilitar o modo local, adicione o hive.exec.mode.local.auto parâmetro ao painel Site de colmeia personalizado, conforme explicado na etapa 3 da seção Habilitar compactação intermediária.

Apache Hive exec mode local auto.

Definir único MapReduce MultiGROUP BY

Quando essa propriedade é definida como true, uma consulta MultiGROUP BY com chaves comuns group-by gera um único trabalho MapReduce.

Para habilitar esse comportamento, adicione o hive.multigroupby.singlereducer parâmetro ao painel Site de colmeia personalizado, conforme explicado na etapa 3 da seção Habilitar compactação intermediária.

Hive set single MapReduce MultiGROUP BY.

Otimizações adicionais do Hive

As seções a seguir descrevem otimizações adicionais relacionadas ao Hive que você pode definir.

Otimizações de ingresso

O tipo de junção padrão no Hive é uma junção aleatória. No Hive, mapeadores especiais leem a entrada e emitem um par chave/valor de junção para um arquivo intermediário. O Hadoop classifica e mescla esses pares em um estágio aleatório. Esta fase de baralhar é cara. Selecionar a associação certa com base nos seus dados pode melhorar significativamente o desempenho.

Tipo de Adesão Quando Como Configurações do Hive Comentários
Juntar-se a Shuffle
  • Escolha padrão
  • Sempre funciona
  • Leituras de parte de uma das tabelas
  • Buckets e classifica na chave Join
  • Envia um bucket para cada redução
  • A adesão é feita no lado Reduzir
Nenhuma configuração Hive significativa necessária Funciona sempre
Mapa Aderir
  • Uma mesa pode caber na memória
  • Lê pequenas tabelas na tabela hash da memória
  • Transmite através de parte do arquivo grande
  • Associa cada registo da tabela hash
  • As adesões são feitas apenas pelo mapeador
hive.auto.confvert.join=true Rápido, mas limitado
Classificar bucket de mesclagem Se ambas as tabelas forem:
  • Ordenado o mesmo
  • Balde o mesmo
  • Juntando-se na coluna classificada/bucketed
Cada processo:
  • Lê um bucket de cada tabela
  • Processa a linha com o menor valor
hive.auto.convert.sortmerge.join=true Eficiente

Otimizações do mecanismo de execução

Recomendações adicionais para otimizar o motor de execução Hive:

Definição Recomendado HDInsight Predefinido
hive.mapjoin.hybridgrace.hashtable True = mais segura, mais lenta; false = mais rápida false
tez.am.resource.memory.mb Limite superior de 4 GB para a maioria Sintonizado automaticamente
tez.session.am.dag.submit.timeout.secs 300+ 300
tez.am.container.idle.release-timeout-min.millis 20000+ 10000
tez.am.container.idle.release-timeout-max.millis 40000+ 20 000

Próximos passos