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.
- Para modificar os parâmetros de configuração do Hive, selecione Hive na barra lateral Serviços.
- 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:
Na guia Configurações do Hive, digite mecanismo de execução na caixa de filtro.
O valor padrão da propriedade Optimization é 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).
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 etez.grouping.min-size
.Defina ambos os parâmetros como 33.554.432 bytes (32 MB).
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.
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.
Selecione Editar para modificar o valor para 128 MB (134.217.728 bytes) e pressione Enter para salvar.
Dado um tamanho de entrada de 1.024 MB, com 128 MB de dados por redutor, existem oito redutores (1024/128).
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.
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.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.
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.
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.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.
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.
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(*)
.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.
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.
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.
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.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.
Para definir o codec de compressão intermediário, adicione a propriedade
mapred.map.output.compression.codec
personalizada aohive-site.xml
arquivo oumapred-site.xml
.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 eorg.apache.hadoop.io.compress.SnappyCodec
como o valor.d. Selecione Adicionar.
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.
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.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.
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.
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.
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).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.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.Para limitar o número total de partições dinâmicas por nó, modifique
hive.exec.max.dynamic.partitions.pernode
o . 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.
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.
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 |
|
|
Nenhuma configuração Hive significativa necessária | Funciona sempre |
Mapa Aderir |
|
|
hive.auto.convert.join=true |
Rápido, mas limitado |
Classificar bucket de mesclagem | Se ambas as tabelas forem:
|
Cada processo:
|
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
- Gerenciar clusters HDInsight com a interface do usuário da Web do Apache Ambari
- Apache Ambari REST API
- Optimize Apache Hive queries in Azure HDInsight (Otimizar as consultas do Apache Hive no Azure HDInsight)
- Otimizar clusters
- Otimizar o Apache HBase
- Otimizar o Apache Pig