Você está na página 1de 64

4.

Hive e Interactive
Query

Carlos Hilario

carlos.hilario@remay.com.br
Agenda
4. Hive e Interactive Query
4.1. O que é o Hive e por que usá-lo ?
4.2. Aspectos Gerais
4.3. Inicializando o Hive
4.4. Tipos de Tabelas
4.5. Tipos de Dados
4.6. Tipos de Arquivos para Armazenamento
4.7. UDFs
4.8. HQL
4.9. Hcatalog
4.10 Otimizações
4.11. Cargas de Dados no Hive
4.12. Tabelas ACID
4.13. LLAP: long-lived execution in Hive
4. Hive - Overview
4. Hive - Overview
4. Hive e Interactive Query
4.1. O que é o Hive e por que usá-lo ?
 O Apache Hive é um sistema de data warehouse para Hadoop que permite:
• Sumarização dos dados
• Consulta e análise de dados usando o HiveQL (uma linguagem de
consulta semelhante à SQL)

 O Hive pode ser usado para explorar interativamente seus dados ou para criar
processamento em lote reutilizáveis.
4.2. Aspectos Gerais
 Consultar esses dados sem o conhecimento de Java ou MapReduce.
 HiveQL (a linguagem de consulta Hive) tem instruções semelhantes à T-SQL.
 Manipular dados estruturados e semi-estruturados, como arquivos de texto
onde os campos são delimitados por caracteres específicos.
 Possui o recurso de serialização/deserialização (SerDe) para dados complexos
ou irregularmente estruturados.
 Possibilita o uso de User Defined Functions (UDFs) nas linguagens java,
python e C#.
4.3. Inicializando o Hive
 Existem algumas maneiras básicas de se trabalhar com o hive:

• Terminal
• hive
• beeline

• Web
• Ambari Hive View
4.3. Inicializando o Hive
 Hive:
• Executável padrão. Também conhecido como hive CLI.
 Beeline:
• Conexão JDBC mais “leve”. É uma das interfaces padrão para se
trabalhar também com o Hive LLAP (será abordado posteriormente).
 Ambari Hive View:
• Ambiente WEB padrão para se trabalhar com as consultas hive. Também
acessa o hive via JDBC e possui suporte para o Hive LLAP.
4.3. Inicializando o Hive
 Abrir o Hive pelo executável padrão:

[sshuser@geral-ssh.azurehdinsight.net]# hive <enter>

Logging initialized using configuration in file:/etc/hive/2.5.0.0-1245/0/hive-log4j.properties

hive>
4.4. Databases e
Tipos de Tabelas
4.4. Databases e Tipos de Tabelas
 CREATE DATABASE
• Cria um banco de dados para as tabelas Hive. É o schema das tabelas.
• Todos os bancos de dados Hive terão uma pasta criada dentro da pasta
padrão /apps/hive/warehouse/.
• A pasta padrão /apps/hive/warehouse/ é considerada como o database
default.
• Um Database pode possuir tabelas internas e também tabelas externas.
• Se uma tabela for criada sem o apontamento de um database, a mesma
será criada no database default.
4.4. Databases e Tipos de Tabelas
 CREATE DATABASE

• Deve-se criar 1 database por usuário no cluster:


hive> CREATE DATABASE wsp_work_<<SeuPrimeiroNome>>; <enter>

• Para visualizar todos os bancos que foram criados:


hive> SHOW DATABASES; <enter>

• Para abrir um dos bancos, utilize a instrução USE:


hive> use wsp_work_<<SeuPrimeiroNome>>; <enter>
4.4. Databases e Tipos de Tabelas
 Tabelas internas x Tabelas externas
 CREATE TABLE
• Cria uma tabela interna (managed table).
• O arquivo de dados deve estar localizado no repositório padrão: HDFS.
• Cria os arquivos de dados na pasta /apps/hive/warehouse/
 CREATE EXTERNAL TABLE
• Cria uma tabela externa (não está na pasta /apps/hive/warehouse/).
• O arquivo de dados pode ser localizado fora do contêiner padrão. Ou
seja, os arquivos de dados podem estar no Blob Storage ou no Datalake
Store.
• Deve ser definida a pasta dos arquivos de dados na instrução
LOCATION.
4.4. Databases e Tipos de Tabelas
 LAB 4.4.2. Execução: CREATE TABLE
