Apache Hive Simpl I Fica Big Data

Fazer download em pdf ou txt
Fazer download em pdf ou txt
Você está na página 1de 21

Apache Hive: simplificando solues BigData

Pgina 1 de 21

www.devmedia.com.br
[verso para impresso]
Link original: http://www.devmedia.com.br/articles/viewcomp.asp?comp=30582

Apache Hive: simplificando


solues BigData
Conhea nesse artigo a ferramenta ideal para simplificar
sua soluo de Big Data

Fique por dentro


Este artigo ir abordar a ferramenta Apache Hive, um Data Warehouse criado com
base no Apache Hadoop, demonstrando exemplos de seu uso para manipular dados
atravs da linguagem HiveQL e, tambm, da sua utilizao dentro de uma aplicao
Java.
Esse tema til para desenvolvedores que tenham interesse em ferramentas para
manipulao e tratamento de informaes em grande escala, visando uma melhor
performance e facilidade no manuseio de dados. Alm disso, programadores que
tenham interesse em conhecer solues para diminuir a complexidade das tarefas
dentro do Apache Hadoop, sem perder as vantagens da utilizao do Map/Reduce,
encontraro uma alternativa fcil e eficiente na ferramenta Apache Hive.

http://www.devmedia.com.br/articles/viewcomp_forprint.asp?comp=30582

11/08/2014

Apache Hive: simplificando solues BigData

Pgina 2 de 21

O Apache Hadoop vem sendo, nos ltimos anos, o grande nome na computao
moderna. Disponibilizando solues para tratar dados que antes, devido sua
complexidade e escala, eram simplesmente descartados, essa ferramenta da Apache
j foi adotada por diversos gigantes da informtica, como Yahoo, eBay e Facebook.
Com o avano dos requisitos e o amadurecimento das implementaes do Hadoop
nessas empresas, surgiu, de dentro de uma delas, a primeira verso do Apache Hive.
Introduzido pelo Facebook em 2009, o Apache Hive foi concebido com a ideia de
construir uma aplicao de Data Warehouse open source, que utilizasse conceitos do
Hadoop, como Map/Reduce e HDFS, para manipular e armazenar dados.
Explicando um pouco o conceito dessa categoria de aplicaes, softwares de Data
Warehouse so responsveis por armazenar dados de diversos sistemas em um
repositrio nico onde, atravs de transformaes das informaes que so enviadas
por suas interfaces de acesso, esse contedo formatado de acordo com um padro
especfico de armazenagem definido para utilizao no sistema em questo.
Como exemplo dessas aplicaes, temos os bancos de dados relacionais, como o
MySQL, sistemas de indexao, como o Apache Solr, bancos de dados no relacionais,
como o MongoDB, entre outros.
Cada um desses sistemas apresenta solues mais customizadas para determinadas
situaes, porm tentam sempre manter o foco em alguns pontos principais como
escalabilidade, performance, usabilidade e confiabilidade.
Esses pontos, por sua vez, foram as principais preocupaes na implementao do
Hive que, alm disso, buscou diminuir a complexidade e a curva de aprendizado da
utilizao das funcionalidades do Hadoop atravs da linguagem HiveQL, permitindo
seu uso por desenvolvedores que no possuem conhecimento extenso da plataforma
de Map/Reduce, com um cdigo intuitivo e mais prximo do SQL.
O objetivo de nosso artigo ser, portanto, demonstrar as principais caractersticas
dessa linguagem e ferramenta, sua relao com o Apache Hadoop e criar um exemplo
de aplicao em Java capaz de se comunicar com a base de dados do Hive e
manipular seu contedo.

http://www.devmedia.com.br/articles/viewcomp_forprint.asp?comp=30582

11/08/2014

Apache Hive: simplificando solues BigData

Pgina 3 de 21

Antes de iniciarmos nossa discusso sobre o Apache Hive, necessrio entendermos


alguns conceitos bsicos do Apache Hadoop. Esse framework, criado em 2005, trouxe
diversas novidades rea da informtica ao apresentar solues inovadoras para o
tratamento e armazenamento de grandes quantidades de dados.
Essas solues se baseiam, em sua grande maioria, no conceito de Map/Reduce. Esse
modelo de programao, implementado dentro do Apache Hadoop, permite que os
dados sejam manipulados por diversas tarefas independentes em paralelo, garantindo
eficincia e um processamento das informaes de forma distribuda.
As trs principais fases desse modelo so denominadas: Map, onde o arquivo a ser
processado dividido em pares de chave e valor de acordo com o seu contedo;
Group, onde os conjuntos de tuplas (pares de dados) so agrupados de acordo com o
valor de suas chaves; e a fase final Reduce, que ir executar uma tarefa de reduo
para cada agrupamento gerado na fase anterior, transformando-os em um nico
resultado final.
Aliando uma implementao robusta do Map/Reduce e o conceito de HDFS, sistema de
arquivos que permite uma distribuio de dados entre diversas mquinas, o Hadoop
se mostra extremamente eficaz e seguro para a construo de clusters e parte
fundamental da maioria das aplicaes modernas de anlise e armazenamento de
informaes em grande escala.

