Mostrando postagens com marcador Hive. Mostrar todas as postagens
Mostrando postagens com marcador Hive. Mostrar todas as postagens

quinta-feira, 8 de agosto de 2019

Arquitetura de dados em Big Data



Conforme experiências em projetos atuais, tenho encontrado muitos analistas que tem dificuldade em efetuar consultas nas bases de dados na estrutura do Big Data. A maioria das ingestões são feitas no Data Lake diariamente com apena um “Delta” das informações, que seriam atualizações ocorridas dos registros durante o período de um dia.

Nos projetos o Data Lake se tornar uma referência as fontes de origem, devido a documentação do dado ser compátivel ao sistema que originou a informação e a sua vizibilidade se torna maior devido ao conhecimento dos colaboradores dessa estrutura transacional, deste modo, o Data Lake acaba  sendo fonte para diversas consultas no modo dimensional.

Esse processo ao consultar o Datalake onera drasticamente o cluster, pois cada consulta aos dados brutos, a engine percorre toda a tabela ocorrendo o “full-scan”. Devemos lembrar que diferentemente de uma estrutura de um banco de dados relacional, o Hive por ser um sumarizador de dados, ele não tem os mesmos recursos de indexadores que um banco relacional, mas leva vantagem na paralelização dos processos.

Para esclarecer melhor esse cenário, vamos supor que um cientista de dados necessita montar um modelo no qual ele precisa consultar a cidade na tabela de clientes.


No caso de uma consulta pelo Data Lake, o processo deverá percorrer todas as partições e trazer o registro mais recente, no caso acima está mencionado um exemplo de dados com 6 partições, se utilizarmos a persistência de dados de 3 anos, são 1095 partições.
Caso em consultas no Data Lake o join mais performático é feito da seguinte maneira:

Seguindo os conceitos "top down" definido por  Bill Inmon, de amenizar esse processamento de toda tabela, seria a construção de um Data Mart no qual a tabela seria atualizada diariamente.



Diariamente seria executado um script no qual consultaria a nova partição criada no Data Lake e atualizaria seu Data Mart. Essa tabela geralmente não é particionada e sua performance referente a consulta, será bem menos onerosa ao cluster.



O modelo de query para executar o processo diário:

--INSERIR EM UMA TABELA A VISAO DO DIA ANTERIOR

INSERT INTO TABLE TABELA_UNIAO
SELECT ID, NOME, CIDADE, DATA_INGESTAO FROM DATAMART.CLIENTE;

--INSERIR O DIA DA NOVA PARTICAO DO DATALAKE
INSERT INTO TABLE TABELA_UNIAO
SELECT ID, NOME, CIDADE, DATA_INGESTAO 
FROM DATAMART.CLIENTE 
WHERE DATA_INGESTAO = "2019-01-06";

--CARREGAR O DATA MART COM OS DADOS MAIS RECENTES
INSERT OVERWRITE TABLE DATAMART.CLIENTE
SELECT
SUB_CLIENTE.ID,
SUB_CLIENTE.NOME,
SUB_CLIENTE.CIDADE,
SUB_CLIENTE.DATA_INGESTAO
FROM(
ID,
NOME,
CIDADE,
DATA_INGESTAO,
RANK() OVER (PARTITION BY ID ORDER BY DATA_INGESTAO DESC) RANKING
FROM DATALAKE.CLIENTE
) SUB_CLIENTE
WHERE SUB_CLIENTE.RANKING = 1;

Algumas orientações podem ser aplicadas:

  • Em Big Data a replicação dos dados é permitida se caso for utilizado para o aumento de performance na consulta, mas deve ser avalidado com ponderação.
  • Na instrução sql aplicada acima, utilizamos o RANK(), pois apresenta melhor performance na execução, mas caso possui uma duplicação de chaves (ID e DATA_INGESTAO), apresentará a quantidade de registros com o mesmo ranque (No caso acima multiplos registros com SUB_CLIENTE.RANKING = 1), para solucionar esse caso é possível utilizar a função ROW_NUMBER(). Fonte: https://cwiki.apache.org/confluence/display/Hive/LanguageManual+WindowingAndAnalytics 
  • Outra forma segura de carregar o Data Mart e diminuir a indisponibilidade é utilizar o processo Exchange Partition.                    Fonte: https://cwiki.apache.org/confluence/display/Hive/Exchange+Partition