create table wsp_work_<<SeuPrimeiroNome>>.BolsaFamiliaFolhaPagamento (
UF string
,Codigo_SIAFI_Municipio string
,Nome_Municipio string
,Codigo_Programa string
,Codigo_Acao string
,NIS_Favorecido string
,Nome_Favorecido string
,Valor_Parcela decimal)
PARTITIONED BY (ano_mes string)
STORED AS ORC
LOCATION
'wasb://hdinatura@hdinatura.blob.core.windows.net/hive/warehouse/wsp_work_<<Se
uPrimeiroNome>>.db/BolsaFamiliaFolhaPagamento'
TBLPROPERTIES (
"orc.compress"="SNAPPY"
);
4.4. Databases e Tipos de Tabelas
 LAB 4.4.3. Execução: CREATE EXTERNAL TABLE
create external table wsp_work_<<SeuPrimeiroNome>>.BolsaFamiliaFolhaPagamento_stage(
UF string
,Codigo_SIAFI_Municipio string
,Nome_Municipio string
,Codigo_Programa string
,Codigo_Acao string
,NIS_Favorecido string
,Nome_Favorecido string
,Valor_Parcela string)
ROW FORMAT DELIMITED
FIELDS TERMINATED BY '\t'
LINES TERMINATED BY '\n'
STORED AS TEXTFILE
LOCATION 'wasb://hdinatura@hdinatura.blob.core.windows.net/datalake/incoming/
BolsaFamiliaFolhaPagamento';
4.4. Databases e Tipos de Tabelas
 LAB 4.4.4. VISUALIZAR AS TABELAS DE UM BANCO
hive> SHOW TABLES ;
4.4. Databases e Tipos de Tabelas
 Instruções típicas de um create table
 ROW FORMAT (DELIMITED, SERDE)
• Indica qual é o formato da linha.

• DELIMITED indica que cada linha da tabela deve ter um caractere


delimitador.

• SERDE indica uma classe de serialização e deserialização. Esta classe é


desenvolvida pelo usuário e deve possuir uma lógica de acesso aos
dados de um grupo de arquivos.
4.4. Databases e Tipos de Tabelas
 EXEMPLO DE SERDE