Porm, juntamente com todos esses benefcios e inovaes introduzidos pelo Apache
Hadoop, comearam a surgir alguns questionamentos e dificuldades em relao
utilizao desse framework.
A primeira dessas dificuldades foi o fato da grande maioria dos desenvolvedores no
ter familiaridade com a sintaxe e uso da ferramenta, tornando a curva de aprendizado
muito grande e a dificuldade de achar profissionais no mercado considervel.
O segundo contratempo foi o da complexidade de comandos para executar consultas
nos arquivos armazenados dentro de um HDFS. A ao de ler e filtrar os dados

http://www.devmedia.com.br/articles/viewcomp_forprint.asp?comp=30582

11/08/2014

Apache Hive: simplificando solues BigData

Pgina 4 de 21

contidos nos diretrios distribudos do Hadoop (HDFS) envolvem diversos comandos


juntamente com a execuo de processos de Map/Reduce para, ao final, nos trazer os
resultados adequados. Isso, apesar de no ser muito extenso quando falamos de
consultas simples, pode se tornar extremamente complexo ao manipularmos um
nmero extenso de informaes e arquivos.
Visando solucionar essas dificuldades, o Facebook lanou em 2009 a primeira verso
do Hive. Sua ideia era a de criar uma aplicao que serviria como um Data Warehouse
para os arquivos armazenados dentro do HDFS e de disponibilizar uma linguagem
para manipular essa informao que fosse de fcil entendimento e utilizao para os
desenvolvedores, a denominada HiveQL.
Essa linguagem muito similar ao SQL, utilizada pelos bancos de dados relacionais, e
trouxe a familiaridade necessria para popularizar o Hive entre os desenvolvedores,
permitindo que as tarefas de Map Reduce fossem traduzidas para simples queries
em HiveQL. Na Listagem 1 demonstrado um comparativo entre uma query simples
utilizando HiveQL e a mesma consulta sendo feita utilizando Hadoop puro, mostrando
a diferena de complexidade entre as duas consultas.
Listagem 1. Comparativo HiveQL x Hadoop Map/Reduce para fazer uma query
simples.

#HiveQL - 1 comando
select key, count(1) from kv1 where key>100 group by key;
#Hadoop - 4 comandos
$ cat > /tmp/reducer.sh
uniq -c | awk '{print $2"\t"$1}
$ cat > /tmp/map.sh
awk -F '\001' '{if($1 > 100) print $1}
$ bin/hadoop jar contrib/hadoop-0.19.2-dev-streaming.jar
-input /user/hive/warehouse/kv1 -mapper map.sh
-file /tmp/reducer.sh -file /tmp/map.sh
-reducer reducer.sh -output /tmp/largekey
-numReduceTasks 1
$ bin/hadoop dfs cat /tmp/largekey/part*

http://www.devmedia.com.br/articles/viewcomp_forprint.asp?comp=30582

11/08/2014

Apache Hive: simplificando solues BigData

Pgina 5 de 21

Como pode ser observado no comparativo da Listagem 1, enquanto a query no Hive


roda com apenas um comando muito semelhante ao SQL, a query pura no Hadoop
exige a criao de um arquivo para descrever o processo de Reduce, outro para
descrever o processo de Map, a execuo da tarefa utilizando ambos os arquivos e, ao
final, a traduo do resultado, ou seja, existem quatro vezes mais comandos
envolvidos dentro do Hadoop do que se comparado ao nico comando necessrio para
rodar a consulta dentro da interface do Apache Hive.

Essa simplicidade em relao ao Hadoop se deve ao funcionamento interno do


tradutor de queries em HiveQL, presente na implementao do Apache Hive. Esse
processa os comandos atravs de um sistema de armazenamento de Metadados,
capaz de guardar informaes pertinentes aos campos e tabelas definidas no Hive e
fazer a relao dessas informaes com os arquivos armazenados no HDFS,
possibilitando, ao executar uma consulta ou comando em HiveQL, a traduo para
tarefas de Map/Reduce. Na Figura 1 apresentado um diagrama que representa o
fluxo de traduo dentro dos principais componentes do Apache Hive.

http://www.devmedia.com.br/articles/viewcomp_forprint.asp?comp=30582

11/08/2014

Apache Hive: simplificando solues BigData

Pgina 6 de 21

Figura 1. Fluxo de uma query dentro da arquitetura do Apache Hive.

http://www.devmedia.com.br/articles/viewcomp_forprint.asp?comp=30582

11/08/2014

Apache Hive: simplificando solues BigData

Pgina 7 de 21

