Professional Documents
Culture Documents
Rio de Janeiro,
Brasil 2018.
1
GABRIEL MATTOS DINIZ LUCAS
Rio de Janeiro,
Brasil 2018
2
Lucas, Gabriel
2
3
AGRADECIMENTOS
Toda honra e glória ao Senhor Deus, Criador dos céus e da terra. Agradeço
profundamente a Ele por ter me dado a capacidade e determinação necessárias para
completar mais uma etapa desta empreitada pelo caminho do conhecimento lógico-
matemático, computacional e tecnológico. Agradeço também à minha família,
especialmente meu pai e minha mãe, por todo amor e suporte a mim conferido ao longo
da minha vida, e por sempre terem me apoiado nas minhas decisões e por acreditarem na
minha capacidade. Gostaria também de agradecer ao meu professor e orientador José Luiz
dos Anjos Rosa, pela eficiência e profissionalismo exercidos ao me ajudar a definir o tema
deste trabalho, na escolha das ferramentas utilizadas e nos direcionamentos técnicos
cruciais para o bom andamento do projeto. Seus materiais de estudo, conselhos
profissionais e conversas amistosas foram muito importantes para mim. Foi uma honra
poder estudar na UEZO. Guardarei boas lembranças do meu tempo na instituição, das
amizades construídas, dos desafios superados e das alegrias alcançadas. Estudei em um
centro universitário jovem, mas com excelentes professores e pessoas engajadas em
tornar este campus cada vez melhor. Fico feliz de ter feito parte da história da instituição
como aluno e, conforme minhas capacidades e minha evolução como profissional,
pretendo retribuir o investimento feito em mim agregando conhecimento as novas
gerações de alunos. Vamos seguir fortes na caminhada e que Deus nos abençoe.
4
RESUMO
5
ABSTRACT
Over the last decade, there has been an inimaginable explosion of data in many
sectors of industry. By estimate, more than 2.5 hexabytes of data are generated every day.
This amazing amount of data is originated from different sources like social media,
mobile devices, cameras, sensors, private and public servers and databases. The
termination Big Data was then created to describe this phenomenon, attending to the
growing aspiration of organizations and individuals in exploring it. Several mechanisms,
tools and algorithms were then created through the years to assist the interested at
deepening themselves in this new branch of data management. The objective of this work
is to explain and demonstrate the transformation of a great deal of data in relevant
information, through well defined and structured techniques currently in the Big Data
context. This work will also perform a study regarding the tools utilized, expressing your
significance and funcionalities in each step of the cycle. It will be used as an example a
semi-structured database related to revenue and budget of the federal government and the
transfer of federal money to Brazilian states and cities. This base was taken from the
Federal Government Transparency Portal, which provides data about the State budget
execution.
6
Sumário
1. INTRODUÇÃO ............................................................................................................ 8
1.1 Relevância ............................................................................................................. 10
1.1.1 Quanto à escolha do uso de técnicas de Big Data: ......................................... 10
1.1.2 Quanto à escolha da base de dados: ............................................................... 11
1.2 Objetivo ................................................................................................................. 12
2. FUNDAMENTAÇÃO TEÓRICA............................................................................... 13
2.1 Hadoop .................................................................................................................. 13
2.2 MapReduce ........................................................................................................... 14
2.3 HDFS .................................................................................................................... 16
2.3.1 NameNode e DataNode ................................................................................. 17
2.4 YARN .................................................................................................................... 18
2.5 Iniciativa Hortonworks.......................................................................................... 19
2.5.1 HDP ................................................................................................................ 20
2.6 Apache Hive .......................................................................................................... 22
2.6.1 Definição ........................................................................................................ 22
2.6.2 Principais Características e Otimização ......................................................... 23
2.7 Apache Pig ............................................................................................................ 25
2.7.1 Definição ........................................................................................................ 25
2.7.2 Principais Caracteríticas e Otimização........................................................... 26
2.8 Comparações Hive x Pig ....................................................................................... 28
2.9 Apache Zeppelin.................................................................................................... 30
2.9.1 Definição ........................................................................................................ 30
2.9.2 Principais Características, otimização com Apache Spark ............................ 31
3. METODOLOGIA ....................................................................................................... 35
3.1 Preparar Ambiente ................................................................................................. 35
3.2 Acessando Ambari View e Terminal Shell in a Box ............................................. 36
3.3 Adquirindo os dados brutos e adicionando-os ao HDFS ...................................... 38
3.4 Criações de tabelas no Hive e junção de arquivos no Pig ..................................... 39
3.5 Estruturação dos dados com expressões regulares ................................................ 41
3.6 Modificações finais para os tipos .......................................................................... 42
3.7 Montagem dos Notebooks Zeppelin ..................................................................... 42
3.7.1 Primeira seção – Repasses por Tipo e Datas .................................................. 43
3.7.2 Segunda seção – Análise do Orçamento ........................................................ 47
4. CONCLUSÃO ............................................................................................................ 51
5. APÊNDICES ............................................................................................................... 53
6. BIBLIOGRAFIA ........................................................................................................ 64
7
1. INTRODUÇÃO
1
Código aberto é um modelo de desenvolvimento que promove o licenciamento
livre para a esquematização de um produto, onde ele pode ser redistribuído e qualquer um
pode consultar, examinar e modificar este produto.
8
Volume: Refere-se a imensa quantidade de dados já existentes e gerados a cada
segundo. E-mails, fotos, vídeos, mensagens em redes sociais compartilhadas
incessantemente. No total chegamos a dados na ordem dos zettabytes; Esse aumento
de dados se tornam muito volumosos para serem armazenados e analisados através da
tecnologia tradicional de banco de dados;
Velocidade: Refere-se à velocidade na qual novos dados são gerados e quão rápidos
eles se espalham. Como um vídeo no YouTube sendo “viral” em minutos, a velocidade
em que cartões de crédito são checados contra atividades fraudulentas ou os
milissegundos que levam sistemas de compra e venda analisarem a mídia de redes
sociais para receberem dados de decisão de compra ou venda de ativos e produtos.
Big Data permite analisar dados enquanto são gerados sem nem mesmo serem
alocados em bases de dados;
Variedade: Refere-se aos diferentes tipos de dados que podemos usar. No passado,
focamos em dados estruturados que se encaixavam quase que perfeitamente em
tabelas e bases de dados relacionais como com dados financeiros. De fato, a maior
parte dos dados hoje é não estruturado e não pode ser facilmente colocado em bancos
de dados relacionais. Tecnologias de Big Data podem convergir dados de diferentes
estruturas em relações tradicionais.
Com o tempo, tentou-se adicionar mais dois V’s para complementar o seu
conceito inicial:
9
No entanto, apesar de suas premissas serem válidas no contexto dos dados, não
são avaliadores de magnitude intrínsecos ao Big Data. Nesse sentido, ainda é estipulado
os 3 V’s do Big Data como os identificadores essenciais desse modelo. Validados estes
itens como presentes no contexto de magnitude do seu dado, as técnicas de Big Data se
tornam hoje uma solução atrativa de evolução de trabalhos e análise.
1.1 Relevância
Cerca de noventa por cento dos dados hoje foram criados nos últimos dois anos,
e dessa quantidade, oitenta por cento constitui de dados não estruturados ou que estão
disponíveis em variados formatos, o que os torna difíceis de serem analisados. Além
disso, através dos anos de desenvolvimento de sistemas de TI, é percebido que formatos
estruturados como bancos de dados, têm algumas limitações para gerenciar imensas
quantidades de dados, tanto pela necessidade de aumento vertiginoso de poder de
processamento e memória em relação a quantidade de dados quanto pela incapacidade de
um SGBD2 tradicional de gerenciar dados semi e não estruturados.
É observada a dificuldade de se integrar informação distribuída através de
múltiplos sistemas. A maioria dos envolvidos em um negócio não sabe o que deveria ser
analisado e descobrem os requerimentos apenas durante o desenvolvimento de sistemas
de TI. Com o aumento de dados também cresce o acúmulo de dados dentro das
companhias. Dados potencialmente valiosos como os contidos em ERP3 são esquecidos
ou descartados nessas bases. Isso se deve porque geralmente é muito caro justificar a
integração de altos volumes de dados estruturados de diferentes sistemas. Muitos tipos de
informação como dados sobre recursos naturais tem um ciclo de vida útil limitado e são
2
SGBD – Sistema de Gerenciamento de Banco de Dados.
3
ERP – Enterprise Resource Planning. É um sistema de gestão empresarial. Um
conjunto de diversos subsistemas integrados, cada um destinado a uma área da
companhia.
10
melhor utilizados apenas em um curto período de tempo. Informação é melhor explorada
para o valor do negócio quando é adicionado o contexto ao dado.
Soluções de Big Data se tornaram populares e atrativas porque conseguem
processar imensas quantidades de dados de uma maneira menos dispendiosa, com seus
algoritmos de processamento paralelo. Ele também captura dados em sua forma nativa,
que podem ser estruturados, semiestruturados, não estruturados ou streaming. E sendo
que estes dados podem ser capturados em tempo real, e com um sistema de arquivos
tolerantes a falhas. Mais importante é sua capacidade de transformar dados em
conhecimento acionável ao negócio.
Atualmente os dados já podem ser comparados com óleo, que costumava ser
considerado como o produto mais valioso da Terra no quesito de valor monetário. “Na
sua forma bruta, óleo tem pouco valor. Uma vez processado e refinado, ele ajuda a mover
o mundo. Os dados são o novo óleo” (WINBLAD, 2012).
11
transparência do governo federal. Iremos analisar suas finalidades e assim, descobrir
formas de otimização e cortes de gastos.
1.2 Objetivo
12
2. FUNDAMENTAÇÃO TEÓRICA
2.1 Hadoop
Na última década, antes do termo “Big Data’ ter sido cunhado, havia poucas opções para
processar grandes bases de dados com tamanho na casa dos Terabytes e além. Algumas bases
comerciais conseguiam, com configurações de hardware bem específicas e caras, serem
escaladas a esse nível, mas especialidade e gastos elevados requeriam que fosse uma opção
apenas para as maiores organizações. Alternativamente, alguns poderiam construir um sistema
customizado destinado a resolução de problemas específicos. E isto também sofria de alguns
dos mesmos problemas (especialidade e gastos) e adicionado o risco inerente de qualquer
sistema de ponta. Por outro lado, se um sistema fosse construído com sucesso, seria uma ótima
solução à necessidade (TURKINGTON, 2015).
Poucas companhias de tamanho médio se preocuparam com este espaço, não apenas
porque as soluções estavam fora de seu alcance, mas eles geralmente não tiveram a percepção
de armazenar a quantidade de volume de dados necessários para estas soluções. Quanto mais a
habilidade de gerar bases de dados mais largas se tornou mais comum, também cresceu a
necessidade de processar estes dados (TURKINGTON, 2015).
Google começou a mudança que eventualmente se transformara no Hadoop quando em
2003 e em 2004, lançaram dois artigos acadêmicos descrevendo o Google File System (GFS) e
o MapReduce. Os dois juntos forneceram uma plataforma para processamento de dados em
larga escala de uma maneira extremamente eficiente. A Google adotou a postura de “construa
você mesmo”, mas ao invés de construir algo destinado a um problema específico ou base de
dados, criaram uma plataforma no qual múltiplas aplicações processadoras pudessem ser
implementadas. Em particular eles utilizaram um extenso número de servidores comuns e
construíram o GFS e o MapReduce de uma forma que entendia que falhas de hardware eram
comuns e era simplesmente algo com que o software tinha que lidar (TURKINGTON, 2015).
O Yahoo percebendo o potencial da nova tecnologia, se tornou um dos mais
proeminentes apoiadores da ideia, tendo desenvolvido o projeto Hadoop encabeçado por Doug
Cutting com a Apache Software Foundation.
13
2.1.1 Componentes do Hadoop
Ambos são designados para rodar em clusters de servidores comuns (ou seja, de baixa
à média especificação);
Ambos escalam sua capacidade adicionando mais servidores (scale-out) em oposição
aos modelos anteriores que usam hardwares mais potentes (scale-up);
Ambos têm mecanismos para identificar e trabalhar em cima de falhas;
Ambos provêm a maioria de seus serviços com transparência, permitindo que o usuário
se concentre no problema em mãos;
Ambos têm uma arquitetura onde um software gerenciador do cluster repousa em
servidores físicos e gerencia aspectos como balanceamento de carregamento de
aplicações e tolerância a falhas, sem depender de um hardware de ponta para entregar
estas capacidades.
2.2 MapReduce
14
executadas em paralelo por múltiplas máquinas. Uma tarefa MapReduce divide uma extensa
quantidade de dados em pedaços independentes e os organiza em uma chave, pares chave-valor
para processamento paralelo (TANNIR, 2014).
A função Map divide a entrada em seções através do InputFormat e cria uma tarefa map
para cada seção na entrada. O JobTracker distribui estas tarefas através dos nós. A saída de cada
tarefa map é particionada em um grupo de pares chave-valor para cada ação reduce.
A função Reduce por sua vez coleta os vários resultados e os combina para responder
o problema inicial que o nó mestre precisa resolver. Cada reduce puxa a partição relevante das
máquinas onde os maps foram executados, e então escreve a sua saída de volta ao HDFS. Então
o reduce é capaz de coletar os dados de todos os maps para as chaves e combiná-los para
resolver o problema.
O modelo de programação do MapReduce é designado para ser independente de
sistemas de armazenamento. MapReduce lê pares chave-valor de sistemas de arquivos
subjacentes através de um leitor. O leitor recupera cada registro do sistema de arquivos e o
envolve em um par chave-valor para os seguintes processamentos. Este design independente de
armazenamento é considerado benéfico para sistemas heterogêneos uma vez que permite que o
MapReduce analise dados armazenados em diferentes sistemas de arquivos (TANNIR, 2014).
Vamos exemplificar o modelo de programação MapReduce com a necessidade de contar
a quantidade ocorrências de cada letra em um arquivo. Transferido para uma tarefa MapReduce,
a tarefa de contador de letras, como mostra a figura 1:
15
As tarefas retratadas na Figura 1 podem ser descritas na seguinte ordem:
2.3 HDFS
16
2.3.1 NameNode e DataNode
4
Arquitetura voltada a sistemas distribuídos, onde máquinas específicas (master)
particionam a computação do problema e distribuem entre outras máquinas (slaves) que farão
o processamento da solução e então devolverão as respostas para as máquinas master.
17
A existência de um único NameNode em um cluster simplifica grandemente a
arquitetura do sistema. O NameNode é o árbitro e o repositório de todos os metadados HDFS.
O sistema é designado de tal maneira que o dado de usuário nunca flui através do NameNode.
2.4 YARN
18
2.5 Iniciativa Hortonworks
19
Figura 4 - Solução Hortonworks
2.5.1 HDP
20
Acesso aos dados: Possui conjunto de mecanismos analíticos encarregados de
processar dados de diferentes formatos e gerar transformações que devolvem
informação agregada a partir da manipulação feita pelo usuário;
Governança e Integração de dados: Componentes responsáveis por gerenciar o fluxo
de dados de entrada e saída do hadoop. Proporciona uma estrutura de controle e
automatização na integração de dados;
Segurança: Ferramentas de autenticação de dados, encriptação e decriptação,
administração e monitoramento de dados;
Operações: Conjunto de ferramentas para monitorar e gerenciar um cluster Hadoop
e agendamento de tarefas dentro do cluster;
Ferramentas: Componentes de visualização dos dados através do Zeppelin e
integração de ferramentas analíticas em um ambiente gráfico com o Ambari.
(HORTONWORKS, 2016)
Podemos perceber através da figura 5, que o universo de trabalho com Big Data possui
diversas ramificações e áreas de atuação, e sabendo disso, um profissional da área pode seguir
em diferentes especializações. Para os propósitos deste trabalho, focaremos nas divisões que
remetem à parte analítica de dados, sendo que faremos uso dos componentes Apache Hive
21
(versão 2.1.0), Apache Pig (versão 0.16.0), e por fim, Apache Spark (versão 2.3.0) sobre a
ferramenta de visualização de dados Apache Zeppelin (0.7.3). Todas estas ferramentas estão
contidas na versão 2.6 do HDP, sendo a build mais estável na data de criação deste trabalho.
As próximas seções do capítulo são destinadas a explicar detalhadamente cada
componente que utilizaremos neste trabalho (citados acima). Entenderemos suas correlações,
funcionalidades, linguagens suportadas, um pouco da arquitetura e do relacionamento com o
cluster (Hadoop/YARN) e relacionamento com as operações MapReduce e HDFS.
2.6.1. Definição
Segundo Dayong (Apache Hive Essentials, 2015), Hive é um padrão de consultas SQL
sobre a estrutura Hadoop. Ele fornece acesso à petabytes de dados no HDFS com uma
linguagem similar à SQL fazendo com que o Hadoop seja usado como uma estrutura de data
warehouse. A HQL (Hive Query Language) tem semântica e funções similares ao padrão SQL
em uma base de dados relacional, para que analistas de dados experientes possam facilmente
22
manipulá-los. A linguagem de consulta do Hive pode rodar em diferentes frameworks 5, como
MapReduce, Tez, e Spark para melhor performance.
O modelo de dados do Hive oferece uma estrutura de alto nível, similar a tabelas, sobre
o HDFS. E por estar sobre o HDFS, ele também permite escalabilidade massiva e tolerância a
falhas para armazenamento de dados e processamento paralelo em hardware comum .
(DAYONG, 2016).
Esse modelo de dados de estrutura tabelar do Hive facilita consultas do tipo ad-hoc, que são
consultas criadas e modificadas de acordo com a necessidade de análise, e não procedimentos
estáticos e de difícil modificação como as operações em lotes com MapReduce.
Apesar de ter um modelo de dados tabelar, a sua execução ainda segue os padrões
MapReduce. Hive é orientado à execução em lotes (comandos pré-definidos de execução) e
tem alta latência (alto tempo de resposta após execução). Isso permite manter os padrões
necessários para processamento paralelo quando se manipula quantidades massivas de dados
(DAYONG, 2016).
Outro ponto importante a se considerar é a Interoperabilidade do Hive. Isso ignifica que
ele possui diversos frameworks que suportam diferentes tipos e formatos de arquivos. Dentre
os formatos disponíveis, utilizaremos o ORC (Optimized Row Columnar). Ele usa
codificadores para diferentes tipos de dados colunares a fim de melhorar a compressão do
arquivo (compressão de largura variável de valores inteiros). O ORC introduz um leve
indexador que permite pular completos blocos de linhas que não se encaixam com a consulta.
Ele resulta nas funções de estatística básica – MIN, MÁX, SUM e COUNT – sobre as colunas
tornando-as mais ágeis. Por fim, um bloco mais volumoso de 256MB por padrão otimiza largas
leituras sequenciais sobre o HDFS para mais taxa de transferência com menos arquivos para
reduzir a carga no namenode. (PROKOPP, 2014). A partir destas características o ORC é hoje
uma boa opção de formato de arquivo para manipulação no Hive e por isso, ele será utilizado
neste trabalho.
5
Estrutura computacional voltada para desenvolver família de soluções programáticas
semelhantes. No nosso exemplo a linguagem do Hive pode ser usada por diferentes
ferramentas que não só o Hive, para propósitos semelhantes de análise de dados.
23
Hive também é extensível, proporcionando adição de scripts MapReduce e derivados,
adição de funções e tipos definidos pelo usuário, e de um formato customizado de entrada e
saída de dados que permite utilização de tipos variados e de bases de dados para mais
possibilidades de análise.
Outra característica importante do Hive é a sua boa performance por utilizar uma engine
que possui scripts pré-definidos para reduzir o tempo de execução enquanto oferece alta saída
de dados. Utilizaremos neste trabalho a engine TEZ, uma ferramenta evolutiva ao MapReduce.
A principal função do Tez é generalizar o paradigma MapReduce para uma estrutura mais
poderosa baseada na expressão de computação como um grafo de fluxo de dados. Isso é possível
através do uso de técnicas DAG (Directed Acyclic Graph) contidas na engine, que se traduz
numa API onde o grafo corresponde a uma tarefa, o vértice corresponde aos passos lógicos da
tarefa e as bordas direcionadas representam o movimento de dados ao longo dos vértices até as
folhas. A figura 6 abaixo demonstra bem a diferença entre a execução em MapReduce e a
execução em Tez. Na primeira figura múltiplas tarefas MapReduce são necessárias até chegar
ao resultado final (os reducers do passo anterior alimentando o mapper do próximo passo), e
tendo que armazenar resultados intermediários no HDFS. Na segunda figura, um único map
possui múltiplos estágios reduce (através de uma implementação DAG), sem ter que, portanto,
armazenar dados em disco com HDFS (o processo é feito em memória), trazendo mais
performance (MURTHY, 2014).
Figura 6 - Comparativo MR e Tez
24
consulta típicas como filtros, agregações e joins de tabelas. Um sistema padrão de execução de
consultas processa uma linha por vez. Isto resulta em longos códigos e uma quantidade
significante de interpretações de metadados no loop de execução. A execução vetorizada de
consultas otimiza a operação ao processar blocos de 1024 linhas por vez. Em cada bloco, cada
coluna é armazenada como um vetor (um array de tipos primitivos de dados). Operações
simples como cálculos aritméticos e comparações são realizadas rapidamente iterando sobre os
vetores em um loop bem amarrado, com poucas ou nenhuma chamada de função ou
ramificações condicionais dentro do loop (HANSON, 2015).
Pensando nessas dificuldades, a Apache criou Pig, uma ferramenta que pudesse ser
eficiente em ambientes de processamentos de dados paralelos, tendo o encontro perfeito entre
e estilo de programação declarativo do SQL com o estilo procedural do MapReduce.
2.7.1. Definição
25
tradicionais operações com dados (join, sort, filter), enquanto tem a possibilidade de que seus
usuários desenvolvam suas próprias funções para leitura, processamento e escrita de dados.
Essa customização do Pig é possível por causa de sua arquitetura de código aberto, que torna
possível a customização do software pela comunidade de usuários.
Pig é sumariamente dividido em dois componentes principais:
Pig Latin – É uma linguagem de fluxo de dados procedural que contém sintaxe e
comandos que podem ser aplicados para implementar lógicas de manipulação de dados
que são organizadas por regras de negócio (Exemplos são: LOAD, STORE, etc).
Motor de execução – É um compilador que analisa, valida e produz scripts de operações
através de sequências de programas MapReduce. Ele utiliza, pelo padrão Hadoop, o
HDFS para armazenar e recuperar dados.
Um dos grandes diferenciais do Pig está na sua forma de operação, que pode ser
explicada e dividida em três estágios:
1. Refere-se a escrita do código Pig Latin, por ser uma linguagem procedural, todo o
código deve ser escrito por inteiro antes de prosseguir para a compilação, e por isso,
recebe o conceito de script. Os dados a serem utilizados devem ser carregados através
da função LOAD, e um agente identificador deve ser aplicado ao conjunto de dados
carregados. Esse identificador é chamado de relação. (APACHE PIG, Pig Latin Basics,
2016) Sequencialmente, são feitas as modificações nos dados através das funções
FILTER, GROUP, JOIN, GENERATE, entre outros. Cada modificação no conjunto de
dados necessita também de relações para serem identificadas. Por fim, os dados
modificados são armazenados no HDFS através da função STORE. Este deve ser o
processo a ser seguido pelo programador ao escrever seu código Pig.
2. O segundo estágio consiste na execução das operações internas do Pig. Nesse estágio,
o compilador se encarrega de separar as linhas do código em etapas e descrever suas
funções sintáticas, checar e otimizar cada parte do código. Se o script passar na
26
avaliação, Pig planeja a execução do código no ambiente Hadoop, ou seja, o transforma
em tarefas MapReduce, envia e monitora a execução da tarefa.
3. Por fim, temos o terceiro estágio, a execução do plano. Pig pode tanto mostrar o
resultado da operação na tela, através do comando DUMP, ou armazenar efetivamente
no HDFS se o comando STORE for indicado, e assim, a tarefa termina.
Além da forma de operação do Pig, também é importante conhecer seu modelo de dados,
pois ele se difere do modelo SQL tradicional que encontramos no Hive, por exemplo.
Basicamente, Pig suporta quatro tipos básicos:
Campo – Um simples valor atômico. Suporta os tipos tradicionais como integer, double,
string, etc. Ex: ‘Lucas’;
Tupla – Uma sequência de campos que podem ser de qualquer tipo de dados
tradicionais. Ex: (‘Lucas’, 25);
Bag – Coleção de tuplas de estruturas potencialmente variáveis, podem conter
duplicatas. Ex: {(‘Lucas’), (‘Marta’, (25,38))};
Map – É um array associativo; a chave deve ser um chararray mas o valor pode ser de
qualquer tipo (Tipo indicado para bases semi-estruturadas). Ex:
[nome#Lucas,cel#980567845].
Por padrão, Pig trata campos não declarados como bytearrays, que são uma coleção de
bytes não interpretados. Pig pode inferir o tipo de um campo baseando-se no uso de operadores
que requerem um certo tipo, através de UDF’s (User Defined Functions) com um retorno
tipado conhecido, pelas informações de metadados fornecidos pela função LOAD ou
explicitamente declarados usando a cláusula AS. A conversão de dados do Pig é feita em tempo
de execução apenas. UDF’s são uma característica singular do Pig pois permitem uma
customização do código Pig que se adeque às necessidades do trabalho. Há vários tipos de
customização que podem ser aplicados a funções de avaliação, agregação, interfaces algébricas,
acumuladores e filtros. O maior suporte dessas customizações é na linguagem Java, mas que
pode ser aplicada na plataforma Pig sem problemas.
Conhecendo o seu modo de operação e seu modelo de dados, podemos compreender
como ocorre a construção relacional do código Pig Latin, que é formado por suas declarações.
27
O tutorial na página oficial da Apache Pig (Getting Started, 2016) traz as seguintes
características:
Com essas execuções, Pig processa por inteiro um script, analisando se tarefas
intermediárias do código podem ser combinadas para reduzir o tempo total de processamento.
Pig, assim como o Hive, também permite um motor de execução alternativo ao
MapReduce, o TEZ. Neste trabalho, ele será um diferencial para otimizar o fluxo dos Jobs e,
consequentemente, reduzir o tempo de execução.
Uma dúvida comum entre os iniciantes no estudo de Big Data e para novos integrantes
da comunidade Hadoop, ao conhecerem Hive e Pig, é saber em qual circunstâncias usar cada
um deles em seus projetos de análise de dados. Esta dúvida é pertinente ser esclarecida neste
projeto pois, como as duas ferramentas serão usadas, uma comparação é necessária para
especificar em quais momentos cada uma delas é mais útil, e como elas podem se complementar
para tornar o projeto mais eficiente e rápido.
A Tabela 1 demonstra um comparativo entre as duas ferramentas:
6
Expressões são construtores de linguagem usados com operadores de filtro e
agrupamento e funções de avaliação.
7
Esquemas são ferramentas que permitem atribuições de nomes à campos e
declaração de tipos. Agiliza a verificação e execução do código Pig Latin.
28
Tabela 1 – Comparativo Hive x Pig
Pig Hive
Linguagem procedural de Linguagem declarativa estilo
fluxo de dados SQL
Para programação Para criar relatórios
Usado principalmente por Usado principalmente por
pesquisadores e analistas de dados
programadores
Opera do lado cliente de Opera do lado servidor de um
um cluster cluster.
Não possui uma base de Faz uso da variação de um
dados dedicada a DDL SQL dedicado para
metadados. definir tabelas à priori.
Pig possui alguns aspectos Remete diretamente à SQL,
de SQL mas varia em sendo fácil de aprender para
muitos. experts em bases de dados.
8
ETL – Extract, Transform, Load. Processo de extração de dados de um determinado
local, manipulação desses dados, e carregamento em plataforma especificada.
9
Ver Pig vs Hive: Benchmarking High Level Query Languages nas referências
bibliográficas.
29
de dados (em média 36% mais rápido). Pig mostrou-se inferior apenas no agrupamento de
dados, sendo 104% mais lento que Hive (JAKOBUS, 2013).
Com todas as capacidades de manipulação de dados que Hive e Pig possuem, eles não
contêm uma estrutura robusta para uma visualização final dos dados. Pensando nisso, é
interessante adicionar uma ferramenta que proporcione uma exploração de dados mais
simplificada e interessante tanto para o cientista de dados, quanto aos usuários finais que
desconhecem as composições técnicas das bases de dados. Zeppelin é esta ferramenta.
2.9.1 Definição
30
O grande propósito do Zeppelin é fornecer uma ferramenta interativa de visualização de
dados, sendo interativo porque propicia um modelo volátil na estrutura de visualização que
melhor atenda às necessidades finais do usuário, que possa aglomerar diversas iterações de
dados em um único arquivo e que possa modificar seu arcabouço em tempo real e a cada nova
consulta. Isto permite que engenheiros e analistas de dados possam ser mais produtivos ao
desenvolver, organizar, executar e compartilhar códigos, visualizar resultados, e trabalhar com
os fluxos de trabalho sem se preocupar com linhas de comando ou detalhes do cluster (APACHE
ZEPPELIN, 2016).
Apache Zeppelin basicamente trabalha à base de seus interpretadores, que são módulos
que permitem entender a entrada feita pelos usuários de uma linguagem de processamento de
dados. Atualmente, Zeppelin possui suporte a interpretadores de diversas linguagens famosas
no mundo Big Data como SQL, R, Python, Scala, entre outros. Para adicionar uma linguagem
é preciso referenciá-la no contexto de interpretadores ao iniciar a escrita do código, como
mostra a figura 7 abaixo:
31
Na figura 7 temos a representação do Notebook Zeppelin com três visualizações
diferentes de dados. Todas foram criadas com consultas do interpretador SQL permitida através
da declaração %sql. Da esquerda para a direita, a primeira visualização mostra os dados em
estrutura de tabela, a segunda em gráfico de setores, a terceira em gráfico de linhas. Estas
visualizações são possíveis através de seus parágrafos que são constituídos de uma seção
destinada à escrita do código fonte, e uma seção que mostra o resultado da execução do código.
É importante para fins de otimização que se escolha, entre os interpretadores disponíveis
no catálogo do Zeppelin, o que proporciona o processo de visualização mais simples e eficiente.
Apache Spark é um sistema distribuído de processamento de dados baseado em JVM criado
especificamente para trabalhar com Big Data. A melhor justificativa de escolha do Spark para
esta etapa de visualização com Zeppelin, vem do conhecimento de que Spark roda programas
cem vezes mais rápido que MapReduce quando alocados em memória e dez vezes mais rápido
quando alocados em disco. Isto é possível devido a sua habilidade de realizar o processamento
na memória principal dos nós ativos e previne processamento de fluxo de dados desnecessário
em disco. Outra vantagem que o Spark oferece é a habilidade de encadear as tarefas mesmo na
fase de programação da aplicação, sem escrever – ou minimizando em último caso - rotinas em
disco (THOTTUVAIKKATUMANA, 2016).
Outra característica que demonstra a eficiência do Spark é a implementação do motor
de processamento de dados DAG (Directed Acyclic Graph), o mesmo conceito implementado
por TEZ no contexto Hive, visto no capítulo 2.6.2. Isso significa que para cada execução Spark,
uma tarefa DAG é criada pelo motor da aplicação. O conceito de processamento de dados in-
memory aliado ao processamento DAG leva o Spark ao nível mais avançado de eficiência e
velocidade.
O modelo do Spark constitui no seu núcleo a característica mais importante de abstração
de dados, o RDD (Resilient Distributed Dataset). Ele se encarrega de realizar o particionamento
e a distribuição da base de dados entre os nós do cluster de forma que não existam nós ativos
ociosos, além de replicar os dados contidos em nós que falharem, para os nós ativos
(THOTTUVAIKKATUMANA, 2016).
As qualidades do Spark como ferramenta de Big Data vêm também de seu suporte ao
paradigma de programação funcional, o qual o RDD do Spark se apropria.
Thottuvaikkatumana em seu livro “Apache Spark 2 For Beginners” (2016) explica o conceito:
32
linguagens de programação começarem a se comportar exatamente como funções
matemáticas de forma que a saída da função dependa somente da entrada, isso dá
muita previsibilidade as aplicações. O paradigma de programação computacional que
dá ênfase ao processo de construir tais aplicações e outros elementos baseados nisso,
e usando estas funções da mesma forma que qualquer outro tipo de dados esteja sendo
usado, é popularmente conhecido como paradigma de programação funcional.
Além disso, o autor nos apresenta a linguagem Scala, e sua importância na construção
do Spark. Ela consegue conciliar fortes capacidades de programação funcional sem perder
qualquer propriedade orientada a objetos. Spark é construído predominantemente em Scala, por
isso ele recebe muitos de seus bons conceitos aplicados ao seu RDD, por exemplo, utilizar
funções como parâmetros para transformações dos dados. Nesse sentido, o Spark RDD se
comporta como uma coleção de objetos, ou seja, métodos de transformação de dados são
compartilhados entre Scala e o Spark RDD para realizar as mesmas ações. Essa propriedade
fundamental resulta nos seguintes aspectos:
Spark RDD é imutável: Uma vez que um RDD é criado, ele não pode ser modificado.
Se um nó que estiver processando uma parte do RDD morrer, o programa pode recriar
as partes e redirecionar o processamento para outro nó até a completude do
processamento do dado (THOTTUVAIKKATUMANA, 2016);
Spark RDD é distribuído: Na execução de um programa, quando os nós ativos
disponíveis ao recebem suas respectivas tarefas, cada nó terá um contexto único de
execução, ou seja, cada tarefa é distribuída e executada em uma instância diferente de
JVM. Essa dinâmica do RDD ser dividido em porções menores, e ser distribuído entre
os nós ativos, e por fim, mesclar os resultados de volta, é oculta ao usuário, provendo o
ambiente necessário de resiliência na abstração de dados
(THOTTUVAIKKATUMANA, 2016);
Spark RDD vive em memória: Spark faz o máximo para manter seus RDD’s em
memória. Em raras exceções, se Spark estiver operando além da capacidade de
memória, ou o tamanho da base crescer além do ponto suportado, ele opera em disco
(THOTTUVAIKKATUMANA, 2016);
Spark RDD é fortemente tipado: Um RDD pode ser criado usando qualquer tipo
suportado de dado. Os tipos de dados podem tanto ser modelos Java/Scala pré
determinados, ou classes criadas pelo próprio usuário. Esta característica traz imunidade
33
a erros runtime10. Se o programa falhar, ele falhará somente em tempo de compilação
(THOTTUVAIKKATUMANA, 2016).
10
Erros Runtime são exceções que ocorrem durante a execução da aplicação. Nesses
casos a aplicação não consegue continuar operando e se encerra.
34
3. METODOLOGIA
35
menu de configuração, a quantidade de memória base e CPU destinada à máquina virtual.
Neste trabalho, temos a limitação de 12GB de memória RAM, portanto destinamos 9GB
para a máquina virtual e 3GB para o sistema operacional. Com um processador de quatro
núcleos, podemos destinar três núcleos para máquina virtual e deixar um núcleo para a
máquina local.
Após estes preparativos, o HDP está pronto para iniciar. A máquina virtual carregará
o sistema CentOS, que por usa vez carregará o HDP e seus componentes. A primeira
inicialização pode durar vários minutos, de acordo com a quantidade de memória alocada.
Findado este processo, resulta a seguinte tela demonstrada pela figura 7 abaixo. Nela
contém descrito a versão do HDP (2.6.4), o endereço ip do sandbox HDP ligado ao host da
máquina virtual, representado por 127.0.0.1 junto com :8888 que representa a porta para a
página de boas-vindas.
36
O Terminal SHH (secure shell) Shell in a box é uma ferramenta que permite a
comunicação segura entre o sistema da máquina virtual e o sandbox HDP. Acessado pelo ip do
host e porta :4200 (padrão – 127.0.0.1:4200). Será requerido o login root e senha hadoop para
primeiro acesso. Após login, configuraremos a senha de acesso ao Ambari pelo comando:
ambari-admin-password-reset. É importante manter o terminal SSH operante, pois
realizaremos através dele outros comandos posteriormente.
Na tela de login Ambari, são pedidos usuário e senha. Usaremos o login admin porque
ele nos dá permissões totais de controle do cluster e configuração dos serviços disponíveis. A
senha é a mesma criada anteriormente pelo terminal SSH.
Somos então direcionados para a dashboard que contém as funções centrais do Ambari
enumerados na figura 8:
37
3.3 Adquirindo os dados brutos e adicionando-os ao HDFS
38
3.4 Criações de tabelas no Hive e junção de arquivos no Pig
1. Abas que contém as funções principais do Hive, permitindo criar códigos HiveQL,
verificar histórico de consultas, modificar, criar e excluir estrutura de tabelas, criar
UDF’s Hive, e configurações gerais;
2. Seleção de base de dados;
3. Local para codificação;
4. Tabelas da base de dados selecionada.
Criaremos então as tabelas em coluna única tipo string para cada seção: orçamento,
receita e transferências. A partir deste ponto do projeto, como os dados de todas as seções
seguem um modelo estrutural similar, escolhemos apresentar o processo tão somente dos dados
39
de transferências. Nos casos onde o processo se individualizar, eles serão descritos. É a partir
deste ponto também que declararemos o formato de arquivo ORC na criação de todas as tabelas
Hive, com o intuito de usufruir de suas capacidades. Para especificar este formato, basta
adicionar o comando “stored as orc” ao final do código HiveQL. A estrutura está no apêndice
4- Estrutura tabela inicial Hive. Essas tabelas atuarão como intermediárias ao receber os
dados agrupados de todos os anos e meses para cada tipo e transferi-las para outras tabelas e
realizar novas modificações. Consecutivamente, o agrupamento de dados e sua transferência
para a tabela Hive criada serão feitos por um script Pig.
Da mesma forma que o Hive, acessamos a interface Pig pelo Ambari na aba Pig View,
e então teremos a figura 10 abaixo:
2 5
3
1
40
transferi-los aos Hive. A relação receberá o caminho HDFS da pasta e carregará todos os
arquivos nela contidos para o PigStorage. Com o comando store, será armazenada a relação na
tabela indicada no formato ‘database.tabela’, sendo essencial adicionar o argumento “–
useHCatalog” para demonstrar o uso da função de armazenamento HCatStorer. Script contido
no apêndice 5 – Script Pig agregar arquivos HDFS. Seguindo este processo, os dados estarão
presentes nas tabelas Hive especificadas.
É importante perceber que ao realizar a primeira consulta, apesar dos dados estarem
organizados linearmente, estão concentrados em uma única coluna, necessitando de uma
avaliação de seus metadados e definição de uma estrutura de separação dos mesmos. Os
metadados de cada tipo estão no apêndice 6 – Metadados tabelas. O Hive possui ferramentas
com este fim de separação porém, com o objetivo de manter a durabilidade e consistência dos
dados, manteremos as tabelas originais inalteradas e usaremos expressões regulares para
modificar a estrutura dos dados e enviá-las a novas tabelas. As primeiras consultas mostram
uma separação delimitada por um caractere específico, por ponto e vírgula (;).
Desenvolveremos então um insert em uma nova tabela Hive a partir de um select dos dados
originais com a separação por colunas com funções regexp_extract(). Nesta função, o código
‘\073’ representa o ponto e vírgula. Separados os dados, teremos várias colunas onde os
registros estarão entre aspas, para isso criaremos uma expressão regular para selecionar apenas
os dados e descartar as aspas. Outra pequena alteração que deve ser feita refere-se as colunas
que contém valores monetários. Esses números denotam os valores decimais com vírgula, sendo
que os padrões do hive precisam que os valores decimais sejam representados por ponto. Isso
permitirá também a mudança dos tipos de string para double, com objetivo de fazer operações
matemáticas analíticas com esses números. Faremos também, na tabela de transferências, uma
separação da coluna ‘ano_mes’ em duas colunas separadas, uma para o ano, outra para o mês.
Isso facilitará as análises futuras de períodos temporais. Criação de tabela e códigos insert são
encontrados no apêndice 7 – Expressões Regulares para organização dos dados.
41
3.6 Modificações finais para os tipos
Antes de entregarmos os dados para as visualizações, faremos alguns ajustes finais para
tornar a próxima etapa mais prática e rápida. Inicialmente, criaremos um pig Script para filtrar
os registros, selecionando todas as tuplas e descartando os headers. Os headers são registros
contidos em cada arquivo baixado do portal de transparência, com objetivo de identificar os
dados. Com as definições das colunas, esses headers são desnecessários. Dentro deste script, é
utilizado uma UDF Pig escrita em Java, com o objetivo de transformar os números na coluna
dos meses, em suas representações escritas por extenso. Esta UDF é adicionada ao código
através do comando “REGISTER” onde deve-se especificar caminho hdfs do código e o
comando “DEFINE” onde podemos realizar uma nova atribuição ao nome da função. Os
comandos “foreach” representam uma iteração – linha por linha – do código para gerar, através
do comando “generate” os itens escolhidos. Códigos presentes no apêndice 8- Header Script
e UDF mês (transferências).
O próximo passo resume-se em lançar mão de scripts Pig para criar tabelas específicas
dos somatórios do orçamento, receita e transferências, agrupados por ano e trimestres. Com a
limitação de memória, isto é essencial para que mais à frente não precisemos aglutinar muitas
operações em uma única consulta, que resultaria em um tempo excessivo de processamento ou
uma exceção por falta de memória. É nesta parte que os códigos terão a maior quantidade de
agrupamentos e somas, pois são as operações onde Pig se mostrou mais eficiente – na análise
de benchmarking - em relação ao Hive. Os códigos estão presentes no apêndice 9 –
Consolidados monetários anuais.
É aqui que os dados organizados nas etapas anteriores tomarão corpo, em um formato
visual sofisticado para as análises essenciais e suas descobertas e conclusões decorrentes. O
Zeppelin possui uma página específica, sendo acessado através do ip do host, na porta :9995
(no nosso caso 127.0.0.1:9995). A figura 11 abaixo representa a primeira visão do Zeppelin.
Para criar um notebook, basta acessar sua respectiva aba e selecionar o item ‘create new note’
e atribuir nome e o interpretador padrão.
42
Figura 12 – Página Inicial Zeppelin
Ao criar o primeiro relatório, é necessário definir o interpretador que será utilizado para
criar os parágrafos no Zeppelin. Como já realizamos todos as transformações dos dados com
Hive e Pig, resta ao Zeppelin apenas, aplicar as consultas que resultarão nas visualizações finais.
Para isso, utilizaremos o interpretador %spark2.sql que nos proporciona a estrutura do spark
para execução rápida e persistência dos dados em memória, aliada a praticidade das consultas
SQL e alguns elementos de Scala para criação de formulários dinâmicos.
Sequencialmente, estruturaremos o modelo dos relatórios. Organizaremos os notebooks
em duas seções que representam as análises dos dados e serão os resultados finais deste
trabalho. É importante lembrar que ao decorrer das seções tentaremos interpretar os dados no
objetivo de identificar os motivos que levaram à crise financeira iniciada em 2014, medidas de
recuperação e possíveis dados estranhos que apareçam. Essa é uma abordagem importante visto
que estamos trabalhando com dados do portal de transparência do Governo Federal, que visa
mostrar com exatidão seu planejamento e execução monetária.
Esta seção será responsável por gerar os relatórios contendo uma análise dos dados
relacionados aos repasses. A figura 13 abaixo representa os dois primeiros resultados. Temos
um gráfico em barras especificando anualmente os repasses distribuídos pelos Estados. Os
43
maiores repasses são destinados aos Estados de São Paulo, Minas Gerais, Bahia e Rio de
Janeiro, respectivamente. Isso faz sentido, uma vez que são os Estados mais populosos do
Brasil. Ao analisar a distribuição por regiões, com o ano de 2017 como referência, o Sudeste
possui 28,3% dos repasses, Sul com 12%, Norte com 16,7%, Nordeste possui a maior
porcentagem com 36.5% e Centro-Oeste com 6.5%. Há também no gráfico, o mais alto valor
repassado para um grupo vazio, e um outro grupo para distribuição de múltiplos Estados. O
grupo vazio representa os valores repassados diretamente aos municípios compostos
majoritariamente dos fundos municipais e com o maior valor direcionado a Organização Pan-
Americana de Saúde (OPAS), responsável pela organização do programa Mais Médicos. Os
dois juntos representam mais de quatro bilhões do orçamento dos Estados. Os repasses para
múltiplos Estados são referentes na maior parte ao Teto MAC (Medicina de alta complexidade)
e o PAB (Piso de Atenção Básica) repassado pelo Governo Federal via SUS para administração
dos Estados e municípios, ou seja, todos compõem gastos de saúde.
No segundo gráfico, temos a distribuição anual dos repasses pelo tipo de transferências,
sendo as ‘Constitucionais e Royalties’, que são as despesas obrigatórias determinadas pela
constituição, presentes no pacto federativo da União com os Estados e municípios e os
benefícios derivados de royalties. E também as transferências ‘Legais, Voluntárias e
Específicas’ que são os repasses previstos em leis específicas ou a títulos de cooperação, auxílio
e assistência financeira aos entes federados. Disto isto, verificando o gráfico, percebemos uma
estabilização dos valores entre os anos de 2014 e 2015 e uma alta em 2016 porém, temos em
2013 um valor ínfimo de 45 milhões de reais de repasses ‘Legais, Voluntários e Específicos’
em comparação aos outros anos. Este é um valor único direcionado a compensação financeira
dos Estados pelos Royalties do tratado de Itaipu. A ausência dos demais valores desta categoria
é um ponto de atenção e provavelmente representa dados faltosos de 2013.
44
Figura 13 – Repasses por Tipo
45
Figura 14 – Tipo Favorecimento
Nas próximas views temos os repasses dispostos por períodos do ano. Na figura 15
abaixo a primeira visualização em linha mostra um vertiginoso aumento do repasse de 2013
para 2014, decorrente da provável não publicidade integral dos gastos do tipo ‘Legais,
Voluntários e Específicas’. Os gastos gerais aumentaram de 2014 até 2016 com uma leve queda
em 2017. Especificamente, olhando a distribuição trimestral dos repasses, o aumento
substancial no quarto trimestre de 2016 em relação ao mesmo período do ano anterior é o
responsável pelo aumento visto no quadro anual. Da mesma forma, na figura 16, encontramos
na visualização de repasses por mês que esse aumento ocorre especificamente em uma pequena
parte no mês de novembro de 2016, mas vertiginosamente em dezembro do mesmo ano. Sendo
que os grandes responsáveis por esse aumento são, mais uma vez, os encargos especiais pagos
pelos Estados. Os códigos que geraram as imagens desta seção estarão disponíveis no apêndice
10 – Zeppelin - Repasses por Tipo e Datas.
46
Figura 15 – Repasses por ano e trimestres
47
Figura 17 – Relação Orçamento/Transferências
48
Figura 18 – Orçamento anual
49
valores de execução mais próximos do orçamento final estipulado, evidenciando a baixa
possibilidade de cortes, que ocorre em certa medida nas amortizações e refinanciamentos da
dívida. Realizando uma análise sobre esse crescimento dos gastos previdenciários, percebemos
um aumento de 9% de 2014 para 2015, 12,7% de 2015 para 2016 e 9,8% de 2016 para 2017.
Com uma média de crescimento da previdência de 10% ao ano, os custos de previdência social
alcançariam o orçamento atual em 2031.
Por fim, averiguamos a relação entre a receita e o orçamento. Temos em todos os anos
um planejamento orçamentário acima da receita, tendo o seu menor percentual de 103.7% em
2016 e seu maior percentual de 130.97% em 2017. Porém, quanto a execução, ela se torna
menor que a receita, tendo o menor valor de 82.25% em 2015 e o maior valor de 94.02% em
2014. Os códigos que geraram as imagens desta seção estão no apêndice 11 – Zeppelin –
Análises do Orçamento.
50
4 – CONCLUSÃO
51
A fronteira de possibilidades com os dados depende da criatividade, colaboração e
experiência dos profissionais envolvidos, estrutura adequada para o desenvolvimento dos
trabalhos de uma organizção e a vontade de buscar novas perspectivas nos dados. A área de Big
Data é um ramo da computação relativamente novo e em constante evolução. É um campo de
variedades de conhecimento que permite a criação de processos disruptivos que impactarão
profundamente a formação da sociedade do futuro.
52
5 – APÊNDICES
Os relatórios Zeppelin de onde se originaram as figuras das seções 3.7.1 e 3.7.2 serão
exportados e armazenados em um CD para acesso e manipulação dos interessados, que deverão
atender aos devidos processos de instalação do framework HDP 2.6 para poder utilizá-los. O
código utilizado para criação da UDF Pig também estará disponível no CD.
Abaixo estão os códigos principais utilizados ao decorrer do trabalho. A numeração é
referência direta da ordem de utilização dos códigos no corpo do projeto.
#!/bin/bash
#Script para modificar encoding de arquivos
#De ANSI
FROM_ENCODING="ISO-8859-1"
#Para UTF8
TO_ENCODING="UTF-8"
#Método de conversão
CONVERT=" iconv -f $FROM_ENCODING -t $TO_ENCODING"
#Loop de conversão para todos arquivos da pasta atual
for file in *.csv;
do $CONVERT "$file" -o "${file%.csv}_v2.csv";
done
#Permissões de usuário
for file in *;
do sudo chown gabriel "$file";
done
exit 0
53
sshfs -o port=2222 root@127.0.0.1:/root ~/sshfs
CÓDIGO UTILIZADO:
hdfs dfs -copyFromLocal /root/transf_verba_fed /user/admin
EXPLICATIVO:
hdfs dfs –copyFromLocal [caminho_arquivo_pasta_origem]
[caminho_arquivo_pasta_destino]
CÓDIGO UTILIZADO:
create table if not exists transf (dados string) stored as orc;
EXPLICATIVO:
create table if not exists [nome_tabela] (nome_coluna string) stored as orc;
CÓDIGO UTILIZADO:
a = load '/user/admin/hive/verba/transf_novo' using PigStorage() as (dados:chararray);
store a into 'transferencias.transf' using org.apache.hive.hcatalog.pig.HCatStorer();
-useHCatalog
EXPLICATIVO:
[relação] = load [/caminho_HDFS] using PigStorage() as ([alias]:[tipo]);
store [relação] into ‘[database].[tabela]’ using ork.apache.hive.hcatalog.pig.HCatStorer();
[argumento_Hcatalog]
TRANSFERÊNCIAS:
54
Nome Subfunção, Código do Programa, Nome do Programa, Código da Ação, Nome da Ação,
Linguagem Cidadã, Código do Favorecido, Nome do Favorecido, Valor do Repasse
RECEITA:
Código órgão Superior, Órgão Superior, Código do Órgão, Órgão, Código da Unidade Gestora,
Unidade Gestora, Categoria Econômica, Origem da Receita, Espécie Receita, Detalhes, Valor
Previsto, Valor Lançado, Valor Realizado, Percentual Realizado, Data de Lançamento, Ano
ORÇAMENTO:
Exercício, Código Órgão Superior, Órgão Superior, Código Órgão Subordinado, Órgão
Subordinado, Código Unidade Orçamentária, Unidade Orçamentária, Código Função, Função,
Código Subfunção, Nome Subfunção, Código Programa Orçamentário, Nome Programa
Orçamentário, Código Ação, Ação, Código Categoria Econômica, Nome Categoria Econômica,
Código Grupo Despesa, Grupo Despesa, Código Elemento Despesa, Elemento Despesa,
Orçamento Inicial, Orçamento Atualizado, Orçamento Realizado.
SEPARAR COLUNAS:
55
regexp_extract(dados, '^(([^\073]*)\073?){7}',2) cod_funcao,
regexp_extract(dados, '^(([^\073]*)\073?){8}',2) nome_funcao,
regexp_extract(dados, '^(([^\073]*)\073?){9}',2) cod_subfuncao,
regexp_extract(dados, '^(([^\073]*)\073?){10}',2) nome_subfuncao,
regexp_extract(dados, '^(([^\073]*)\073?){11}',2) cod_programa,
regexp_extract(dados, '^(([^\073]*)\073?){12}',2) nome_programa,
regexp_extract(dados, '^(([^\073]*)\073?){13}',2) cod_acao,
regexp_extract(dados, '^(([^\073]*)\073?){14}',2) nome_acao,
regexp_extract(dados, '^(([^\073]*)\073?){15}',2) linguagem_cidada,
regexp_extract(dados, '^(([^\073]*)\073?){16}',2) cod_favorecido,
regexp_extract(dados, '^(([^\073]*)\073?){17}',2) nome_favorecido,
regexp_extract(dados, '^(([^\073]*)\073?){18}',2) valor_repasse
from transf;
RETIRAR ASPAS:
56
SEPARAR ANO E MÊS EM TABELAS DISTINTAS:
HEADER SCRIPT:
REGISTER hdfs:///user/admin/.pigJars/pigUDF.jar
DEFINE pigUDF org.apache.pig.udf.pigUDF();
a = load 'transferencias.transf
using org.apache.hive.hcatalog.pig.HCatLoader() as (ano_mes:chararray,
tipo_transf:chararray, tipo_favorecido:chararray, uf:chararray, cod_municipio_siafi:chararray,
nome_municipio:chararray, cod_funcao:chararray, nome_funcao:chararray,
cod_subfuncao:chararray, nome_subfuncao:chararray, cod_programa:chararray,
nome_programa:chararray, cod_acao:chararray, nome_acao:chararray,
linguagem_cidada:chararray, cod_favorecido:chararray, nome_favorecido:chararray,
valor_repasse:float, ano:chararray, mes:chararray);
b = foreach a generate $1..$18,
pigUDF($19) as mes:chararray;
c = filter b by ($2!='UF');
store c into 'transferencias.final' using org.apache.hive.hcatalog.pig.HCatStorer();
DEPENDÊNCIAS MAVEN:
<dependency>
<groupId>org.apache.pig</groupId>
<artifactId>pig</artifactId>
<version>0.15.0</version>
</dependency>
<dependency>
<groupId>org.apache.hadoop</groupId>
<artifactId>hadoop-core</artifactId>
<version>0.20.2</version>
</dependency>
57
CÓDIGO JAVA:
package com;
import java.io.IOException;
import org.apache.pig.EvalFunc;
import org.apache.pig.data.Tuple;
@Override
public String exec(Tuple a) throws IOException {
if(a == null || a.size() == 0){
return null;}
String i = (String)a.get(0);
String output;
if(i == "01" ){
output = "janeiro";
return output.toUpperCase();}
else if (i == "02"){
output = "fevereiro";
return output.toUpperCase();}
else if (i == "03"){
output = "março";
return output.toUpperCase(); }
else if (i == "04"){
output = "abril";
return output.toUpperCase();}
else if (i == "05"){
output = "maio";
return output.toUpperCase();}
else if (i == "06"){
output = "junho";
return output.toUpperCase();}
else if (i == "07"){
output = "julho";
return output.toUpperCase();}
else if (i == "08"){
output = "agosto";
return output.toUpperCase();}
else if (i == "09"){
output = "setembro";
return output.toUpperCase();}
else if (i == "10"){
output = "outubro";
return output.toUpperCase();}
else if (i == "11"){
output = "novembro";
return output.toUpperCase();}
58
else if (i == "12"){
output = "dezembro";
return output.toUpperCase();}
else
return "";
}
}
Todos os códigos são armazenados em uma tabela hive no formato da saída da última relação
apresentada no script.
a = load 'transferencias.final'
using org.apache.hive.hcatalog.pig.HCatLoader()
as (tipo_transf:chararray, tipo_favorecido:chararray, uf:chararray,
cod_municipio_siafi:chararray, nome_municipio:chararray, cod_funcao:chararray,
nome_funcao:chararray, cod_subfuncao:chararray, nome_subfuncao:chararray,
cod_programa:chararray, nome_programa:chararray, cod_acao:chararray,
nome_acao:chararray, linguagem_cidada:chararray, cod_favorecido:chararray,
nome_favorecido:chararray, valor_repasse:double, ano:chararray, mes:chararray);
b = foreach a generate $17 as ano, $16 as valor_repasse;
c = group b by ano;
d = foreach c generate $0 as ano, SUM(b.valor_repasse) as repasse;
store d into 'transferencias.consolidado_transferencia_ano' using
org.apache.hive.hcatalog.pig.HCatStorer();
a = load 'transferencias.orcamento_final'
using org.apache.hive.hcatalog.pig.HCatLoader()
as (exercicio:chararray, cod_orgao_superior:chararray, orgao_superior:chararray,
cod_orgao_subordinado:chararray,
orgao_subordinado:chararray, cod_unidade_orcamentaria:chararray,
unidade_orcamentaria:chararray, cod_funcao:chararray, funcao:chararray,
cod_subfuncao:chararray, subfuncao:chararraycod_programa_orcamentario:chararray,
programa_orcamentario:chararray, cod_acao:chararray, acao:chararray,
cod_categoria_economica:chararray, categoria_economica:chararray,
cod_grupo_despesa:chararray, grupo_despesa:chararray, cod_elemento_despesa:chararray,
elemento_despesa:chararray, orcamento_inicial:double,
orcamento_atualizado:double, orcamento_realizado:double);
b = foreach a generate $0 as ano, $21 as valor_inicial, $22 as valor_atualizado, $23 as
valor_realizado;
c = group b by ano;
d = foreach c generate $0 as ano, SUM(b.valor_inicial) as orcamento_inicial,
59
SUM(b.valor_atualizado) as orcamento_atualizado,
SUM(b.valor_realizado) as orcamento_realizado;
store d into 'transferencias.consolidado_orcamento_ano' using
org.apache.hive.hcatalog.pig.HCatStorer();
a = load 'transferencias.receita_final'
using org.apache.hive.hcatalog.pig.HCatLoader()
as (cod_orgao_superior:chararray, orgao_superior:chararray,
cod_orgao:chararray, orgao:chararray, cod_unidade_gestora:chararray,
unidade_gestora:chararray, categoria_economica:chararray, origem_receita:chararray,
especie_receita:chararray, detalhes:chararray, valor_previsto:double, valor_lancado:double,
valor_realizado:double, percentual_realizado:float,
data_lancamento:chararray, ano:chararray);
b = foreach a generate $15 as ano, $12 as valor_realizado;
c = group b by ano;
d = foreach c generate $0 as ano, SUM(b.valor_realizado) as receita;
store d into 'transferencias.consolidado_receita_ano' using
org.apache.hive.hcatalog.pig.HcatStorer();
a = load 'transferencias.transf_final'
using org.apache.hive.hcatalog.pig.HCatLoader()
as (tipo_transf:chararray, tipo_favorecido:chararray, uf:chararray,
cod_municipio_siafi:chararray, nome_municipio:chararray, cod_funcao:chararray,
nome_funcao:chararray,
cod_subfuncao:chararray, nome_subfuncao:chararray, cod_programa:chararray,
nome_programa:chararray,
cod_acao:chararray, nome_acao:chararray, linguagem_cidada:chararray,
cod_favorecido:chararray,
nome_favorecido:chararray, valor_repasse:double, ano:chararray, mes:chararray);
b = foreach a generate $17 as ano, $16 as valor_repasse, $18 as mes;
b1 = filter b by (mes == 'JANEIRO' or mes == 'FEVEREIRO' or mes == 'MARÇO');
b2 = filter b by (mes == 'ABRIL' or mes == 'MAIO' or mes == 'JUNHO');
b3 = filter b by (mes == 'JULHO' or mes == 'AGOSTO' or mes == 'SETEMBRO');
b4 = filter b by (mes == 'OUTUBRO' or mes == 'NOVEMBRO' or mes == 'DEZEMBRO');
c1 = group b1 by ano;
c2 = group b2 by ano;
c3 = group b3 by ano;
c4 = group b4 by ano;
d1 = foreach c1 generate $0 as ano, SUM(b1.$1) as repasse;
d2 = foreach c2 generate $0 as ano, SUM(b2.$1) as repasse;
d3 = foreach c3 generate $0 as ano, SUM(b3.$1) as repasse;
d4 = foreach c4 generate $0 as ano, SUM(b4.$1) as repasse;
final1 = join d1 by ano, d2 by ano, d3 by ano, d4 by ano;
60
final2 = foreach final1 generate $0 as ano, $1 as primeiro, $3 as segundo, $5 as terceiro, $7 as
quarto;
store final2 into 'transferencias.trimestre' using org.apache.hive.hcatalog.pig.HCatStorer();
INTERPRETADOR - %spark2.sql
POR AÇÃO
61
select ano, nome_acao, sum(valor_repasse) as repasse from transferencias.transf_final group
by nome_acao, ano having repasse>10000000000
INTERPRETADOR - %spark2.sql
DESTINO DO ORÇAMENTO
select transf.ano, transf.repasse as transferencias_estados, orc.orcamento_realizado as
orcamento_total,
62
(orc.orcamento_realizado - transf.repasse) as orcamento_federal from
transferencias.consolidado_transferencia_ano transf
left join transferencias.orcamento_ano_percentagem orc
on (transf.ano=orc.ano) where transf.ano = "${Ano=2014,2014|2015|2016|2017}"
FUNÇÃO DO ORÇAMENTO
select exercicio, funcao, sum(orcamento_realizado) from transferencias.orcamento_final
where exercicio = "${Ano=2014,2014|2015|2016|2017}" group by exercicio, funcao order by
sum(orcamento_realizado) desc
63
6 - BIBLIOGRAFIA
WINBLAD, A. Venture Investing & Hiring In Silicon Valley, CNBC Interview: 2012
Disponível em: http://video.cnbc.com/gallery/?video=3000074076
AGÊNCIA BRASIL EBC; 2016. Ajuste fiscal, crise nos estados e inflação; veja fatos da
economia em 2016. Disponível em: http://agenciabrasil.ebc.com.br/economia/noticia/2016-
12/ajuste-fiscal-crise-nos-estados-infla%C3%A7%C3%A3o-veja-o-que-marcou-a-economia-
em-2016
DAYONG, D., Apache Hive Essentials. 1. ed. Birmingham B3 2PB, Editora: Packt
Publishing, 2015. 54-56 p.
PROKOPP, C. ORC: An Intelligent Big Data file format for Hadoop and Hive. 2014.
Disponível em: http://www.semantikoz.com/blog/orc-intelligent-big-data-file-format-hadoop-
hive/
64
HANSON, E. 2015. Vectorized Query Execution. Disponível em:
https://cwiki.apache.org/confluence/display/Hive/Vectorized+Query+Execution
JAKOBUS, B.; MCBRIEN, P., Pig vs Hive: Benchmarking High Level Query Languages,
Imperial College London, 2013. Disponível em:
https://www.ibm.com/developerworks/library/ba-pigvhive/pighivebenchmarking.pdf
65