CREATE TABLE apachelog (
host STRING,
identity STRING,
user STRING,
time STRING,
request STRING,
status STRING,
size STRING,
referer STRING,
agent STRING)
ROW FORMAT SERDE 'org.apache.hadoop.hive.serde2.RegexSerDe'
WITH SERDEPROPERTIES (
"input.regex" = "([^]*) ([^]*) ([^]*) (-|\\[^\\]*\\])
([^ \"]*|\"[^\"]*\") (-|[0-9]*) (-|[0-9]*)(?:
([^ \"]*|\".*\") ([^ \"]*|\".*\"))?"
)STORED AS TEXTFILE;
4.4. Databases e Tipos de Tabelas
 FIELDS TERMINATED BY
• Indica qual é o delimitador de colunas. Exemplos: | ; ,

 LINES TERMINATED BY
• Indica qual é o delimitador de linhas. Exemplo: \n
4.4. Databases e Tipos de Tabelas
 Instruções típicas de um create table
 LOCATION
• Indica em qual localidade os arquivos de dados da tabela serão criados.
Podemos utilizar o HDFS, Blob Storage ou Datalake Store.
 TBLPROPERTIES
• Podemos definir tipo de compactação, filtros e demais configurações para
acessar os dados.
• A tabela pode ser transacional para aceitar operações CRUD.
• Habilita o uso de bloomfilters nas colunas da tabela.
4.5. Tipos de Dados
e Arquivos para
Armazenamento
4.5. Tipos de Dados
TIPOS PRIMITIVOS TIPOS REFERENTES ÀS COLEÇÕES/LISTAS
TINYINT
SMALLINT array_type
INT
ARRAY < data_type >
BIGINT
BOOLEAN
FLOAT map_type
DOUBLE MAP < primitive_type, data_type >
STRING
BINARY struct_type
TIMESTAMP
STRUCT < col_name : data_type [COMMENT col_comment], ...>
DECIMAL
DECIMAL(precision, scale)
DATE union_type
VARCHAR UNIONTYPE < data_type, data_type, ... >
CHAR
4.6. Tipos de Arquivos para Armazenamento
 STORED AS
•.
STORED AS TIPO
TEXTFILE Arquivos texto convencionais. Ex. TXT, CSV
SEQUENCEFILE Arquivos compactados
ORC Formato colunar e indexado com suporte a transações
ACID e Cost Based Optimization (CBO)
PARQUET Formato colunar Parquet. Inicialmente criado para ser o
formato padrão do spark
RCFILE Formato colunar Record Columnar File
4.6. Tipos de Arquivos para Armazenamento
 COMPARATIVO ENTRE OS TIPOS DE ARQUIVOS
•.
4.8. HQL e Otimizações
4.8. HQL
 HQL - HIVE QUERY LANGUAGE

• DQL – Data Query Language


• Permite o uso de SQL Window Aggregate Functions (over, partition, rank)

• DDL – Data Definition Language


• Create/Drop/Alter – Database, Table, Column, View, Index

• DML – Data Manipulation Language


• Insert/Update /Truncate

• DCL – Data Control Language


• Create/Drop/Grant/Revoke Roles e Privileges
4.9 Otimizações
 TEZ QUERY EXECUTION ENGINE

• Tez é um motor de execução de


consultas que substitui o MapReduce
tradicional executando consultas Hive de
forma mais eficiente.

• O diagrama ao lado compara o Tez com


o MapReduce na execução de
consultas:
4.9.1. Otimizações – Tabelas
 O formato ORC – Vantagens:

• Melhor Compressão: Armazenamento colunar e compactado, o que leva


a menores taxas de leituras no disco. O formato colunar é ideal para
otimizações de vetorização no Tez.

• Velocidade nas Leituras: ORC possui índices internos (built-in indexes),


obtenção rápida de valores min / max, e outras melhorias nas agregações
evitando full scan nas tabelas.

• Comprovado em implementações de grande escala: O Facebook usa o


formato ORC em uma implementação com mais de 300 Petabytes.
4.9.1. Otimizações – Tabelas
 Predicate Pushdown e Bloom Filters

• Predicate Pushdown: propriedades que forçam os filtros nas leituras


fazendo com que uma mínima quantidade de linhas seja lida.

• Bloom Filters: propriedades que possuem a capacidade de reduzir ainda


mais o número de linhas que são retornadas em uma pesquisa.
4.9.1. Otimizações – Tabelas
 Predicate Pushdown e Bloom Filters – Quando Utilizar ?

• Filtros frequentes em uma tabela fato muito grande com colunas de


cardinalidade moderada e/ou grande.

• Acessos a um grande número de colunas ou colunas muito grandes.


Quanto mais dados "empacotados" para se fazer as leituras, maior será o
aumento da velocidade nos acessos à tabela.
4.9.1. Otimizações – Tabelas

Estrutura ORC File Predicate Pushdown + Indexes


4.9.1. Otimizações – Tabelas
 Column Statistics em conjunto do Cost-Based Optimizer

• Missão do CBO: gerar planos de consulta mais eficientes

• Está habilitado por padrão a partir do Hive 0.14 e versões superiores

• Estatísticas em nível da tabela

• Estatísticas em nível de colunas da tabela

• Obrigatório que as estatísticas de tabela ou de colunas estejam criadas


4.9.1. Otimizações – Tabelas

 Particionamento de Tabelas
• O uso de partições melhora significativamente o desempenho se uma
consulta tem um filtro nas colunas particionadas

 Buckets
• Tabelas ou partições podem ser divididos em buckets. Os buckets podem
ser considerados como mais um mecanismo de otimização de pesquisas
dentro de uma partição devido a organização dos dados que eles
proporcionam.
4.9.1. Otimizações – Tabelas
 Esquema do Particionamento de Tabelas e Buckets
4.9.2. Otimizações – Queries
 Algumas práticas que devemos executar ao se desenvolver nossas queries
• Joins
• Não utilizar transformações nas colunas de joins (evitar uso de cast nos critérios)
• Sempre que possível utilizar campos numéricos para se fazer joins e filtros - isso
otimiza os caminhos do plano de execução.

• Campos de Datas
• Ao se efetuar cálculos com campos de datas, deve-se utilizar as funções de datas
(UNIX_TIMESTAMP(), TO_DATE(), MONTH(), DAY(), YEAR() por exemplo), para
transformar a data em um BigInt e depois fazer os cálculos devidos.

• Manipular a Quantidade de Mappers/Reducers


• Missão Principal: tentar eliminar a fase de reduce. Caso isso não seja possível, se
conhecermos bem os dados que estamos manipulando, podemos ajustar a
quantidade de mappers e reducers antes de executar a referida query para aumento
4.9.2. Otimizações – Queries
 Algumas práticas que devemos executar ao se desenvolver nossas queries
• Bloom Filters
• Ao se criar uma tabela ORC podemos definir os bloom filters em determinadas
colunas pré-definidas. As pesquisas, agregações e joins nestas colunas serão
totalmente otimizadas.

• Coleta de Estatísticas (Analyze)


• A execução do job de coleta de estatísticas é fundamental para a devida atualização
dos caminhos executados pelo plano de execução das queries para que o engine
melhore a performance das mesmas.

• Subqueries
• O uso de subqueries é altamente recomendado até mesmo nos joins pois o engine
do hive modifica o plano de execução para aumento de performance.
4.10. Cargas de Dados no Hive
4.10. Cargas de Dados no Hive
 LOAD DATA
• Faz a importação dos dados que estão na máquina local (Edge Node)
para uma tabela hive que esteja respeitando o formato do arquivo (csv,
tsv, gz, bz2, entre outros).

 INSERT INTO TABLE


• Comando padrão para carga de dados de uma tabela para outra. Porém,
é obrigatório quando vamos efetuar cargas em tabelas ORC. As tabelas
ORC não aceitam cargas via LOAD.
4.10. Cargas de Dados no Hive
 LAB 4.10.1. VERIFICAR A PASTA DA TABELA
• Efetuar comandos do hadoop dentro da interface CLI do hive.

hive> dfs -ls


wasb://hdinatura@hdinatura.blob.core.windows.net/hive/warehouse/
wsp_work_<<SeuPrimeiroNome>>.db/BolsaFamiliaFolhaPagamento ;
4.10. Cargas de Dados no Hive
 LAB 4.10.2. SETS PARA O INSERT
• Carregar a tabela ORC a partir da tabela STAGE com dados do tipo texto.

• Executar os sets para ativação do particionamento automatico:

set hive.execution.engine=tez;
set hive.exec.dynamic.partition=false;
set hive.optimize.sort.dynamic.partition=false;
set hive.vectorized.execution.enabled=true;
set hive.vectorized.execution.reduce.enabled=true;
set hive.cli.print.header=true;
set hive.exec.compress.output = true;
set mapred.output.compression.codec =
org.apache.hadoop.io.compress.BZip2Codec;
4.10. Cargas de Dados no Hive
 LAB 4.10.3. INSERT INTO TABLE
insert into table wsp_work_<<SeuPrimeiroNome>>.BolsaFamiliaFolhaPagamento
select
UF
,Codigo_SIAFI_Municipio
,Nome_Municipio
,Codigo_Funcao
,Codigo_Subfuncao
,Codigo_Programa
,Codigo_Acao
,NIS_Favorecido
,Nome_Favorecido
,Fonte_Finalidade
,Valor_Parcela
,ano_mes
from
wsp_work_<<SeuPrimeiroNome>>.BolsaFamiliaFolhaPagamento_stage;
4.10. Cargas de Dados no Hive
 LAB 4.10.4. VERIFICAR A PASTA DA TABELA APÓS O INSERT
• Efetuar comandos do hadoop dentro da interface CLI do hive para
verificar as partições que foram criadas.

hive> dfs -ls


wasb://hdinatura@hdinatura.blob.core.windows.net/hive/warehouse/
wsp_work_<<SeuPrimeiroNome>>.db/BolsaFamiliaFolhaPagamento ;
4.10. Cargas de Dados no Hive
 LAB 4.10.5. VERIFICAR AS PARTIÇÕES DA TABELA APÓS O INSERT

hive> show partitions


wsp_work_<<SeuPrimeiroNome>>.BolsaFamiliaFolhaPagamento ;
4.11. Tabelas ACID
4.11. Tabelas ACID
 ACID representa quatro características de transações de banco de dados:
• Atomicidade: uma operação terá sempre um resultado total: sucesso ou
falha, os dados nunca serão gravados parcialmente)
• Consistência: uma vez que um aplicativo executa uma operação os
resultados dessa operação são visíveis em todas as operações
subseqüentes)
• Isolamento: uma operação incompleta por um usuário não causa efeitos
colaterais inesperados para outros usuários
• Durabilidade: uma vez que uma operação esteja completa, ela será
preservada mesmo em caso de falha de máquina ou sistema
 Estas características são esperadas nos sistemas de banco de dados como
parte de sua funcionalidade.
4.11. Tabelas ACID
 Use Cases para se utilizar ACID Tables:

• Ingestão de dados via Streaming

• Slow Changing Dimensions

• Correção de Dados
4.11. Tabelas ACID
 LAB 4.11.1. Create table de uma ACID Table:

CREATE TABLE wsp_work_<<SeuPrimeiroNome>>.tabela_acid (


id int,
nome string
)
CLUSTERED BY (id) INTO 2 BUCKETS STORED AS ORC
TBLPROPERTIES (
"transactional"="true",
"compactor.mapreduce.map.memory.mb"="2048",
"compactorthreshold.hive.compactor.delta.num.threshold"="4",
"compactorthreshold.hive.compactor.delta.pct.threshold"="0.5"
);
4.11. Tabelas ACID
 PRÉ-REQUISITOS E PROPRIEDADES:

Somente tabelas ORC clusterizadas e com Buckets podem ser ACID


CLUSTERED BY (id) INTO 2 BUCKETS STORED AS ORC
Indica que a tabela deve ser transacional para aceitar operações ACID
transactional"="true“
Especifica a compactação dos maps
"compactor.mapreduce.map.memory.mb"="2048”
Dispara a menor compactação se há mais do que 4 diretórios delta
"compactorthreshold.hive.compactor.delta.num.threshold"="4“
Dispara maior compactação se a taxa do tamanho dos arquivos delta em
relação aos arquivos base é maior que 50%
"compactorthreshold.hive.compactor.delta.pct.threshold"="0.5"
4.11. Tabelas ACID
 LAB 4.11.2. Carga de uma ACID Table:

set hive.execution.engine=tez;
set hive.vectorized.execution.enabled=true;
set hive.vectorized.execution.reduce.enabled=true;
set hive.cli.print.header=true;

insert into wsp_work_<<SeuPrimeiroNome>>.tabela_acid


(id, nome) values (1, “Joao");

insert into wsp_work_<<SeuPrimeiroNome>>.tabela_acid


(id, nome) values (2, “Maria");

insert into wsp_work_<<SeuPrimeiroNome>>.tabela_acid


(id, nome) values (3, "Zezinho");
4.11. Tabelas ACID
 LAB 4.11.2. Verificar resultados da carga de uma ACID Table:

select * from wsp_work_<<SeuPrimeiroNome>>.tabela_acid ;

 LAB 4.11.3. Listar diretorio contendo os arquivos de uma ACID Table:

hive> dfs -ls


wasb://hdinatura@hdinatura.blob.core.windows.net/hive/
warehouse/wsp_work_<<SeuPrimeiroNome>>.db/
tabela_acid ;
4.12. O que é o LLAP
4.12. O que é o LLAP ?
 O LLAP (Long Lived and Process) é um projeto que foi derivado das iniciativas
do projeto Stinger.Next.
 Sua principal missão é retornar queries pesadas em segundos.
 O LLAP está 25 vezes mais rápido do que o Hive + Tez anteriores.
4.13. LLAP: long-lived execution in Hive
 Modelo híbrido combinando daemons e contêineres para execução rápida de cargas de
trabalho analíticas: melhoria de velocidade de até 25x ao comparar LLAP com Hive + Tez.

Fonte: Hortonworks TPC-DS benchmark on 15 queries using the hive-testbench repository


4.13. LLAP: long-lived execution in Hive
 Comparativo: Hive + Tez com ORC e Parquet x LLAP com ORC

Fonte: POC de Performance Microsoft Brasil


4.14. Como LLAP torna as queries mais rápidas ?
 O LLAP também traz muitos aperfeiçoamentos para o mecanismo de execução
do Hive:
• Melhoria no processamento dos Map Joins
• Conversões de tipos mais rápidas
• Otimizações de particionamento dinâmico
• Suporte de vetorização para arquivos de texto
• Mantém os dados comprimidos em execução na memória
4.15. Inicializando o Hive com LLAP
 Existem algumas maneiras básicas de se trabalhar com o LLAP +
hive:

• Terminal
• beeline

• Web
• Ambari Hive View
4.15.1. Inicializando o Hive com LLAP
 LAB 4.15.1.1. Abrir o Beeline pelo executável padrão:

[sshuser@geral-ssh.azurehdinsight.net]#
beeline -u 'jdbc:hive2://localhost:10001/;transportMode=http' -n sshuser <enter>

Connecting to jdbc:hive2://localhost:10001
Connected to: Apache Hive (version 1.2.1000.2.5.0.0-1245)
Driver: Hive JDBC (version 1.2.1000.2.5.0.0-1245)
Transaction isolation: TRANSACTION_REPEATABLE_READ
Beeline version 1.2.1000.2.5.0.0-1245 by Apache Hive

0: jdbc:hive2://localhost:10001>
0: jdbc:hive2://localhost:10001>
4.15.1. Inicializando o Hive com LLAP
 LAB 4.15.1.2. Abrir o Hive View pelo browser:
4.15.1. Inicializando o Hive com LLAP
 LAB 4.15.1.3. Executar algumas queries com agregações:
 Query 1
• select count(1) from
wsp_work_<<SeuPrimeiroNome>>.BolsaFamiliaFolhaPagamento;

 Query 2
• select uf, count(1) from
wsp_work_<<SeuPrimeiroNome>>.BolsaFamiliaFolhaPagamento group by uf;

 Query 3
• select uf, count(1) from
wsp_work_<<SeuPrimeiroNome>>.BolsaFamiliaFolhaPagamento where uf =
'SP' group by uf;
4.15.1. Inicializando o Hive com LLAP
 LAB 4.15.1.3. Executar algumas queries com agregações:
 Query 4
• select uf, Nome_Municipio, count(1) from
wsp_work_<<SeuPrimeiroNome>>.BolsaFamiliaFolhaPagamento group by uf,
Nome_Municipio limit 500;
4.15.1. Inicializando o Hive com LLAP
 LAB 4.15.1.3. Executar algumas queries com agregações:
 Query 5
create table wsp_work_<<SeuPrimeiroNome>>.BolsaFamiliaFolhaPagamento_totais1
stored as orc
tblproperties("orc.compress"="ZLIB")
as
select bffp.uf ,bffp.ano_mes, bffp.qtd_bffp qtde
from
( select uf ,ano_mes,count(1) qtd_bffp
from wsp_work_<<SeuPrimeiroNome>>.BolsaFamiliaFolhaPagamento
where uf = 'SP'
group by uf ,ano_mes
) bffp;
4.15.1. Inicializando o Hive com LLAP
 LAB 4.15.1.3. Executar algumas queries com agregações:
 Query 6
create table wsp_work_<<SeuPrimeiroNome>>.BolsaFamiliaFolhaPagamento_totais2
stored as orc
tblproperties("orc.compress"="ZLIB")
as
select
ano_mes,
sum(valor_parcela) total_ano_mes
from
orcdata.orc_bolsafamiliafolhapagamento
group by ano_mes;
© 2017 Microsoft Corporation. All rights reserved. Microsoft, Windows, Windows Vista and other product names are or may be registered trademarks and/or trademarks in the U.S. and/or other countries.
The information herein is for informational purposes only and represents the current view of Microsoft Corporation as of the date of this presentation. Because Microsoft must respond to changing market
conditions, it should not be interpreted to be a commitment on the part of Microsoft, and Microsoft cannot guarantee the accuracy of any information provided after the date of this presentation.
MICROSOFT MAKES NO WARRANTIES, EXPRESS, IMPLIED OR STATUTORY, AS TO THE INFORMATION IN THIS PRESENTATION.

Você também pode gostar