Como podemos observar, o Apache Hive possui trs pontos de entrada principais para
executar suas queries. Iniciando pelo Thrift Server, tambm conhecido por Hive
Server, esse componente disponibiliza pontos de conexo, com tecnologias como
ODBC e JDBC, para possibilitar que aplicaes clientes possam se conectar a instncia
do Hive. O segundo componente, denominado Command Line Interface, o que nos
permite executar as nossas consultas atravs da linha de comando.
Por ltimo, o mdulo de entrada que fornece acesso ao Apache Hive via browser, cujo
nome em nosso diagrama Web Interface, uma interface web que nos disponibiliza
um console para administrar as configuraes do Hive, bem como fazer consultas nos
dados armazenados.
Sendo esses trs componentes nossas portas de entrada, uma vez que um comando
chega ao Hive, ele enviado ao componente Driver, denotado em azul na figura, que
ser responsvel por fazer a transformao da query em tarefas que o Hadoop possa
entender.
Primeiramente, com base nos arquivos de metadados, que possuem informaes
como o nome das tabelas, campos e outros, o Hive executa a anlise e traduo da
HiveQL enviada, verificando erros de sintaxe e validando se todos os elementos so
vlidos. Quando esse processo termina, feito, logo em seguida, a compilao das
tarefas de Map/Reduce equivalentes HiveQL enviada, ou seja, feita a traduo
desses comandos.
Por fim, com as tarefas traduzidas, o Driver se comunica com o Hadoop e faz a
execuo desses comandos, obtendo por final o resultado da HiveQL.
Esse fluxo de execuo, juntamente com uma explicao dos principais comandos da
HiveQL, sero praticados no nosso exemplo, que construiremos nas prximas pginas,
atravs de um cliente Java que utilizar JDBC para se comunicar com o Hive e
manipular os dados l armazenados.

Nota: Tanto o Apache Hive como o Apache Hadoop, que utilizaremos em nosso
exemplo, no possuem compatibilidade com a plataforma Windows. Isto se deve,
principalmente, ao fato de tanto os processos de Map/Reduce como o prprio

http://www.devmedia.com.br/articles/viewcomp_forprint.asp?comp=30582

11/08/2014

Apache Hive: simplificando solues BigData

Pgina 8 de 21

princpio do HDFS se basearem na plataforma UNIX e no terem sido


desenvolvidos para outros ambientes. Devido a isso, todos os comandos e
exemplos demonstrados a seguir foram baseados em um ambiente Linux.

Para iniciarmos nossa aplicao de exemplo, primeiramente teremos que instalar o


Hive Server em nossa mquina. Para tanto, precisamos possuir o Hadoop e uma
verso do JDK instalada em nosso ambiente local.
Comeando pela instalao do Hadoop, para sua utilizao dentro do Apache Hive, no
precisamos fazer muitas configuraes extras, sendo necessrio somente baixar o
arquivo hadoop-2.2.0.tar.gz (veja o endereo na seo Links) e descompactar o
mesmo em algum diretrio local. Uma vez descompactado, importante configurar
nossa varivel de ambiente HADOOP_HOME para apontar para a pasta do Hadoop.
Isto pode ser feito executando o comando: export HADOOP_HOME= <diretrio do
Hadoop>. Terminado esses passos, teremos nosso Hadoop instalado na verso
default, ou seja, na verso de um nico n (local), ideal para realizarmos nosso
primeiro exemplo.
Em relao ao JDK, caso ainda no possua uma verso instalada, preciso instalar a
1.6 em sua mquina. O download da mesma pode ser feito pelo prprio site da Oracle,
onde tambm podem ser encontradas instrues para sua instalao.
Com ambos os pr-requisitos completos, vamos iniciar a instalao do Apache Hive.
Para isso, deve-se realizar o download do arquivo hive-0.12.0.tar.gz pelo site da
Apache (veja o endereo indicado na seo Links) e descompact-lo em um diretrio
local. Isso pode ser feito executando o comando: tar -xzvf hive-0.12.0.tar.gz .
Com o arquivo descompactado, teremos que apontar nossa varivel de ambiente
HIVE_HOME para o diretrio em que o Hive foi instalado. O comando para realizar
essa configurao : export HIVE_HOME=<diretrio em que o Apache Hive foi
descompactado>.

http://www.devmedia.com.br/articles/viewcomp_forprint.asp?comp=30582

11/08/2014

Apache Hive: simplificando solues BigData

Pgina 9 de 21

Assim, com as variveis de ambientes configuradas, precisamos criar e dar as devidas


permisses para as pastas em que o Hive ir armazenar seus dados. Isso feito com
a ajuda do Hadoop e permitir que os diretrios que configuraremos sejam usados
pelo HDFS. Na Listagem 2 demonstramos quais so os comandos para realizar essa
configurao.
Listagem 2. Criao e configurao do permissionamento para as pastas a serem
utilizadas pelo Apache Hive.

#Tenha certeza que o diretrio /user/hive esteja criado


