Melhorar suas consultas colmeia com índices

Criar um índice é prática comum com bancos de dados relacionais quando você quiser acelerar o acesso a uma coluna ou conjunto de colunas em seu banco de dados. Sem um índice, o sistema de banco de dados tem de ler todas as linhas na tabela para encontrar os dados que você selecionou. Índices tornam-se ainda mais essencial quando as tabelas crescem muito grande, e como você já sabe, sem dúvida, Hive prospera em tabelas grandes.

Como seria de esperar, Hive suporta a criação do índice em tabelas, embora a sua funcionalidade ainda é um pouco imaturo. No entanto, a comunidade Hive é ativo, e indexação acabará por amadurecer. Mesmo com suas limitações atuais, indexação oferece uma abordagem para acelerar as consultas colmeia com pouco esforço.

Você pode otimizar consultas Hive em pelo menos cinco maneiras: primeiro, com um pouco de pesquisa, muitas vezes você pode acelerar a sua junta-se, aproveitando certas técnicas de otimização, conforme descrito no wiki hive. Em segundo lugar, as opções de armazenamento orientada a coluna pode ser bastante útil. Lembre-se que o formato de arquivo ORC é novo a partir de Hive 0,11.

Em terceiro lugar, você pode particionar tabelas. Em quarto lugar, a comunidade Hive tem proporcionado indexação. Finalmente, não se esqueça do hive.exec.mode.local.auto variável de configuração.

No seguinte são as etapas necessárias para indexar o FlightInfo2008 mesa. Esta extremamente grande mesa tem milhões de linhas, por isso faz um bom candidato para um índice ou dois.

(A) CRIAR f08_index INDEX ON flightinfo2008 TABLE (Origin) AS 'compacto' COM REBUILD- diferidos (B) ALTER f08_index ON flightinfo2008 REBUILD- (C) colmeia INDEX (flightdata)> SHOW índices em FlightInfo2008-OKf08indexflightinfo2008 origem flightdata__flightinfo2008_f08index__ compactTime tomadas: 0,079 segundos, obtida: 1 linha (s) (D) das colmeias (flightdata)> DESCREVER flightdata__flightinfo2008_f08index __- OKorigin cadeia string_offsetsarray None_bucketnameTempo necessário: 0,112 segundos, obtida: 3 linha (s) (E) das colmeias (flightdata)> Origem SELECT, COUNT (1) DE flightinfo2008 onde o grupo de Origem = 'SYR' por origem-SYR 12032Time tomadas: 17,34 segundos, obtida: 1 linha (s) (F) das colmeias (flightdata)> origem SELECT, SIZE ( `_offsets`) dE ONDE flightdata__flightinfo2008_f08index__ origem = 'SYR'-SYR 12032Time tomadas: 8.347 segundos, obtida: 1 linha (s) (G) colmeias (flightdata )> DESCREVER flightdata__flightinfo2008_f08index __- cadeia OKorigin string_offsetsarray None_bucketnameTempo gasto: 0,12 segundos, obtida: 3 linha (s)

O passo (a) cria o índice utilizando o 'COMPACTAR'Manipulador de índice na Origem coluna. Hive também oferece um manipulador índice de bitmap a partir do release 0.8, que se destina para a criação de índices em colunas com alguns valores exclusivos.

No Passo (A) as palavras-chave COM FUTUROS RECONSTRUÇÃO instrui Hive para criar primeiro um passo indexação vazio (B) é onde você realmente criar o índice com o ALTER INDEX ... REBUILD comando. índice adiada constrói pode ser muito útil em fluxos de trabalho onde um processo cria as tabelas e índices, outro carrega os dados e constrói os índices e um processo final realiza análises de dados.

O ramo não fornecer a manutenção do índice automático, então você precisa reconstruir o índice se você substituir ou acrescentar dados à tabela. Além disso, os índices Hive suportar partições de tabela, de modo que uma reconstrução pode ser limitada a uma partição. Passo (C) ilustra como você pode listar ou mostrar os índices criados contra uma tabela específica.

Passo (D) ilustra um ponto importante sobre índices Hive: índices Hive são implementados como tabelas. É por isso que você precisa primeiro criar a tabela de índice e, em seguida, construí-lo para preencher a tabela. Portanto, você pode usar índices em pelo menos duas maneiras:

  • Conte com o sistema para usar automaticamente índices que criar.

  • Reescrever algumas consultas para alavancar a nova tabela de índice.

O uso automático de índices está progredindo, mas este aspecto é um trabalho em progresso. Concentrando-se na segunda opção, no Passo (E) você escreve uma consulta que procura determinar quantos vôos deixaram o aeroporto de Syracuse em 2008. Para obter essa informação, você alavancar o CONTAGEM função de agregação.

Você pode ver que Hive tomou 17.32 segundos na máquina virtual para informar que 12,032 voos provenientes de Syracuse, Nova York.

No Passo (F), você alavancar a nova tabela de índice e usar o TAMANHO funcionar em seu lugar. Passo (F) faz mais sentido depois de estudar passo (D): Passo (D) mostra o que uma tabela de índice parece, onde os registros de cada porão da coluna _bucketname, que é a localização dos dados no armazém colmeia (/ Home / BiAdmin / colmeia / armazém, neste caso), e um _offsets matriz, que é o índice para a mesa (FlightInfo2008) nesse caso.

Então agora a pergunta no Passo (F) faz sentido. Todos Hive tem que fazer é encontrar o SYR origem (por Siracusa) na flightdata__flightinfo2008_f08index__ Mesa e, em seguida, contar as linhas na _offsets' matriz para obter o número de voos - uma maneira simples, mas elegante para dobrar a performance (8.347 segundos no Passo (F) versus 17,34 na Passo (E)) da consulta original.

menu