Partilhar via


Otimizar o Apache Hive com o Apache Ambari no Azure HDInsight

O Apache Ambari é uma interface web para gerenciar e monitorar clusters HDInsight. Para uma introdução à interface web do Ambari, consulte Gerir clusters HDInsight utilizando a Interface 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. No separador Hive Configs, digite motor de execução na caixa de filtro.

    Mecanismo de execução Apache Ambari Search.

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

    Otimização - motor Apache Tez.

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).

    Tamanhos de agrupamento de Apache Ambari Tez.

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 Dados por Reducer.

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

    Ambari Data per Reducer - editado.

    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.

    Exibição de execução paralela do Apache Hive.

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.

    Execução vetorizada do Apache Hive.

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é ConfigsSettings do Hive> e encontre Ativar Otimizador Baseado em Custos, depois alterne o interruptor para Ativado.

Otimizador baseado em custos do HDInsight.

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(*).

    Consulta de computação do Apache Hive usando estatísticas.

  • 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.

    As estatísticas do Apache Hive definem estatísticas de coluna.

  • 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 obtidas no metastore. Quando falso, o tamanho do ficheiro é obtido no sistema de ficheiros. E o número de linhas é obtido a partir do esquema de linha.

    As estatísticas do Hive definem estatísticas de partição.

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 limitados por gargalos de entrada/saída. 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 Yes
LZO Lzop LZO .lzo Sim, se indexado
Rápido N/A Rápido Á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».

    Observação

    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 intermédia, adicione a propriedade personalizada mapred.map.output.compression.codec ao arquivo hive-site.xml ou mapred-site.xml.

  3. Para adicionar uma configuração personalizada:

    a) Navegue até Hive>Configurações>Avançado>Configuração personalizada do 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.

    'Adicionar propriedade personalizada do Apache Hive'.

    Essa configuração compactará o arquivo intermediário usando a compactação Snappy. Uma vez que a propriedade seja adicionada, ela aparece no painel hive-site personalizado.

    Observação

    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é o separador Configurações do Hive e defina o parâmetro hive.exec.compress.output como true. O valor predefinido é false.

  2. Para escolher o codec de compressão de saída, adicione a mapred.output.compression.codec propriedade personalizada ao painel de Hive-site personalizado, conforme descrito no passo 3 da secção anterior.

    Propriedade personalizada do Apache Hive

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 ativar a execução especulativa, navegue até ao separador Configurações do Hive e defina o parâmetro hive.mapred.reduce.tasks.speculative.execution como verdadeiro. O valor predefinido é false.

    'Hive mapred reduzir tarefas de execução especulativa'.

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 ficheiros 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.pernode. 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 parâmetro hive.exec.mode.local.auto ao painel hive-site personalizado, conforme explicado na etapa 3 da seção Habilitar compactação intermediária.

Modo de execução local automático do Apache Hive.

Definir único MapReduce MultiGROUP BY

Quando esta propriedade é definida como verdadeira, uma consulta MultiGROUP BY com chaves de agrupamento comuns gera uma única tarefa MapReduce.

Para habilitar este comportamento, adicione o parâmetro hive.multigroupby.singlereducer ao painel hive-site personalizado, conforme explicado na etapa 3 da seção Habilitar compactação intermédia.

Conjunto Hive único 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 junção

O tipo de junção padrão no Hive é um shuffle join. 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 Observações
Juntar-se a Shuffle
  • Escolha padrão
  • Sempre funciona
  • Leituras de parte de uma das tabelas
  • Agrupa e ordena na chave de junção
  • Envia um bucket para cada redução
  • O join é feito no lado do Reduce
Nenhuma configuração Hive significativa necessária Funciona sempre
Junção de Mapa
  • Uma tabela pode caber na memória
  • Lê uma tabela pequena na tabela de hash da memória
  • Transmite através de parte de um ficheiro grande
  • Junta cada registro da tabela de hash
  • As uniões são feitas apenas pelo mapeador
hive.auto.convert.join=true Rápido, mas limitado
Classificar bucket de mesclagem Se ambas as tabelas forem:
  • Ordenado da mesma forma
  • Agrupado da mesma forma
  • Juntando-se na coluna classificada/bucketed
Cada processo:
  • Lê um segmento de cada tabela
  • Processa a linha com o menor valor
hive.auto.convert.sortmerge.join=true Eficiência

Otimizações do mecanismo de execução

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

Configurações Recomendado HDInsight Predefinido
hive.mapjoin.hybridgrace.hashtable True = mais segura, mais lenta; false = mais rápida falso
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+ 10 000
tez.am.container.idle.release-timeout-max.millis 40000+ 20 000

Próximos passos