#e as permisses estejam de acordo. #Caso na execuo do comando
#mkdir acontea uma exceo do diretrio j existir
#(em algumas distribuies do Linux a pasta /tmp j existe por default)
#o passo de criao pode ser ignorado, sendo somente necessrio
#executar os comandos de permissionamento.
$HADOOP_HOME/bin/hadoop fs -mkdir

/tmp

$HADOOP_HOME/bin/hadoop fs -mkdir

/user/hive/warehouse

$HADOOP_HOME/bin/hadoop fs -chmod g+w

/tmp

$HADOOP_HOME/bin/hadoop fs -chmod g+w

/user/hive/warehouse

Com essas modificaes feitas, podemos iniciar o Apache Hive. Para garantir que a
instalao ocorreu com sucesso, vamos, em primeiro lugar, acessar o mesmo pela
linha de comando e verificar se o Hive Console est funcionando corretamente e se
nenhum erro de configurao aconteceu. Para acessarmos o Hive console, digite o
seguinte comando no terminal: $HIVE_HOME/bin/hive.
Caso o console seja executado com sucesso, podemos sair do mesmo digitando o
comando quit e iniciar o Hive Server. Para realizar essa inicializao, execute a
seguinte linha no terminal: $HIVE_HOME/bin/hive --service hiveserver. Com nosso
Hive Server no ar, podemos dar incio criao da nossa aplicao Java, que ir se
conectar e manipular os dados dentro do Hive.

Nota: importante observar que as instalaes apresentadas nesse artigo, tanto


do Hive como do Hadoop, so as instalaes default, ou seja, no modo local. Para
realizar as instalaes do Hive e do Hadoop nos modos pseudo-distributed ou

http://www.devmedia.com.br/articles/viewcomp_forprint.asp?comp=30582

11/08/2014

Apache Hive: simplificando solues BigData

Pgina 10 de 21

fully-distributed, ideais para simular e manipular ambientes distribudos,


possvel encontrar as instrues especficas no site oficial da Apache (veja a seo
Links).

Com a instalao do Hive completa, podemos dar incio construo de nossa


aplicao exemplo. O objetivo desse desenvolvimento ser mostrar os principais
aspectos do Hive e as principais sintaxes do HiveQL colocadas em prtica, alm de
demonstrar como manipular essa ferramenta atravs de uma aplicao Java. Ao final,
seremos capazes de executar consultas, inserir dados e manipular informaes dentro
do Apache Hive atravs das tarefas de Map/Reduce do Hadoop.

Para iniciarmos nosso exerccio, podemos criar um projeto simples na IDE de sua
escolha e, uma vez criado, adicionar os JARs hive-jdbc-0.12.0.jar e
hadoop-common-2.2.0.jar no classpath de sua aplicao.
As configuraes dessas bibliotecas tambm podem ser feitas pelo Apache Maven, um
gerenciador de dependncias automtico, atravs da configurao mostrada na
Listagem 3, dentro do arquivo pom.xml.
Listagem 3. Dependncias do Hive e Hadoop.

<dependencies>
<dependency>
<groupId>org.apache.hive</groupId>
<artifactId>hive-jdbc</artifactId>
<version>0.12.0</version>
</dependency>
<dependency>
<groupId>org.apache.hadoop</groupId>
<artifactId>hadoop-common</artifactId>
<version>2.2.0</version>
</dependency>
</dependencies>

http://www.devmedia.com.br/articles/viewcomp_forprint.asp?comp=30582

11/08/2014

Apache Hive: simplificando solues BigData

Pgina 11 de 21

Alm da configurao de nossas dependncias, iremos necessitar, na execuo de


nosso exemplo, de um arquivo para utilizarmos como massa de dados inicial,
armazenando seus dados no HDFS e usando seu contedo para demonstrar algumas
funcionalidades do Apache Hive. Como sugesto, indicamos que seja feito o download
do arquivo ml-1m.zip do site de datasets do movielens (veja a seo Links) e que
seja descompactado o documento ratings.dat.
Esse arquivo possui como contedo um milho de pontuaes atribudas pelos
usurios do site Movielens.com aos mais diversos filmes, sendo a sintaxe de seu texto
a sequncia dos campos id de usurio, id do filme, pontuao e timestamp, separados
pelos caracteres ::.
Uma vez a descompactao esteja concluda, precisamos executar uma substituio
dos divisores :: por :, podendo o mesmo ser feito por qualquer editor de texto que
possua a funcionalidade de search/replace. Realizado essa substituio, nosso arquivo
de entrada para o Hive est pronto e podemos iniciar nosso exemplo em Java.

O primeiro passo para comearmos nosso desenvolvimento dentro do Java ser o de


criar um conector a nosso Hive Server, que inicializamos aps a instalao do Apache
Hive. Para fazer isso, utilizaremos o driver JDBC nativo do Hive que fornece, de forma
transparente, uma conexo ao Hive Server como se esse fosse um banco de dados.
Na Listagem 4 criamos nossa classe HiveConnector, responsvel por fornecer uma
conexo vlida para a execuo de queries.
Listagem 4. Cdigo da classe HiveConnector.