O assunto de estrutura de dados é algo importante e deve ser discutida, pois em alguns casos o processo começa apresentar falhas após meses de operação sistema, no qual,  já está finalizado  o período de garantia oferecido pelo fornecedor.


Em caso de dúvidas ou sugestões, escreva nos comentários ou nos mande um email: slothbigdata@gmail.com.


domingo, 7 de julho de 2019

Diferença de Tabelas gerenciadas e Tabelas externas no Apache Hive


Conforme conhecemos, o Hive é um excelente sumarizador de dados utilizado em projetos Big Data, para efetuar a estruturação da base, manipulações das informações e integrações com outras ferramentas e linguagens. Assim para se atender o conceito relacional, necessitamos a definição de tabelas e para atender esse requisito o Apache Hive possui 2 modelos de tabelas:

  1. TABELAS GERENCIADAS.
  2. TABELAS EXTERNAS.


Tabela Gerenciada

CREATE TABLE

  • O arquivo de dados deve estar localizado no repositório padrão: HDFS. 
  • Cria os arquivos de dados na tabela da pasta /apps/hive/warehouse/ e/ou do banco de dados que também está nesta pasta.
  • Toda alteração na tabela influencia os dados no HDFS

 OBS.: Podemos criar uma tabela gerenciada em uma pasta diferente da warehouse com o uso do comando LOCATION.

Modelo de tabela gerenciada:

create table nomedobanco.nomedatabela(
  campo1  string,
  campo2  int
) stored as text; --definição do formato


Tabela Externa
CREATE EXTERNAL TABLE
  • Cria uma tabela externa (não está na pasta /apps/hive/warehouse/). 
  • Qualquer comando de alteração nas tabelas não influência os dados.
  • 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 em outros endereços. 
  • Deve ser definida a pasta dos arquivos de dados na instrução LOCATION.
Modelo de tabela gerenciada:

create table nomedobanco.nomedatabelaexterna(
  campo1  string,
  campo2  int
) row format delimited fields terminated by '|' --definição do delimitador
stored as textfile                                               --definição do formato
location '/diretorio/hdfs';                                  --definição do diretório



Em caso de dúvidas ou sugestões, escreva nos comentários ou nos mande um email: slothbigdata@gmail.com.


sábado, 29 de junho de 2019

Abordagem do Apache Hive




Não importa a relevância do uso do Hadoop para armazenamento de dados desestruturado, o modelo relacional na linguagem SQL dos bancos atuais, sempre serão utilizados e necessários nos projetos de Big Data.
Devido os sistemas integrados de gestão em sua maioria utilizar bancos relacionais, as ingestões de dados na grande maioria utilizam o formato de texto com os campos delimitados por algum caracter.
Deste modo o apache hive é indispensável a qualquer projeto de Big Data. O Apache Hive é um sistema de data warehouse para Hadoop que permite:

  • Não é um banco de dados e sim um sumarizdor de dados do HDFS; 
  • Consulta e análise de dados usando o HiveQL (SQL-Like);
  • O Hive pode ser usado para explorar interativamente seus dados ou para criar processamento em lote reutilizáveis;
  • O Hive possui características de um SGBDR mas não é um SGBDR. Precisa de um SGDBR externo (exemplos: SQL Server, Oracle, MySQL e PostGreSQL) para armazenamento e gestão dos metadados - Hive MetaStore;
  • Possui biblioteca JDBC, no qual pode se estabelecer um pool de conexões para se utilizar em alguma linguagem ou em uma ferramenta de Data Discovered.
  • O Hive não tem relacionamentos entre as tabelas (CONSTRAINTS) nem chaves primárias (PRIMARY KEYS);

Função do Hive:



Com o Hive é possível 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 scala. 
  • Pode utilizar os engines MapReduce, Tez e LLAP para seus processos batch.

Autor: Rodrigo Piva - Especialista Big Data