Bucketing no Hive: criar tabela de bucket no Hive
Publicados: 2021-02-17Trabalhar com um grande conjunto de dados pode ser um desafio. Há muito o que acompanhar e um pequeno erro pode atrapalhar todo o seu fluxo de trabalho. Uma das ferramentas mais importantes para gerenciar grandes conjuntos de dados é o bucketing.
Este artigo falará sobre como você pode realizar o bucketing no Hive. Exploraremos várias implementações dessa função por meio de exemplos.
Índice
O que é Bucketing no Hive?
Bucketing é uma técnica de organização de dados. Embora o particionamento e o bucketing no Hive sejam conceitos bastante semelhantes, o bucketing oferece a funcionalidade adicional de dividir grandes conjuntos de dados em conjuntos menores e mais gerenciáveis chamados buckets.
Com o bucketing no Hive, você pode decompor um conjunto de dados de tabela em partes menores, tornando-os mais fáceis de manusear. O bucketing permite agrupar tipos de dados semelhantes e gravá-los em um único arquivo, o que aprimora seu desempenho ao unir tabelas ou ler dados. Essa é uma grande razão pela qual usamos o bucketing com particionamento na maioria das vezes.
Quando usamos o balde?
Bucketing é uma funcionalidade muito útil. Se você não a usou antes, lembre-se dos seguintes pontos para determinar quando usar essa função:
- Quando uma coluna tem uma cardinalidade alta, não podemos fazer o particionamento nela. Um número muito alto de partições gerará muitos arquivos Hadoop, o que aumentaria a carga no nó. Isso porque o nó terá que manter os metadados de cada partição e isso afetaria o desempenho desse nó.
- Você deve usar o agrupamento se suas consultas tiverem várias junções no lado do mapa. Uma junção do lado do mapa é um processo em que você une duas tabelas usando apenas a função map sem usar a função reduce.
Destaques do Bucketing no Hive
O bucketing é baseado na função de hash, portanto, possui os seguintes destaques:
- A função hash_depende do tipo de coluna de agrupamento que você possui.
- Você deve ter em mente que os registros com a mesma coluna em bucket seriam armazenados no mesmo bucket.
- Essa função requer que você use a cláusula Clustered By para dividir uma tabela em buckets.
- No diretório da tabela, a numeração do bucket é baseada em 1 e cada bucket é um arquivo.
- Bucketing é uma função independente. Isso significa que você pode realizar o bucketing sem executar o particionamento em uma tabela.
- Uma tabela em bucket cria seções de arquivo de dados quase igualmente distribuídas.
- Observe que o agrupamento não garante que sua tabela seja preenchida corretamente. Portanto, você mesmo terá que gerenciar o carregamento de dados nos buckets, o que pode ser complicado.
Leia: Hive vs Spark
Bucketing no Hive: Exemplo #1
Seria melhor entender o bucketing no Hive usando um exemplo. Usaremos os seguintes dados para nosso exemplo:
EMPID | PRIMEIRO NOME | ÚLTIMO NOME | ESPORTES | CIDADE | PAÍS |
1001 | Emerry | Blair | Basquetebol | Qutubulapur | São Marinho |
1002 | Zephr | Stephenson | Grilo | Neerharen | República Dominicana |
1003 | Outono | Feijão | Basquetebol | Neerharen | República Dominicana |
1004 | Kasimiro | Vance | Badminton | Neerharen | República Dominicana |
1005 | Mufutau | Flores | Qutubulapur | São Marinho | |
1006 | Ayanna | Bancos | Futebol | Neerharen | República Dominicana |
1007 | Selma | Bola | tênis | Qutubulapur | São Marinho |
1008 | Berk | Mais cheio | Badminton | Neerharen | República Dominicana |
1009 | Imogene | Terrel | Qutubulapur | São Marinho | |
1010 | Colorado | Hutchinson | tênis | Qutubulapur | São Marinho |
Nossos dados de amostra contêm informações de funcionários de uma equipe esportiva. No entanto, alguns dos funcionários não fazem parte de nenhuma equipe.
Aqui estão os dados de exemplo que você pode copiar e colar para acompanhar este exemplo:
id,Nome,Sobrenome,Esportes,Cidade,País
1001,Emerry, Blair, Basquete, Qutubulapur, San Marino
1002, Zephr, Stephenson, Cricket, Neerharen, República Dominicana
1003, Outono, Feijão, Basquetebol, Neerharen, República Dominicana
1004, Kasimir, Vance, Badminton, Neerharen, República Dominicana
1005, Mufutau, Flores, Qutubulapur, San Marino
1006, Ayanna, Bancos, Futebol, Neerharen, República Dominicana
1007,Selma,Bola,Tênis,Qutubulapur,San Marino
1008, Berk, Fuller, Badminton, Neerharen, República Dominicana
1009,Imogene,Terrell,,Qutubulapur,San Marino
1010,Colorado,Hutchinson,Tênis,Qutubulapur,São Marino
Já sabemos que o bucketing nos permite agrupar conjuntos de dados em seções menores para otimização. Vamos agora discutir como se completa este processo:
Criando a Tabela Base
Primeiro, vamos criar uma tabela chamada employee_base:
CRIAR TABELA db_bdpbase.employee_base (
Emplid INT,
nome STRING,
sobrenome STRING,
esportes STRING,
cidade STRING,
país STRING
)
FORMATO DE LINHA DELIMITADO
CAMPOS TERMINADOS POR ','
ARMAZENADO COMO TEXTFILE
TBLPROPERTIES(“skip.header.line.count”=”1”);
Nossos dados de exemplo têm um cabeçalho que não é necessário para o agrupamento, então vamos removê-lo adicionando a propriedade 'skip header'.
Carregando os dados na Tabela Base
Usaremos o local '/usr/bdp/hive/sample_data.csv' para nossos dados de amostra e usaremos o seguinte comando para carregá-los na tabela:
LOAD DATA INPATH '/user/bdp/hive/sample_data.csv' INTO TABLE db_bdpbase.employee_base;
Criando a tabela de bucket
Nesta seção, criaremos uma tabela em bucket. Agora podemos fazer uma tabela em bucket com uma partição ou sem partição.
Tabela em bucket com partição
Nesse caso, o país é a coluna de partição e agrupamos a coluna empid que classificamos em ordem crescente:
CRIAR TABELA db_bdpbase.bucketed_partition_tbl (
INT empírico,
nome STRING,
sobrenome STRING,
esportes STRING,
cidade STRING
) PARTICIONADO POR(país STRING)
CLUSTERADO POR (empid)
ORDENADO POR (ASC empid) EM 4 BALDES;
Tabela em bucket sem partição
Alternativamente, podemos criar uma tabela em bucket sem partição:
CREATE TABLE db_bdpbase.bucketed_tbl_only (
INT empírico,
nome STRING,
sobrenome STRING,
cidade STRING,
País STRING
)
CLUSTERADO POR (empid)
ORDENADO POR (ASC empid) EM 4 BALDES;
Aqui, agrupamos a tabela na mesma coluna empid.
Configurando a propriedade
A configuração padrão para bucketing no Hive está desabilitada, então a habilitamos definindo seu valor como true. A seguinte propriedade selecionaria o número de clusters e redutores de acordo com a tabela:
SET hive.enforce.bucketing=TRUE; (NÃO necessário no Hive 2.x em diante)
Carregando dados na tabela de bucket
Até agora, criamos duas tabelas em bucket e uma tabela base com nossos dados de amostra. Agora carregaremos os dados na tabela em bucket da tabela base usando o seguinte comando na tabela em bucket com partição:
INSERT OVERWRITE TABLE db_bdpbase.bucketed_partition_tbl PARTITION (país) SELECT * FROM db_bdpbase.employee_base;
Para carregar dados na tabela em bucket sem nenhuma partição, usaremos o seguinte comando:
INSERT OVERWRITE TABLE db_bdpbase.bucketed_tbl_only SELECT * FROM db_bdpbase.employee_base;
Verificando os dados da tabela agrupada
Após carregar os dados na tabela em bucket, verificaremos como eles estão armazenados no HDFS. Usaremos o seguinte código para verificar a tabela em bucket com partição:
hadoop fs -ls hdfs://sandbox.hortonworks.com:8020/apps/hive/warehouse/db_bdpbase.db/bucketed_partition_tbl
Armazenamento de dados em tabelas em bucket
Cada ponto de dados é mapeado para um específico de acordo com a seguinte fórmula:
hash_function(bucket_column) modo num_bucket
Agora, considere a primeira tabela que particionamos com base no país, nossos dados de amostra serão divididos nas seguintes seções:
EMPID | PRIMEIRO NOME | ÚLTIMO NOME | ESPORTES | CIDADE | PAÍS |
1002 | Zephr | Stephenson | Grilo | Neerharen | República Dominicana |
1003 | Outono | Feijão | Basquetebol | Neerharen | República Dominicana |
1004 | Kasimiro | Vance | Badminton | Neerharen | República Dominicana |
1006 | Ayanna | Bancos | Futebol | Neerharen | República Dominicana |
1008 | Berk | Mais cheio | Badminton | Neerharen | República Dominicana |
EMPID | PRIMEIRO NOME | ÚLTIMO NOME | ESPORTES | CIDADE | PAÍS |
1001 | Emerry | Blair | Basquetebol | Qutubulapur | São Marinho |
1005 | Mufutau | Flores | Qutubulapur | São Marinho | |
1007 | Selma | Bola | tênis | Qutubulapur | São Marinho |
1009 | Imogene | Terrel | Qutubulapur | São Marinho | |
1010 | Colorado | Hutchinson | tênis | Qutubulapur | São Marinho |
Para a República Dominicana, todas as linhas serão armazenadas no bucket:
hash_function(1002) mode 4 = 2 (representando o índice do bucket)
hash_function(1003) modo 4 = 3
hash_function(1004) modo 4 = 0
hash_function(1006) modo 4 = 2
hash_function(1008) modo 4 = 0
Observe que a função hash do valor INT fornecerá o mesmo resultado. Você pode verificar os dados em cada arquivo no local do HDFS. Se desejar, você pode repetir esse processo para outros países presentes no banco de dados.
Bucketing no Hive: Exemplo #2
Como já abordamos as várias etapas e procedimentos presentes na implementação dessa função, podemos experimentá-la facilmente. Veja a seguir um exemplo simples de bucketing no Hive. Aqui, apenas agrupamos os dados disponíveis em diferentes partes para que possamos gerenciá-los mais facilmente:
0: jdbc:hive2://cdh-vm.dbaglobe.com:10000/def> criar tabela month_taxi_fleet6
. . . . . . . . . . . . . . . . . . . . . . .> (mês char(7),fleet smallint,company varchar(50))
. . . . . . . . . . . . . . . . . . . . . . .> agrupado por (empresa) em 3 buckets
. . . . . . . . . . . . . . . . . . . . . . .> armazenado como avro;
Exemplo usando Apache Hive versão 1.1.0-cdh5.13.1, hive.enforce.bucketing=false por padrão
0: jdbc:hive2://cdh-vm.dbaglobe.com:10000/def> inserir em month_taxi_fleet6
. . . . . . . . . . . . . . . . . . . . . . .> selecione mês, frota, empresa de month_taxi_fleet;
[upgrad@cdh-vm ~]$ hdfs dfs -ls -R /user/hive/warehouse/monthly_taxi_fleet6
-rwxrwxrwt 1 atualização hive 25483 2017-12-26 10:40 /user/hive/warehouse/monthly_taxi_fleet6/000000_0
— hive.enforce.bucketing: se o bucketing é aplicado. Se true, durante a inserção na tabela, o bucketing é aplicado.
— Valor padrão: Hive 0.x: false, Hive 1.x: false, Hive 2.x: removido, o que efetivamente o torna sempre verdadeiro (HIVE-12331)
0: jdbc:hive2://cdh-vm.dbaglobe.com:10000/def> set hive.enforce.bucketing=true;
0: jdbc:hive2://cdh-vm.dbaglobe.com:10000/def> inserir em month_taxi_fleet6
. . . . . . . . . . . . . . . . . . . . . . .> selecione mês, frota, empresa de month_taxi_fleet;
[upgrad@cdh-vm ~]$ hdfs dfs -ls -R /user/hive/warehouse/monthly_taxi_fleet6
-rwxrwxrwt 1 atualização hive 13611 2017-12-26 10:43 /user/hive/warehouse/monthly_taxi_fleet6/000000_0
-rwxrwxrwt 1 atualização hive 6077 2017-12-26 10:43 /user/hive/warehouse/monthly_taxi_fleet6/000001_0
-rwxrwxrwt 1 atualização hive 6589 2017-12-26 10:43 /user/hive/warehouse/monthly_taxi_fleet6/000002_0
0: jdbc:hive2://cdh-vm.dbaglobe.com:10000/def> descrever mensal_taxi_fleet6 estendido;
+—————————+—————————————————-+———-+–+
| nome_coluna | data_type | comentar |
+—————————+—————————————————-+———-+–+
| mês | caractere(7) | |
| frota | int | |
| empresa | varchar(50) | |
| | NULO | NULO |
| Informações detalhadas da tabela | Table(tableName:monthly_taxi_fleet6, dbName:default, owner:upgrad, createTime:1514256031, lastAccessTime:0, retenção:0, sd:StorageDescriptor(cols:[FieldSchema(name:month, type:char(7), comment:null) , FieldSchema(nome:frota, tipo:pequeno, comentário:nulo), FieldSchema(nome:empresa, tipo:varchar(50), comentário:nulo)], localização:hdfs://cdh-vm.dbaglobe.com:8020 /user/hive/warehouse/monthly_taxi_fleet6, inputFormat:org.apache.hadoop.hive.ql.io.avro.AvroContainerInputFormat, outputFormat:org.apache.hadoop.hive.ql.io.avro.AvroContainerOutputFormat, compact:false, numBuckets :3, serdeInfo:SerDeInfo(name:null, serializationLib:org.apache.hadoop.hive.serde2.avro.AvroSerDe, parameters:{serialization.format=1}), bucketCols:[company], sortCols:[], parameters :{}, skewedInfo:SkewedInfo(skewedColNames:[], skewedColValues:[], skewedColValueLocationMaps:{}), storedAsSubDirectories:false), partitionKeys:[], parameters:{totalSize=26277, numRows=1128, rawDataSize=0, COLUMN_STATS_ACCURATE =true, numArquivos=3, tra nsient_lastDdlTime=1514256192}, viewOriginalText:null, viewExpandedText:null, tableType:MANAGED_TABLE) | |
+—————————+—————————————————-+———-+–+
5 linhas selecionadas (0,075 segundos)
Checkout: Perguntas básicas da entrevista do Hive
Bucketing no Hive: Exemplo #3
Abaixo está um pequeno exemplo avançado de bucketing no Hive. Aqui, realizamos o particionamento e usamos a funcionalidade Sorted By para tornar os dados mais acessíveis. Esta é uma das maiores vantagens da caçamba. Você pode usá-lo com outras funções para gerenciar grandes conjuntos de dados com mais eficiência e eficácia.
0: jdbc:hive2://cdh-vm.dbaglobe.com:10000/def> criar tabela month_taxi_fleet7
. . . . . . . . . . . . . . . . . . . . . . .> (mês char(7),fleet smallint)
. . . . . . . . . . . . . . . . . . . . . . .> particionado por (empresa varchar(50))
. . . . . . . . . . . . . . . . . . . . . . .> agrupado por (mês) classificado por (mês) em 3 buckets
. . . . . . . . . . . . . . . . . . . . . . .> armazenado como avro;
0: jdbc:hive2://cdh-vm.dbaglobe.com:10000/def> inserir em month_taxi_fleet7
. . . . . . . . . . . . . . . . . . . . . . .> partição (empresa)
. . . . . . . . . . . . . . . . . . . . . . .> selecione mês, frota, empresa de month_taxi_fleet;
[upgrad@cdh-vm ~]$ hdfs dfs -ls -R /user/hive/warehouse/monthly_taxi_fleet7
drwxrwxrwt – atualização do hive 0 2017-12-26 11:05 /user/hive/warehouse/monthly_taxi_fleet7/company=CityCab
-rwxrwxrwt 1 atualização hive 865 2017-12-26 11:05 /user/hive/warehouse/monthly_taxi_fleet7/company=CityCab/000000_0
-rwxrwxrwt 1 atualização hive 865 2017-12-26 11:05 /user/hive/warehouse/monthly_taxi_fleet7/company=CityCab/000001_0
-rwxrwxrwt 1 atualização hive 865 2017-12-26 11:05 /user/hive/warehouse/monthly_taxi_fleet7/company=CityCab/000002_0
drwxrwxrwt – atualização do hive 0 2017-12-26 11:05 /user/hive/warehouse/monthly_taxi_fleet7/company=Confort
-rwxrwxrwt 1 atualização hive 913 2017-12-26 11:05 /user/hive/warehouse/monthly_taxi_fleet7/company=Comfort/000000_0
-rwxrwxrwt 1 atualização hive 913 2017-12-26 11:05 /user/hive/warehouse/monthly_taxi_fleet7/company=Comfort/000001_0
-rwxrwxrwt 1 atualização hive 913 2017-12-26 11:05 /user/hive/warehouse/monthly_taxi_fleet7/company=Comfort/000002_0
drwxrwxrwt – atualizar colmeia 0 26/12/2017 11:05 /user/hive/warehouse/monthly_taxi_fleet7/company=Individual Yellow- Top
-rwxrwxrwt 1 atualização hive 865 2017-12-26 11:05 /user/hive/warehouse/monthly_taxi_fleet7/company=Individual Yellow- Top/000000_0
-rwxrwxrwt 1 atualização hive 865 2017-12-26 11:05 /user/hive/warehouse/monthly_taxi_fleet7/company=Individual Yellow- Top/000001_0
-rwxrwxrwt 1 atualização hive 865 2017-12-26 11:05 /user/hive/warehouse/monthly_taxi_fleet7/company=Individual Yellow- Top/000002_0
drwxrwxrwt – atualização do hive 0 2017-12-26 11:05 /user/hive/warehouse/monthly_taxi_fleet7/company=Premier
-rwxrwxrwt 1 atualização hive 865 2017-12-26 11:05 /user/hive/warehouse/monthly_taxi_fleet7/company=Premier/000000_0
-rwxrwxrwt 1 atualização hive 865 2017-12-26 11:05 /user/hive/warehouse/monthly_taxi_fleet7/company=Premier/000001_0
-rwxrwxrwt 1 atualização hive 865 2017-12-26 11:05 /user/hive/warehouse/monthly_taxi_fleet7/company=Premier/000002_0
drwxrwxrwt – atualização do hive 0 2017-12-26 11:05 /user/hive/warehouse/monthly_taxi_fleet7/company=Prime
-rwxrwxrwt 1 atualização hive 765 2017-12-26 11:05 /user/hive/warehouse/monthly_taxi_fleet7/company=Prime/000000_0
-rwxrwxrwt 1 atualização hive 765 2017-12-26 11:05 /user/hive/warehouse/monthly_taxi_fleet7/company=Prime/000001_0
-rwxrwxrwt 1 atualização hive 766 2017-12-26 11:05 /user/hive/warehouse/monthly_taxi_fleet7/company=Prime/000002_0
drwxrwxrwt – atualizar colmeia 0 2017-12-26 11:05 /user/hive/warehouse/monthly_taxi_fleet7/company=SMRT
-rwxrwxrwt 1 atualização hive 865 2017-12-26 11:05 /user/hive/warehouse/monthly_taxi_fleet7/company=SMRT/000000_0
-rwxrwxrwt 1 atualização hive 865 26/12/2017 11:05 /user/hive/warehouse/monthly_taxi_fleet7/company=SMRT/000001_0
-rwxrwxrwt 1 atualização hive 865 2017-12-26 11:05 /user/hive/warehouse/monthly_taxi_fleet7/company=SMRT/000002_0
drwxrwxrwt – atualização do hive 0 2017-12-26 11:05 /user/hive/warehouse/monthly_taxi_fleet7/company=Smart
-rwxrwxrwt 1 atualização hive 720 2017-12-26 11:05 /user/hive/warehouse/monthly_taxi_fleet7/company=Smart/000000_0
-rwxrwxrwt 1 atualização hive 719 2017-12-26 11:05 /user/hive/warehouse/monthly_taxi_fleet7/company=Smart/000001_0
-rwxrwxrwt 1 atualização hive 719 2017-12-26 11:05 /user/hive/warehouse/monthly_taxi_fleet7/company=Smart/000002_0
drwxrwxrwt – atualização do hive 0 2017-12-26 11:05 /user/hive/warehouse/monthly_taxi_fleet7/company=TransCab
-rwxrwxrwt 1 atualização hive 865 2017-12-26 11:05 /user/hive/warehouse/monthly_taxi_fleet7/company=TransCab/000000_0
-rwxrwxrwt 1 atualização hive 865 2017-12-26 11:05 /user/hive/warehouse/monthly_taxi_fleet7/company=TransCab/000001_0
-rwxrwxrwt 1 atualização hive 865 2017-12-26 11:05 /user/hive/warehouse/monthly_taxi_fleet7/company=TransCab/000002_0
drwxrwxrwt – atualização do hive 0 2017-12-26 11:05 /user/hive/warehouse/monthly_taxi_fleet7/company=YTC
-rwxrwxrwt 1 atualização hive 432 2017-12-26 11:05 /user/hive/warehouse/monthly_taxi_fleet7/company=YTC/000000_0
-rwxrwxrwt 1 atualização hive 432 2017-12-26 11:05 /user/hive/warehouse/monthly_taxi_fleet7/company=YTC/000001_0
-rwxrwxrwt 1 atualização hive 432 2017-12-26 11:05 /user/hive/warehouse/monthly_taxi_fleet7/company=YTC/000002_0
Saiba mais sobre particionamento e bucketing no Hive
Nos exemplos que compartilhamos antes, realizamos particionamento e bucketing no Hive de várias maneiras e aprendemos sobre como implementá-los no Hive. No entanto, o Apache Hive tem muitas outras funcionalidades e aprender sobre todas elas pode ser bastante assustador.
É por isso que recomendamos fazer um curso de engenharia de dados. Isso permitiria que você estudasse com especialistas do setor que passaram anos nesse setor. Um curso fornece um currículo estruturado onde você aprende tudo passo a passo. Na upGrad, oferecemos cursos dedicados de engenharia de dados .
Com nossos cursos, você tem acesso ao Student Success Corner do upGrad, onde recebe feedback personalizado de currículo, preparação para entrevistas, aconselhamento de carreira e muitas outras vantagens.
Após a conclusão do curso, você será um profissional de engenharia de dados qualificado.
Conclusão
Bucketing no Hive é muito simples e fácil de executar. É certamente uma função útil para grandes conjuntos de dados. No entanto, quando você executa o particionamento e o bucketing no Hive juntos, você pode gerenciar conjuntos de dados bastante gigantescos com muita facilidade.
Se você estiver interessado em saber mais sobre o Programa Big Data, confira nosso programa PG Diploma in Software Development Specialization in Big Data, projetado para profissionais que trabalham e fornece mais de 7 estudos de caso e projetos, abrange 14 linguagens e ferramentas de programação, em workshops, mais de 400 horas de aprendizado rigoroso e assistência para colocação de emprego com as principais empresas.
Se você tiver dúvidas ou pensamentos sobre o bucketing, compartilhe-os nos comentários abaixo. Adoraríamos ouvir de você.
Confira nossos outros Cursos de Engenharia de Software no upGrad.