public class HiveConnector {


private static String driverName = "org.apache.hadoop.hive.jdbc.HiveDriver";
private static String defaulURL="jdbc:hive://localhost:10000/default";
public static Connection getHiveConnection(String url) throws SQLException{
try {
Class.forName(driverName);
if(url==null || url.isEmpty()){
url=defaulURL;

http://www.devmedia.com.br/articles/viewcomp_forprint.asp?comp=30582

11/08/2014

Apache Hive: simplificando solues BigData

Pgina 12 de 21

}
} catch (ClassNotFoundException e) {
e.printStackTrace();
}
Connection con = DriverManager.getConnection(url, "", "");
return con;
}
}

A construo dessa classe bem simples e sua implementao se assemelha bastante


implementao de uma conexo com qualquer banco de dados. Definimos duas
variveis indicando nosso driver JDBC e nossa URL de conexo default ao Hive e
utilizamos o DriverManager para estabelecer essa conexo, retornando a mesma e
terminando o mtodo getHiveConnection().

Utilizando nosso conector recm-criado, agora teremos que popular o Hive com um
arquivo de dados iniciais. Esse processo composto pela criao das tabelas dentro
do Apache Hive, metadados que relacionam os arquivos armazenados no Hadoop com
uma organizao semelhante de uma tabela relacional, e a leitura das informaes,
que sero armazenadas dentro dos diretrios do Hive num formato que definiremos
adiante.
A Listagem 5 apresenta a classe HiveCreate, responsvel por criar e armazenar os
dados conforme descrevemos anteriormente e por apresentar algumas variaes das
funcionalidades disponibilizadas pela HiveQL para a criao das tabelas dentro de
nosso Hive.
Listagem 5. Cdigo da classe HiveCreate.

public class HiveCreate {


//Mtodo responsvel por criar a nossa tabela de exemplo,
//denominada ratings, na qual iremos executar nosso primeiro exemplo

http://www.devmedia.com.br/articles/viewcomp_forprint.asp?comp=30582

11/08/2014

Apache Hive: simplificando solues BigData

Pgina 13 de 21

public void createRatingsTable() throws SQLException{


//Utilizamos a classe HiveConnector que criamos anteriormente
//para criar uma conexo
Connection conn = HiveConnector.getHiveConnection(null);
Statement stmt = conn.createStatement();
//Script em HiveQL para criao de nossa tabela ratings
//a partir do arquivo ratings.dat
String query="CREATE TABLE ratings (userid INT, itemid INT,
rating INT, timestamp STRING) ROW FORMAT DELIMITED FIELDS
TERMINATED BY ':' STORED AS TEXTFILE";
stmt.execute(query);
//Insero dos dados a partir de nosso arquivo
query= "LOAD DATA LOCAL INPATH '/home/brunno/ratings.dat'
OVERWRITE INTO TABLE ratings";
System.out.println("Running: " + query);
stmt.execute(query);
}
//Mtodo responsvel por criar a tabela ratings_bucketed,
//que usaremos para demonstrar como criar uma tabela particionada
//e com informaes em clusters
public void createRatingsBucketed() throws SQLException{
Connection conn = HiveConnector.getHiveConnection(null);
Statement stmt = conn.createStatement();
//HiveQL utilizando os conceitos de particionamento e
//clustering para criao da tabela ratings_bucketed
String query="CREATE TABLE ratings_bucketed (userid INT,
itemid INT, rating INT,timestamp STRING)
PARTITIONED BY (ds STRING) CLUSTERED BY
(userid) INTO 5 BUCKETS";
stmt.execute(query);
query= "set hive.enforce.bucketing = true";
System.out.println("Running: " + query);
stmt.execute(query);
//Insero dos dados a partir da nossa tabela ratings na
//partio 1 de nossa tabela ratings_bucketed
query= "FROM ratings INSERT OVERWRITE TABLE ratings_bucketed
PARTITION (ds = '1') SELECT userid, itemid, rating,
Timestamp WHERE rating >4";
stmt.execute(query);

http://www.devmedia.com.br/articles/viewcomp_forprint.asp?comp=30582

11/08/2014

Apache Hive: simplificando solues BigData

Pgina 14 de 21

}
//Mtodo main() para criar ambas as tabelas
public static void main(String[] args) throws Exception{
HiveCreate hiveCreate = new HiveCreate();
hiveCreate.createRatingsTable();
hiveCreate.createRatingsBucketed();
}
}

Vamos agora entender os mtodos descritos na classe HiveCreate. O primeiro deles,


