Apache Hive Simpl I Fica Big Data
Apache Hive Simpl I Fica Big Data
Apache Hive Simpl I Fica Big Data
Pgina 1 de 21
www.devmedia.com.br
[verso para impresso]
Link original: http://www.devmedia.com.br/articles/viewcomp.asp?comp=30582
http://www.devmedia.com.br/articles/viewcomp_forprint.asp?comp=30582
11/08/2014
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
Pgina 3 de 21
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
Pgina 4 de 21
#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
Pgina 5 de 21
http://www.devmedia.com.br/articles/viewcomp_forprint.asp?comp=30582
11/08/2014
Pgina 6 de 21
http://www.devmedia.com.br/articles/viewcomp_forprint.asp?comp=30582
11/08/2014
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
Pgina 8 de 21
http://www.devmedia.com.br/articles/viewcomp_forprint.asp?comp=30582
11/08/2014
Pgina 9 de 21
/tmp
$HADOOP_HOME/bin/hadoop fs -mkdir
/user/hive/warehouse
/tmp
/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.
http://www.devmedia.com.br/articles/viewcomp_forprint.asp?comp=30582
11/08/2014
Pgina 10 de 21
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
Pgina 11 de 21
http://www.devmedia.com.br/articles/viewcomp_forprint.asp?comp=30582
11/08/2014
Pgina 12 de 21
}
} catch (ClassNotFoundException e) {
e.printStackTrace();
}
Connection con = DriverManager.getConnection(url, "", "");
return con;
}
}
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.
http://www.devmedia.com.br/articles/viewcomp_forprint.asp?comp=30582
11/08/2014
Pgina 13 de 21
http://www.devmedia.com.br/articles/viewcomp_forprint.asp?comp=30582
11/08/2014
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();
}
}
http://www.devmedia.com.br/articles/viewcomp_forprint.asp?comp=30582
11/08/2014
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
Pgina 16 de 21
http://www.devmedia.com.br/articles/viewcomp_forprint.asp?comp=30582
11/08/2014
Pgina 17 de 21
"+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
Pgina 18 de 21
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
Pgina 19 de 21
http://www.devmedia.com.br/articles/viewcomp_forprint.asp?comp=30582
11/08/2014
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
Pgina 21 de 21
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/
http://www.devmedia.com.br/articles/viewcomp_forprint.asp?comp=30582
11/08/2014