denominado createRatingsTable(), ser responsvel por, a partir de nosso arquivo
ratings.dat que baixamos anteriormente, criar a tabela ratings, com os campos
userid, itemid, rating e timestamp.
A sintaxe de criao dessa tabela bastante similar sintaxe de criao de uma
tabela relacional utilizando a linguagem SQL tradicional, com a diferena que, em
nossa tabela do Hive, definimos que nosso delimitador de campos o smbolo : e,
tambm, especificamos o modo que os dados de nossas tabelas sero armazenados
no HDFS.
No nosso caso, definimos o armazenamento em formato de TEXTFILE, ou seja, um
arquivo texto padro.
O Apache Hive tambm disponibiliza, para o armazenamento de suas informaes,
outros formatos, como o SEQUENCEFILE, arquivo especfico do Hadoop em forma de
chaves e valores, o RCFILE, formato de arquivo que define tabelas relacionais dentro
de clusters computacionais, e ORC, tipo de arquivo otimizado para armazenamento de
dados dentro do Hive. Cada um desses tipos apresenta vantagens e desvantagens na
sua utilizao, sendo cada um mais adequado para situaes especficas.
Fica a critrio do leitor experimentar esses diferentes tipos de armazenamento de
dados na tabela, sendo somente necessrio modificar o trecho STORED AS TEXTFILE
para o tipo de dados que deseja utilizar.

http://www.devmedia.com.br/articles/viewcomp_forprint.asp?comp=30582

11/08/2014

Apache Hive: simplificando solues BigData

Pgina 15 de 21

Uma vez criada nossa tabela ratings, temos que carregar os dados do arquivo
ratings.dat para o Hive. Isto feito no segundo comando executado, LOAD DATA
LOCAL INPATH, onde passamos o caminho local de nosso arquivo para que ele seja
carregado e escrito, ou sobrescrito, caso j existam dados, em nossa tabela.
necessrio, antes da execuo do mtodo, que esse local de armazenamento do
arquivo seja alterado de acordo com o caminho em que o arquivo ratings.dat foi
descompactado em sua mquina.
Nosso segundo mtodo, createRatingsBucketed(), ter a funo de criar uma
segunda tabela, denominada ratings_bucketed. A definio de seus campos
bastante semelhante da tabela ratings, porm utilizamos duas novas
funcionalidades do Hive em sua criao: PARTITION e BUCKETING.
O comando PARTITIONED BY (ds STRING), utilizado em nossa HiveQL, tem a
funo de criar um campo String que servir para indicar os nomes (ou valores) das
parties de nossa tabela e, consequentemente, dividir os dados inseridos nessas
parties. Para contextualizar um pouco mais esse conceito, podemos dar um exemplo
de uma tabela particionada em dois, uma partio com o campo ds = 1 e outra com o
campo ds = 2.
Ao definirmos uma partio, qualquer consulta subsequente na tabela ser
direcionada para a partio correta e, consequentemente, a quantidade de dados e o
tempo de busca sero bastante menores, aumentando assim a performance no geral.
Continuando o desenvolvimento de nosso mtodo, no comando de construo de
nossa segunda tabela, implementamos o conceito de BUCKETING, talvez um dos
mais importantes dentro do Hive. Ao definirmos em nossa tabela o comando
CLUSTERED BY (userid) INTO 5 BUCKETS, estamos dizendo ao Apache Hive para,
a partir de todos os dados de entrada, agrupar as entradas com o campo userid
semelhantes e armazenar esses agrupamentos em cinco clusters (buckets) diferentes
em seu HDFS.
Portanto, podemos imaginar que, se nosso userid variar de 1 a 5, teremos todos os
dados com userid=1 no cluster 1, todos com o userid=2 no cluster 2 e assim por
diante. Entenderemos mais tarde, quando criarmos nossas consultas dentro do Hive,

http://www.devmedia.com.br/articles/viewcomp_forprint.asp?comp=30582

11/08/2014

Apache Hive: simplificando solues BigData

Pgina 16 de 21

como a criao de buckets pode auxiliar na distribuio das tarefas de Map/Reduce


dentro do Hadoop.
Terminamos nosso mtodo populando nossa tabela ratings_bucketed a partir de
uma consulta na tabela ratings que criamos anteriormente. Nesse passo de popular a
tabela, podemos observar dois comandos importantes. O primeiro o set
hive.enforce.bucketing = true, que faz com que o Hive faa o agrupamento dos
dados que iremos inserir. O segundo onde definimos o nome de nossa partio de
insero para 1, fazendo com que o Hive crie essa partio caso ela no exista, no
comando PARTITION (ds = '1').
Com a construo dos mtodos createRatingsTable() e createRatingsBucketed()
finalizada, podemos rodar nosso mtodo main(), que ir criar e popular nossas
tabelas ratings e ratings_bucketed atravs dos mtodos desenvolvidos
anteriormente.

Com nossa base de dados j alimentada aps a execuo do mtodo main(),


podemos iniciar a construo de queries para manipular essas informaes. A consulta
no Hive, assim como a criao das tabelas, realizada atravs da linguagem HiveQL
utilizando instrues bastante similares a um SQL tradicional. Uma vez que esses
comandos esto prontos para serem processados em nosso Hive Server, eles so
traduzidos pelo Hive, com base nos metadados construdos na definio das tabelas.
Na Listagem 6 exposto o cdigo da classe HiveSelect, na qual criamos quatro
consultas com o objetivo de filtrar nosso contedo armazenado no HDFS e
administrado pelo Hive, mostrando algumas funcionalidades teis que o Hive nos
proporciona e apresentando a sintaxe necessria para poder filtrar e visualizar as
informaes do HDFS.
Listagem 6. Cdigo da classe HiveSelect.

public class HiveSelect {


//Query simples em nossa tabela ratings que traz a contagem
//de informao (linhas) armazenada no HDFS.

http://www.devmedia.com.br/articles/viewcomp_forprint.asp?comp=30582

11/08/2014

Apache Hive: simplificando solues BigData

Pgina 17 de 21

public void simpleSelect() throws SQLException{


Connection conn= HiveConnector.getHiveConnection(null);
Statement statement = conn.createStatement();
String query = "select count(1) from ratings";
ResultSet executeQuery = statement.executeQuery(query);
while(executeQuery.next()){
System.out.println("O Hive tem

"+executeQuery.getInt(1

" registros!");
}
}
//Mtodo responsvel por demonstrar a funcionalidade explain do Hive
public void simpleExplainSelect() throws SQLException{
Connection conn= HiveConnector.getHiveConnection(null);
Statement statement = conn.createStatement();
String query = "explain select count(1) from ratings";
ResultSet executeQuery = statement.executeQuery(query);
System.out.println("Explicando a query!");
while(executeQuery.next()){

System.out.println(executeQuery.getObject(1).toString()
}
}
//Query em nossa tabela particionada e clusterizada
public void selectWithBucketedTable() throws SQLException{
Connection conn= HiveConnector.getHiveConnection(null);
Statement statement = conn.createStatement();
String query = "select * from

ratings_bucketed

where ds = \"1\"

and userid=2";
ResultSet executeQuery = statement.executeQuery(query);
System.out.println("Query Bucketed!");
while(executeQuery.next()){

System.out.println("###############Registro############
for(int i = 1; i<5; i++){

System.out.println(executeQuery.getObject(i
}
}
}
//Demonstrao de um select com join
public void selectWithJoin() throws SQLException{
Connection conn= HiveConnector.getHiveConnection(null);

http://www.devmedia.com.br/articles/viewcomp_forprint.asp?comp=30582

11/08/2014

Apache Hive: simplificando solues BigData

Pgina 18 de 21

Statement statement = conn.createStatement();


String query = "SELECT r.* FROM ratings r JOIN ratings_bucketed b
(r.userid = b.userid)";
ResultSet executeQuery = statement.executeQuery(query);
System.out.println("Join query!");
while(executeQuery.next()){

System.out.println("###############Registro############
for(int i = 1; i<5; i++){

System.out.println(executeQuery.getObject(i
}
}
}
public static void main(String[] args) throws Exception(){
HiveSelect hiveSelect = new HiveSelect();
hiveSelect.simpleSelect();
hiveSelect.simpleExplainSelect();
hiveSelect.selectWithBucketedTable();
hiveSelect.selectWithJoin();
}
}

Iniciamos nossa classe HiveSelect declarando um mtodo simples, que ir criar uma
consulta para verificar a quantidade de dados dentro de nossa tabela ratings. A
sintaxe nessa primeira query idntica de um SQL tradicional utilizado em bancos
de dados relacionais, fazendo um SELECT com a contagem de dados de retorno.
Como resultado de nossa consulta, o mtodo retorna um ResultSet igual ao
retornado por qualquer consulta JDBC, podendo esse ser manipulado da mesma
maneira que um ResultSet de um banco de dados tradicional.
O nosso segundo mtodo, simpleExplainSelect(), j utiliza a funcionalidade do Hive
denominada explain. Sua funo de, a partir de uma query em HiveQL, mostrar
quais as aes que o Hive executou dentro do Hadoop para fazer a consulta,
retornando em seu ResultSet uma explicao de todas as tarefas de Map/Reduce
executadas sobre nossos arquivos. Em nosso exemplo, usamos a query do primeiro

http://www.devmedia.com.br/articles/viewcomp_forprint.asp?comp=30582

11/08/2014

Apache Hive: simplificando solues BigData

Pgina 19 de 21

mtodo, simpleSelect(), e colocamos o comando explain no incio da mesma,


indicando que esperamos a explicao dos comandos executados.
No prximo mtodo, selectWithBucketedTable(), criamos um select na tabela
particionada e clusterizada ratings_bucketed. Iniciamos esse select definindo que
nossa partio ter o valor do campo ds = 1, ou seja, a partio que especificamos
na criao da tabela, e continuamos com a consulta normalmente.
Uma consulta em uma tabela clusterizada apresenta vrias vantagens em relao a
uma tabela normal, principalmente quando partimos de uma configurao do Hive de
forma distribuda. Isto se deve porque, em um ambiente distribudo, o Apache Hive
distribui suas tarefas de Map/Reduce pelos buckets configurados, ficando mais
eficiente a consulta paralelizada. Outro ponto que tambm vale destacar que, em
consultas onde o campo de filtro o mesmo da clusterizao da tabela, no nosso caso
o campo userid, o tempo de processamento bem menor, uma vez que o Hive j
sabe em qual cluster deve procurar.
Por ltimo, utilizamos o mtodo selectWithJoin() para demonstrar como aplicar uma
operao de join em duas tabelas do Hive. Neste caso, utilizamos a tabela ratings e
ratings_bucketed, finalizando assim a nossa aplicao de exemplo.
Para executarmos as consultas criadas na classe HiveSelect podemos rodar o mtodo
main() implementado no final da Listagem 6.

Uma vez apresentadas as principais funcionalidades do Apache Hive e seu


funcionamento em geral, precisamos ressaltar alguns pontos para que os
desenvolvedores e leitores possam melhor escolher se a implementao do Apache
Hive realmente a opo adequada para seus projetos.
O primeiro ponto que o Apache Hive, apesar de utilizar uma linguagem muito
semelhante ao SQL, no um banco de dados. natural o leitor pensar que est
manipulando tabelas relacionais pela familiaridade que o JDBC traz em sua API, mas
na realidade o Hive est executando tarefas de Map/Reduce em arquivos fsicos no

http://www.devmedia.com.br/articles/viewcomp_forprint.asp?comp=30582

11/08/2014

Apache Hive: simplificando solues BigData

Pgina 20 de 21

HDFS do Hadoop por trs de cada comando executado. Vale lembrar que a estrutura
de tabelas no existe fisicamente e, sim, somente nos arquivos de metadados.
Outro ponto no qual o Hive se diferencia de um banco de dados est no fato dele no
suportar nativamente operaes de update e delete, funcionando somente em
processos batch, da mesma forma que o Hadoop. Para realizar tais operaes,
existem ferramentas e outras solues complementares que, juntamente com o Hive,
possibilitam uma alterao dos dados em tempo real no HDFS.
Por fim, talvez a considerao mais importante, que o principal benefcio do Apache
Hive sua alta potencialidade de escalabilidade, trazida atravs do Hadoop, e a
facilidade de implementao em ambientes distribudos, sendo extremamente eficaz
no tratamento de informaes em grandes clusters.
Em contrapartida, em ambientes com poucas ou apenas uma mquina, os processos
de Map/Reduce no so nada eficazes e acabam por deixar a desejar no quesito de
performance.
Com base no contedo terico e prtico apresentado, fcil observar a familiaridade
que o Apache Hive trouxe em seus comandos, simplificando a manipulao das
funcionalidades do Hadoop. Atravs de sua sintaxe semelhante ao SQL, podemos
fazer consultas em nossos dados distribudos em diversos ambientes, deixando a
cargo do Hive e do Hadoop a distribuio e construo das tarefas necessrias para a
execuo.
Essa facilidade, por sua vez, fez com que o Apache Hive fosse escolhido e utilizado por
diversas empresas de tecnologia, como o Facebook, Grooveshark e Netflix, que viram
nessa ferramenta uma possibilidade de trazer a familiaridade do SQL ao mundo do Big
Data.
O Apache Hive , portanto, a escolha certa em projetos nos quais a necessidade do
processamento de grandes quantidades de informao seja crucial, atravs de um
ambiente clusterizado, e onde no queremos perder a familiaridade de uma linguagem
j conhecida pelos profissionais do mercado.
Por esses e outros motivos, o Hive se mostra uma ferramenta open source de alto
potencial nos prximos anos e de importncia fundamental no campo de Big Data,

http://www.devmedia.com.br/articles/viewcomp_forprint.asp?comp=30582

11/08/2014

Apache Hive: simplificando solues BigData

Pgina 21 de 21

sendo um dos nomes mais comentados entre as aplicaes modernas, tanto em


ambientes corporativos como dentro das grandes universidades.

Links
Link contendo as distribuies para download do Apache Hive.
http://www.apache.org/dyn/closer.cgi/hive/
Link contendo as distribuies para download do Apache Hadoop.
http://www.apache.org/dyn/closer.cgi/hadoop/common/
Apache Hive Installation Guide.
http://hive.apache.org/#Getting+Started
Apache Hadoop Installation Guide (Cluster).
http://hadoop.apache.org/docs/r1.2.1/cluster_setup.html
Dataset de dados do site grouplens, utilizado como base de dados inicial.
http://grouplens.org/datasets/movielens/

Brunno Fidel Maciel Attorre


trabalha com Java h trs anos. Apaixonado por temas como Inteligncia Artificial, ferramentas open source,
BI, Data Analysis e Big Data, est sempre procura de novidades tecnolgicas na rea. Possui as
certificaes OCJP, OCWCD [...]

http://www.devmedia.com.br/articles/viewcomp_forprint.asp?comp=30582

11/08/2014

Você também pode gostar