hadoop - univale.com.br · 39 \ a popularização do uso de serviços de internet ocorrida ao longo...

10
/ 38 hadoop_ Hadoop é um sistema de persistência e proces- samento distribuído, escrito em Java e desenvol- É, portanto, um projeto de código aberto e de livre distribuição. Seu desenvolvimento foi idealizado e liderado por Doug Cutting, inspirado em um modelo - em uma abordagem de processamento distribuído - genheiros do Google e publicado em um paper de - Twitter, que têm o Hadoop como peça crítica de sua - mais algumas ferramentas adicionais que facilitam - - ção de clusters a componentes para integração com NoSQL sobre o Hadoop e até mesmo ferramentas de - Linux funcione com a sua plataforma de computação em Projetado para ser instalado em servidores cor- HDFS e o Ma- pReduce de arquivos similar ao de um sistema operacional - tail, cat, rm, grep), onde os dados são armazenados - ção entre eles. Detalhes relacionados ao gerencia- mento de replicação de arquivos, divisão em blocos, Processando dados com

Upload: ngodat

Post on 27-Apr-2018

214 views

Category:

Documents


1 download

TRANSCRIPT

/ 38

hadoop_

!Hadoop é um sistema de persistência e proces-samento distribuído, escrito em Java e desenvol-

!"#$%#&$#$%'(#)*+$",$-(,./+$0#1*2,)+$3#'4",*!#45$É, portanto, um projeto de código aberto e de livre distribuição. Seu desenvolvimento foi idealizado e liderado por Doug Cutting, inspirado em um modelo "+$ (+)%!%*64.!,$ !7(8,4*,"#$ 4#$ 9##:8+;$ #$ 930$ <"+-7#4%*),"#$('&8!.,7+4*+$+7$'7$,)*!:#$"+$=>>?@;$+$em uma abordagem de processamento distribuído !4*!*'8,",$ A,(B+"'.+$ <*,7&C7$ "+D4!"#$ (#)$ +4-genheiros do Google e publicado em um paper de =>>E@5$F#:#$#$()#G+*#$)+.+&+'$,(#!#$"+$"! +)%,%$+7-()+%,%$2+&$"#$(#)*+$",$H,/##;$3,.+&##I;$F!4I+"!4$+$Twitter, que têm o Hadoop como peça crítica de sua !41),+%*)'*'),$.#7('*,.!#4,85$-*',87+4*+$#$J,"##($GK$ +7$%+4"#$,7(8,7+4*+$'*!8!L,"#$(#)$+7()+%,%$"+$%+*#)+%$7,!%$*),"!.!#4,!%;$.#7#$#$M+2$H#)I$N!7+%;$OP$A#):,4$+$QRA5$-$ +)%S#$+%*K +8$7,!%$4# ,$4#$7#-7+4*#$",$+%.)!*,$"+%*+$*+T*#$C$,$>5=>5=>?5U5$-8:'4%$1,&)!.,4*+%$ "!%(#4!&!8!L,7$ "!%*)!&'!VW+%$ ()X()!,%$"#$J,"##(;$.#4*+4"#$#$()X()!#$J,"##($",$-(,./+;$mais algumas ferramentas adicionais que facilitam ,$'*!8!L,VS#$+$ !4*+),VS#$.#7$#$7+%7#$<4,$ +)","+;$

+T!%*+$*#"#$'7$+.#%%!%*+7,$"+$1+)),7+4*,%$+$,(8!.,-VW+%$(,),$#$J,"##(;$"+%"+$%!%*+7,%$"+$,"7!4!%*),-ção de clusters a componentes para integração com BYRA0;$.#4 +)%#)+%$"+$Z'+)!+%$0[F;$&,4.#$"+$","#%$NoSQL sobre o Hadoop e até mesmo ferramentas de RQ@5$-*C$#$7#7+4*#;$#$J,"##($%X$(#"+$%+)$ !4%*,8,-"#$+7$7KZ'!4,%$+T+.'*,4"#$#$%!%*+7,$#(+),.!#4,8$Linux;$7,%$GK$/K$'7$,4\4.!#$",$A!.)#%#1*$"+$Z'+$,$7+%7,$ !)K$ !4 +%*!)$ +7$'7,$ +)%S#$"#$J,"##($Z'+$funcione com a sua plataforma de computação em 4' +7$-L')+5$

Projetado para ser instalado em servidores cor-(#),*! #%$"+$)+8,*! #$&,!T#$.'%*#;$#$J,"##($%+$"! !"+$+7$"#!%$.#7(#4+4*+%$()!4.!(,!%]$^$HDFS e o Ma-pReduce5$^$()!7+!)#$4,",$7,!%$C$"#$Z'+$'7$%!%*+7,$de arquivos similar ao de um sistema operacional .#7'7$<(),*!.,7+4*+$*#"#%$#%$.#7,4"#%$"+$7,4!-('8,VS#$"#$JY30$%S#$#%$7+%7#%$"#$8!4'T;$.#7#]$8%;$tail, cat, rm, grep), onde os dados são armazenados +7$,)Z'! #%$%+7$4+4/'7,$!4"+T,VS#$#'$+%*)'*'),-ção entre eles. Detalhes relacionados ao gerencia-mento de replicação de arquivos, divisão em blocos, !4*+:)!","+$"#%$&8#.#%$+$)+.'(+),VS#$"#$,)Z'! #;$D.,$

Processando dados com

"#$ %"#$ %

39 \

A popularização do uso de serviços de internet ocorrida ao longo da última década, alinhada com a evolução da capacidade de arma-zenamento de dados no mundo corporativo, propiciou a ascensão de empresas que enfatizaram a importância da análise de dados !"#$%&$'()%!*($" !"+!,+",+,-'.$+"#$%$"&$*($"#'/(.#$" !"+!,+"*!-01#.$+2"3++)"!+(')(40.)"5$."(6$"7!%8+,#! . )"9,!"#$'&$'):;!+"#$%$"<$$0=!>"?)@$$>"A)#!7$$B"!"C%)D$*"=$0$"+!"E.')%" .)*(!" !",%" !-+)F$")(4"!*(6$"*6$"!*5'!*() $"&$'"*!*@,%)".* G+('.)H"#$%$"%)*-ter a qualidade da análise dos dados de uma carga crescente de ,+,-'.$+"I)(4"%!+%$"#!*(!*)+" !"%.=@;!+" !"&!++$)+",(.=.D)* $"!+-+!+"+!'E.:$+J".*(!')0.* $"!"0!')* $"#$*(!G $"#$*(.*,)%!*(!KL%)" )+"&'.*#.&).+"+$=,:;!+"&)')"!+(!"&'$7=!%)"5$.")".%&=!%!*()-:6$" !"(4#*.#)+"!"5!'')%!*()+" !"&'$#!++)%!*($" .+('.7,/ $"!>"#$%$"#$%&$*!*(!"#'/(.#$"*!++!+"+.+(!%)+>"+,'0!"$"M) $$&>"+$7'!"$"9,)="apresentaremos neste artigo os conceitos básicos por trás de sua )'9,.(!(,')>"!" ()%74%" .*5$'%):;!+"*!#!++-'.)+"&)')" .*+()=):6$"!"simulação de um cluster Hadoop em um ambiente de desenvolvi-%!*($>"7!%"#$%$",%"&'$0')%)"@!==$"N$'= "&)')"+!'"!O!#,() $"*$"Hadoop.

&'()*!+*,-),.!/-!#01-)/.!2!3.()*.01-)/45.6**78*17(,

C*)=.+()" !"+.+(!%)+"5$'%) $"&!=)"LPCQ>"!+&!#.)=.+()"!%"R!+!*E$=E.%!*($"!%"S$5(N)'!"T.E'!"&!=)"L3C2"Q!+(')* $" $"#,'+$" !"U!#,&!'):6$" )"V*5$'%):6$"&!=)"LACQ2"C(,)=%!*(!>"&!+9,.+) $'" $"V*+(.(,$"W$B.)" !"P!#*$=$0.)"IVW PJ>"(')7)=@)* $"#$%"$"M) $$&"!%"+.+(!%)+" !"'!#$%!* ):6$"!".*(!=.0X*#.)"#$*(!O(,)=2"Y"()%74%") %.*.+(') $'"M) $$&"#!'(.F#) $"&!=)"Z=$, !')2

Wellington Ramos Chevreuil | [email protected]

Engenheiro de Computação, SCJP, SCJD, SCMAD, SCWCD, SCBCD, SCEA. Atualmente utilizando hadoop e mapreduce em projetos !")*-=.+!" !"0')* !"E$=,%!" !" ) $+"!"0!'):6$" !"'!#$%!* ):6$"!" !%).+"#$*(!G $+"!%"+!'E.:$+" !"!*('!(!*.%!*($"E.)"N!72"Y"

()%74%") %.*.+(') $'"M) $$&"#!'(.F#) $"&!=)"Z=$, !')2

André Luiz Forchesatto | [email protected]

3+&!#.)=.+()"!%"Z.X*#.)" )"Z$%&,():6$"&!=)"LASZ>"&'$5!++$'"!"=/ !'" !"['$\!($" $"S.+(!%)")#) X%.#$"!%"])E)" )"L*$!+#>" !+!*-E$=E! $'"])E)" !+ !"^__`"!"0!'!*(!" !"&'$\!($+" )"Z)%(N$"S.+(!%)+2

toda a cargo do Hadoop, aliviando o desenvolvedor "+%%,%$ )+%*)!VW+%5$ OK$ #$ A,(B+"'.+$ )+%(#4"+$ (+8#$processamento distribuído dos algoritmos desenvol-vidos. Para tanto, esses algoritmos devem seguir a abordagem MapReduce apresentada pelo Google, e (,),$Z'+$'7$()#:),7,$(#%%,$%+)$+T+.'*,"#$4#$J,"#-op, o mesmo tem que implementar ou estender algu-7,%$!4*+)1,.+%_.8,%%+%$+%(+.`D.,%$",$-PQ$O, ,$"#$J,-

doop, provendo uma espécie de framework java para "+%+4 #8 !7+4*#$"+$A,(B+"'.+$<4,$ +)","+;$,(+%,)$de ser escrito em Java, o Hadoop também permite Z'+$7,()+"'.+%$+%.)!*#%$+7$(a*/#4$%+G,7$+T+.'*,-dos. Essa alternativa é chamada streamjob).

^$ ()+%+4*+$ ,)*!:#$ !%,$ "+*,8/,)$ ,8:'4%$ .#4.+!-*#%$&K%!.#%$"#$JY30$+$"#$A,(B+"'.+;$.#7#$!4%*,8,)$uma versão do Hadoop em modo pseudodistribuído

/ 40

<%!7'8,$'7$.8'%*+)$+T+.'*,4"#$+7$'7,$\4!.,$7KZ'!-4,@;$+$.#7#$+%.)+ +)$+$+T+.'*,)$'7$/+88#$2#)8"$7,($)+"'.+$'%,4"#$,$-PQ$O, ,$"#$J,"##(5

Conceitos básicos^$J,"##($1'4.!#4,$.#7#$'7$.8'%*+)5$3#!$()#G+-

*,"#$(,),$%+)$!4%*,8,"#$+7$7KZ'!4,%$"+$&,!T,$.#4D,-&!8!","+;$(#)$!%%#$,$)#&'%*+L$+$,8*,$b)+.'(+),&!8!","+c$%S#$)+Z'!%!*#%$7KT!7#%$"#$()#G+*#5$^$%!%*+7,$,*+4"+$essas características através de redundância e otimi-zação do uso de recursos, e o gerenciamento dos di-versos nós do cluster é feito de forma a tornar os mes-mos o menos dependente possível uns dos outros. Em #'*),%$(,8, ),%;$%+$'7$"+*+)7!4,"#$4X$"#$.8'%*+)$D-.,)$!4"!%(#4` +8;$4+4/'7$","#$%+)K$(+)"!"#;$4+4/'7$G#&$1,8/,)K$<7+%7#$,Z'+8+%$Z'+$*! +%%+7$%'&*,)+1,%$rodando no nó falho), e clientes que estejam usan-"#$ #$ .8'%*+)$ 4S#$ %+)S#$ ,1+*,"#%5$ ^'*)#$ (#4*#$ 1#)*+$do Hadoop é a capacidade de redimensionamento do cluster sem necessidade de reinicialização de siste-ma, ou seja, nós podem ser adicionados/removidos do cluster sem nenhuma parada de sistema.

Um cluster Hadoop em funcionamento consiste 4,$ +)","+$"+$,8:'4%$"!1+)+4*+%$ .#7(#4+4*+%;$ +T+-cutando como Daemons, cada qual com uma respon-%,&!8!","+$+%(+.`D.,5$^$J,"##($(#%%'!$"',%$1'4.!#-4,8!","+%$()!4.!(,!%$ <(+)%!%*64.!,$ +$()#.+%%,7+4*#@$+$(,),$.,",$'7,$"+%%,%$"',%$/, +)K$%+7()+$'7$.#7-

(#4+4*+$7+%*)+$<)+%(#4%K +8$(#)$:+)+4.!,)$#$.8'%*+)@$+$ K)!#%$+%.), #%$<Z'+$+1+*! ,7+4*+$)+,8!L,)S#$,%$,*!-vidades).

No caso da persistência, o sistema composto pelo 7+%*)+$ +$ #%$ +%.), #%$ C$ "+4#7!4,"#$JY30$ <J,"##($3!8+$ 0a%*+7@5$ ^$ ",+7#4$7+%*)+$ "#$ /"1%$ C$ "+4#7!-nado namenode, e mantém um registro de onde os arquivos estão armazenados nos nós escravos. Um \4!.#$ ,)Z'! #$ %+7()+$ %+)K$ "! !"!"#$ +7$ &8#.#%$ Z'+$serão replicados nos diferentes nós do cluster. Essa !41#)7,VS#$C$7,4*!",$(+8#$4,7+4#"+5$^%$",+7#4%$escravos do HDFS são chamados de datanode, e sem-()+$%S#$+T+.'*,"#%$+7$'7,$7KZ'!4,$()X()!,$"#$.8'%-*+)$ <4'4.,$/K$7,!%$"+$'7$",*,4#"+$+7$'7$7+%7#$4X$"#$.8'%*+)@5$-$"! !%S#$"#%$,)Z'! #%$+7$&8#.#%$4#$HDFS é estratégica para o processamento paralelo. Logo, para que haja realmente ganho no paralelismo, os arquivos a serem salvos no HDFS devem ser gran-"+%$#$&,%*,4*+$(,),$%+)+7$"! !"!"#%$+7$ K)!#%$"+%%+%$blocos, os quais, então, poderão ser consumidos ao mesmo tempo.

P,),$ #$ ()#.+%%,7+4*#$ <A,(B+"'.+@;$ #$ J,"##($também segue a abordagem de mestre e escravos. No caso do mestre, o daemon é chamado de jobtracker, #$ Z',8$ *+7$ ,$ ,*)!&'!VS#$ "+$ *),*,)$ ,%$ )+Z'!%!VW+%$ "+$processamento, escalonando as tarefas entre os nós +%.), #%;$,8C7$"+$7#4!*#),)$#$()#:)+%%#$",$+T+.'VS#$",%$,*! !","+%5$^%$4X%$+%.), #%$)+.+&+7$#$4#7+$"+$tasktrackers;$+$%S#$+8+%$Z'+$+1+*! ,7+4*+$+T+.'*,7$

Figura 1. Componentes de um Cluster Hadoop.

Cliente

Namemode JobTracker

DataNode

TaskTracker

DataNode

TaskTracker

DataNode

TaskTracker

Cluster Hadoop W1"Q!+('!

W1"3+#')E$ W1"3+#')E$ W1"3+#')E$

41 \

#%$()#:),7,%$7,()+"'.+$%'&7+*!"#%5$-%%!7$.#7#$#%$",*,4#"+%;$#%$*,%I*),.I+)%$+T+.'*,7$+7$%',$()X()!,$7KZ'!4,$ <4'4.,$/K$7,!%$ "+$'7$ *,%I*),.I+)$ +7$'7$mesmo nó do cluster), porém eles rodam em uma 7+%7,$7KZ'!4,$Z'+$'7$",*,4#"+$<%!7;$*,%I*),.I+)$%+7()+$+%*K$ G'4*#$"+$'7$",*,4#"+;$7,%$4'4.,$"#!%$tasktracker estão juntos, nem dois datanodes estão juntos também).

Distribuídos dessa maneira, uma subtarefa de um programa mapreduce processando dados do HDFS %+)K$%+7()+$+T+.'*,",$+7$'7$*,%I*),.I+);$+$#%$%'&--blocos de dados sendo analisados por essa tarefa es-*,)S#$%+7()+$4#$",*,4#"+$8#.,8!L,"#$4,$7+%7,$7K-quina do tasktracker, evitando o consumo de rede. Na D:'),$d$(#"+7#%$ !%',8!L,)$#%$.#7(#4+4*+%$J,"##($e seus relacionamentos.

Hadoop na práticae#41#)7+$ GK$7+4.!#4,"#;$+T!%*+7$ K)!,%$"!%*)!-

&'!VW+%$"!%(#4` +!%$(,),$!4%*,8,VS#5$P,),$+%*+$,)*!:#$!4*)#"'*X)!#;$!)+7#%$1#.,)$4,$"!%*)!&'!VS#$",$-(,./+;$contendo apenas artefatos do próprio Hadoop. No 7#7+4*#$+7$Z'+$+%*+$,)*!:#$C$+%.)!*#;$,%$ +)%W+%$"!%-poníveis para download podem ser encontradas no seguinte link: http://hadoop.apache.org/common/releases.html#Download

Instalação e funcionamentoF+7&),4"#$ Z'+$ #$ J,"##($ ,*',87+4*+$ %X$ +%*K$

"!%(#4` +8$(,),$F!4'T$<4S#$/K$)+%*)!VW+%$)+8,.!#4,",%$f$"!%*)!&'!VW+%$"#$F!4'T@5$^%$8+!*#)+%$Z'+$'*!8!L,)+7$%!%*+7,%$A,.$#'$g!4"#2%$"+ +)S#$()!7+!)#$!4%*,8,)$7KZ'!4,%$ !)*',!%$F!4'T$+7$%+'%$,7&!+4*+%$(,),$Z'+$possam rodar o Hadoop.

h7,$ +L$&,!T,"#$#$(,.#*+$"#$)+(#%!*X)!#$",$-(,-che, descompacte o mesmo para uma pasta qualquer <(#)$ +T+7(8#]$ _'%+)_8#.,8_/,"##(@$ +$ ,8*+)+$ ,$ ,)!K-vel JAVA_HOME$(,),$)+i+*!)$#$.,7!4/#$"#$%+'$OYj;$no arquivo hadoop-env.sh, disponível no diretório conf$",$%',$(,%*,$"+$!4%*,8,VS#$"#$J,"##($<HADO-OP_HOME).

k7$%+:'!",;$(,),$+T+.'*,)$#$J,"##($%!7'8,4"#$'7$ .8'%*+)$ +7$ '7,$ \4!.,$7KZ'!4,$ <7#"#$ (%+'"#-"!%*)!&'`"#@;$C$4+.+%%K)!#$+"!*,)$,8:'7,%$()#()!+",-"+%$&K%!.,%$"+$.#4D:'),VS#5$P)!7+!),7+4*+;$+"!*+$#$,)Z'! #$.#)+l%!*+5T78;$*,7&C7$+7$J-Y^^PmJ^Ak_.#41;$ "+D4!4"#$ ,$ ()#()!+","+$ 1%5"+1,'8*54,7+$ (,),$8#.,8/#%*;$ .#41#)7+$ 7#%*),"#$ 4,$ F!%*,:+7$ d5$ k%%,$()#()!+","+$!4"!.,$Z',8$#$/#%*$",$7KZ'!4,$"#$.8'%*+)$Z'+$)#",)K$.#7#$7,%*+)$"#$JY305

Listagem 1. !"#$%$&' ' (')* &' +,)*"- &' (&.)/

01'$#23-,*%'$4

<property> <name>fs.default.name</name>

<value>hdfs://localhost:9000</value> </property>051'$#23-,*%'$4

-(X%$"+D4!"#$#$7,%*+)$"#$JY30;$C$()+.!%#$.#4D-gurar o nível de replicação dos arquivos para apenas d;$ GK$Z'+$#$.8'%*+)$+7$7#"#$(%+'"#"!%*)!&'`"#$(#%-%'!)K$,(+4,%$d$4X5$Q%%#$C$%+*,"#$4#$,)Z'! #$hdfs-site.xml;$ +7$J-Y^^PmJ^Ak_.#41;$ .#41#)7+$7#%*),"#$4,$F!%*,:+7$=5

Listagem 2. !"#$%$&' ' $6+"-' &" -789%1,) 8-, 1,&,

bloco de arquivo inserido no cluster.

01'$#23-,*%'$4

<property> <name>dfs.replication</name> <value>1</value> </property>051'$#23-,*%'$4

h7,$ +L$ "+D4!",%$ ,%$ .#4D:'),VW+%$ &K%!.,%$ "#$JY30;$C$()+.!%#$!"+4*!D.,)$#$/#%*$"#$7+%*)+$"#$A,(--Reduce, conhecido como JobTracker. Essa proprie-","+$*,7&C7$C$"+D4!",$+7$'7$,)Z'! #$"+$()#()!+-dades, nesse caso, o mapred-site.xml5$-$F!%*,:+7$?$7#%*),$+%%,$.#4D:'),VS#5

Listagem 3. !"#$%$&' ' (')* &' +,)*"- &' :,8;"-duce (JobTracker).

01'$#23-,*%'$4

<property> <name>mapred.job.tracker</name> <value>localhost:9001</value> </property>051'$#23-,*%'$4

P,),$ #$ +T+7(8#$ "+%*+$ ,)*!:#;$ C$ ()+.!%#$ ,!4",$.#4D:'),)$ #$ ,.+%%#$ 00J;$ .,%#$ #$ 7+%7#$ GK$ 4S#$ +%-teja devidamente instalado. É importante ressaltar que o Hadoop não usa SSH para a comunicação in-terna dos seus componentes. !"#$#$%!&'()%#*+!$)(,-.(#$ -(,.-$ #/$&01')(#/$ "!$ %2'/,-.$3#"!!4$ 5$feita via RPC$ <)+7#*+$()#.+"')+$.,88@5$-$ !4%*,8,VS#$"+$ +T+7(8#$ "+%*+$ ,)*!:#$ 4+.+%%!*,$ "#$ SSH apenas 4#.#$#$-6-%'*+!$"!$/%.)4,$"-$)()%)#2)7#*+! padrão <GK$"!%(#4` +8$.#7$,$()X()!,$"!%*)!&'!VS#$",$-(,./+@$do cluster em modo pseudodistribuído, conectando !,$00J$4,$()X()!,$7KZ'!4,$<8#.,8/#%*@$+$+T+.'*,4"#$os respectivos daemons. Como trabalhamos em uma !4%*,8,VS#$ "+$ *+%*+%;$ (#"+l%+$ .#4D:'),)$ #$ 00J$ %+7$(,%%(/),%+$+$(,),$!%*#$&,%*,$+T+.'*,)$#%$.#7,4"#%$",$F!%*,:+7$n5$-$(,)*!)$",$.#4D:'),VS#$"#$00J;$*#"#%$#%$.#7,4"#%$"+ +7$%+)$+T+.'*,"#%$.#7#$)##*5

/ 42

Listagem 4. <'$#23-,$&' ))( )"+ 8,))8(-,)"/

$ sudo su -

# ssh-keygen -t dsa -P ‘’ -f ~/.ssh/id_dsa

# cat ~/.ssh/id_dsa.pub >> ~/.ssh/authorized_keys

!"#$ %&'()*+,-&$ &$ ../$ 0$ 0#1,+$ +&-,'-&$ &$ 10+-minal como root, deve-se formatar o sistema de ar-2*34&#$-&$/,-&&!$5/67.89$:&$-3+01"+3&$-0$3'#1,;,<=&$5/ 6>>?@/>AB8C$',$#*D!,#1,$D3'C$0E3#10$&$*13;31F-rio Hadoop9$B#10$!+&)+,G,$#0+F$*13;3H,-&$!,+,$1&-,#$,#$3'10+,<I0#$%&G$&$/,-&&!$!0;,$;3'J,$-0$%&G,'-&C$3'%;*3'-&$ +02*3#3<I0#$ -0$ 0E0%*<=&$ -0$ A,!K0-*%0#C$&!0+,<I0#$ -0$ ,+2*34&#$ '&$ J-L#C$ 0$ &*1+&#$ %&G,'-&#$administrativos. Um desses comandos é o format do /67.C$3;*#1+,-&$',$M3#1,)0G$NC$&$2*,;$'&#$),+,'10$*G$sistema de arquivos limpo e pronto para usar.

Listagem 5. Formatando HDFS. <value>hdfs://loc-

alhost:9000</value>

# HADOOP_HOME/bin/hadoop namenode -format

O&G$&$#3#10G,$-0$,+2*34&#$!+&'1&C$PF$Q$!&##R40;$3'3%3,+$&$/,-&&!9$O&G&$0#1,G&#$ %&'()*+,'-&$*G,$instalação em modo pseudodistribuído, a inicializa-<=&$-&$G0#G&$Q$G*31&$#3G!;0#C$D,#1,$0E0%*1,+$&$#%+3!1$#1,+1S,;;9#J$-3#!&'R40;$',$!,#1,$/ 6>>?@/>ABTD3'$%&'L&+G0$0E3D3-&$',$M3#1,)0G$U9$B##0$%&G,'-&$PF$3'3-%3,;3H,+F$ ,*1&G,13%,G0'10$ 1&-&#$ &#$ %3'%&$ -,0G&'#$do Hadoop.

Listagem 6. Comando para iniciar o Hadoop.

# HADOOP_HOME/bin/start-all.sh

?,+,$40+3(%,+$#0$1&-&#$&#$!+&%0##&#$L&+,G$3'3%3,-lizados corretamente, pode-se usar o comando jps, 2*0$ ;3#1,$ 1&-&#$ &#$ !+&%0##&#$ #0'-&$ 0E0%*1,-&#$ ',$VWA9$O&G&$ +0#*;1,-&C$ -040G$,!,+0%0+$ &#$daemons namenode, secondarynamenode, datanode, job-tracker, tasktracker.$>$/,-&&!$!+&4X$3'10+L,%0#$Y0D$para monitoramento do cluster, e uma vez inicializa--&C$!&-0S#0$40+3(%,+$&$0#1,-&$-&$G0#G&$!&+$2*,;2*0+$navegador de internet, através das seguintes URLs, ,#$ 2*,3#$ 0E3D0G$ 3'L&+G,<I0#$ -0$ L*'%3&',G0'1&$ -&$JobTracker e do HDFS, respectivamente: http://loca-;J&#1ZN[[\[TP&D1+,%]0+9P#!$ 0$ J11!ZTT;&%,;J&#1ZN[[^[T-L#J0,;1J9P#!9$ #$()*+,#$_$0$\$,!+0#0'1,G$$,#$3'10+-faces web.

Figura 2. Interface Web do NameNode.

Figura 3. !"#$%&'($ )$* +, -,*.%'(/$%0

!"#$%&'"!(!()*#+,#*!(,-,+).!O&G&$PF$-040$0#1,+$043-0'10$!,+,$&$;031&+C$,$!+3'-

cipal atribuição do Hadoop é o processamento de )+,'-0$ 4&;*G0$ -0$ 3'L&+G,<=&$ 5,+2*34&#$ %&'10'-&$a partir de dezenas ou centenas de Gigabyets, Peta-bytes ou mesmo Terabytes de dados) disponível no /67.9$ O&G&$ 0E0G!;&$ '0#10$ ,+13)&C$ 3G!;0G0'1,+0-G&#$*G$A,!K0-*%0$2*0$!+&%0##,+F$-,-&#$-0$*G$#0+-43<&$-0$%0'#&$J3!&1Q13%&C$%&G$3'L&+G,<I0#$-0$!&##R-veis entrevistados em diferentes pesquisas, gerando como resultado a média salarial por região, em cada ,'&$-0$!0#2*3#,9$`&-,$,$3'L&+G,<=&$-0$0'1+,-,$#0+F$0#1+*1*+,-,$%&G&$*G$,+2*34&S10E1&C$%&'10'-&$&$,'&$da suposta entrevista, dados de idade, a residência e #,;F+3&$-&#$0'1+043#1,-&#9$B##0$,+2*34&$#0+F$,$0'1+,--,$-&$A,!K0-*%0C$0$#0*$L&+G,1&$(',;$Q$G&#1+,-&$',$M3#1,)0G$ 9̂$VF$&$,+2*34&$%&'10'-&$&$+0#*;1,-&$-&$!+&-%0##,G0'1&$%&'10+F$,!0',#$&$,'&C$ +0)3=&$0$,$GQ-3,$#,;,+3,;C$0$#0+F$0E3D3-&$,-3,'10C$',$()*+,$N9

43 \

Listagem 7. Formato da base de dados-exemplo, usando # como separador de colunas.

1980#31#Sul#Santa Catarina#Xanxerê#1700.50

1990#33#Sul#Santa Catarina#Xanxerê#2300.00

2000#28#Sul#Santa Catarina#Xanxerê#1900.00

2010#19#Sul#Santa Catarina#Xanxerê#700.50

2010#19#Sul#Santa Catarina#Xanxerê#987.50

2010#19#Sul#Santa Catarina#Xanxerê#1150.

1980#39#Suldeste#São Paulo#Campinas#2700.50

Uma vez que o arquivo de entrada foi criado, o mesmo deve ser enviado para o HDFS. Conforme feito para formatar o HDFS, qualquer interação via conso-;0$-040$#0+$L031,$,1+,4Q#$-&$*13;31F+3&$Hadoop9$>$L&+-mato do comando sempre segue o seguinte padrão: Hadoop [tipo do comando] [comando] [possíveis parâmetros]. Para prepararmos a entrada dos dados -&$'&##&$0E0G!;&C$!+0%3#,+0G&#$G,'3!*;,+$&$/67.C$%+3,'-&$ &#$ -3+01"+3&#$ &'-0$ 0#1,+F$ &$ ,+2*34&$ %&G$&#$dados do censo, bem como enviar o arquivo para o HDFS. Primeiramente, criaremos a estrutura de dire-1"+3&#$-&$0E0G!;&C$!,##,'-&$%&G&$13!&$-0$%&G,'-&$dfs, que indica que iremos interagir com o HDFS, o %&G,'-&$amkdir$ 5%+3,+$ -3+01"+3&8C$ 0$ &$ !,+bG01+&$ /mundoj/censo, para criarmos essa estrutura de pas-1,#9$>$%&G,'-&$%&G!;01&$Q$G&#1+,-&$',$M3#1,)0G$c9

Listagem 8. Comando de criação de diretórios no HDFS.

#HADOOP_HOME/bin/./hadoop dfs –mkdir /mundoj/censo

?,+,$ 40+3(%,+$ &$ +0#*;1,-&C$ !&-0S#0$ ,%0##,+$ ,$&!<=&$de+&f#0$ 1J0$(;0#g#10Gh$',$ 3'10+L,%0$Y0D$-&$HDFS mostrada anteriormente, ou diretamente pela linha de comando usando o comando –ls, conforme ,$M3#1,)0G$i9

Listagem 9. Comando de listagem de arquivos e diretórios no HDFS.

#HADOOP_HOME/bin/./hadoop dfs –ls /

Com a estrutura de diretórios criada, agora bas-ta enviar o arquivo com os dados do censo, conforme 0E3D3-&$',$M3#1,)0G$ 9̂$?,+,$ 3##&C$*#,S#0$&$%&G,'-&$–putC$%&'L&+G0$M3#1,)0G$j[9

Listagem 10. Comando para envio de arquivos ao HDFS.

#HADOOP_HOME/bin/./hadoop dfs –put /home/user/Documents/censo.data /mundoj/censo

Para visualizar o conteúdo do arquivo direto no /67.C$!&-0S#0$*#,+$&#$;3']#$',$0#1+*1*+,$-0$!F)3',#$-,$3'10+L,%0$Y0D$-&$/67.C$&*$-3+01,G0'10$!0;,$;3'J,$de comando usando o comando –cat, conforme Lis-1,)0G$jj9

Listagem 11. Comando de visualização de arquivo no HDFS.

#HADOOP_HOME/bin/./hadoop dfs –cat /mundoj/censo/censo.data

Figura 4. Terminal bash com exemplo de comando do Hadoop.

Implementando um MapReduce/,-&&!$ L&+'0%0$ *G,$ ?k$ %&G$ *G$ %&'P*'1&$ -0$

classes que facilitam a implementação de processos A,!K0-*%0#$ ,$ #0+0G$ 0E0%*1,-&#$ !0;&$ V&D1+,%]0+C$ 0$que consumam dados do HDFS. Para a implementa-<=&$-,$01,!,$A,!$-&$!+&%0##&C$,$ ?k$-&$/,-&&!$-3#-ponibiliza a classe Mapper9$B#1,$%;,##0$Q$+0#!&'#F40;$!&+$G,!0,+$&#$-,-&#$-&#$,+2*34&#$-0$0'1+,-,$5-3#!&-níveis no HDFS) em linhas no formato de chave/va-lor. Cada linha de um arquivo de entrada representa um registro para o Map. Na versão atual, chaves são geradas automaticamente pelo hadoop como objetos -&$13!&$M&')Y+31,D;0C$+0!+0#0'1,'-&$&$&LL#01$-&$,+-quivo. É possível mudar esse formato usando a classe l0gW,;*0`0E1k'!*17&+G,1$ !,+,$ 2*0$ ,$ %J,40$ -&$ +0-gistro seja formada por elementos da própria linha do arquivo, onde todos os caracteres que estiverem m$ 0#2*0+-,$-&$ %,+,%10+$ -0$ #0!,+,<=&$ 5!&+$!,-+=&C$ &$1,D$5n188C$0$&#$%,+,%10+0#$+0#1,'10#$',$;3'J,$L&+G0G$&$4,;&+$-&$+0)3#1+&9$ $%J,40$0$&$4,;&+$#=&$!,##,-&#$%&G&$parâmetros do método map da classe Mapper, onde deve ser implementada a lógica de processamento -&#$-,-&#9$73',;3H,-,$,$0E0%*<=&$-0$A,!C$Q$3'3%3,-,$,$01,!,$K0-*%0$5',$40+-,-0$&$A,!$'=&$!+0%3#,$10+$#3-&$%&G!;01,G0'10$(',;3H,-&$!,+,$&$K0-*%0$%&G0<,+C$&$Hadoop permite que esse comportamento seja con-()*+F40;89$?,+,$&$-0#0'4&;43G0'1&$-&$+0-*%0C$,$ ?k$provê a classe Reducer, cujo método reduce deve ser usado para se implementar a lógica de combinar os resultados dos processamentos gerados pelos dife-+0'10#$A,!!0+#9$>$+0#*;1,-&$(',;$-&$K0-*%0$Q$&$+0-sultado do processo em si, e é gerado um arquivo de saída no HDFS contendo esses dados processados.

$ M3#1,)0G$ j_$ G&#1+,$ ,$ %;,##0$ CensoMapper &'-0$#0+F$ 3G!;0G0'1,-&$&$!+&%0##,G0'1&$-,$01,!,$

/ 44

-0$A,!$-&$A,!K0-*%0$-&$0E0G!;&$-0$%0'#&9$B#1,$0#-10'-0$,$%;,##0$A,!!0+o`0E1C$`0E1C$`0E1C$6&*D;0Y+3-1,D;0pC$ &'-0$ &#$ !+3G03+&#$ -&3#$ 13!&#$ -0$ !,+bG01+&#$representam os tipos dos dados de entrada e os dois q;13G&#C$&#$-0$#,R-,9$:0#1,$%;,##0$0#1F$#&D+0#%+31&$&$método map(Text key, Text value, Context con-text)C$%&'10'-&$,$;")3%,$-0$!+&%0##,G0'1&$-&$0E0G-!;&9$>$GQ1&-&$map possui três parâmetros: key, va-;*0$0$%&'10E19$>$!,+bG01+&$d]0gh$Q$,$%J,40$-,$;3'J,$,$#0+$!+&%0##,-,C$0$d4,;*0hC$&$4,;&+9$ GD&#$PF$L&+,G$0E!;3%,-&#$,'10+3&+G0'109$VF$&$%&'10E1$+0!+0#0'1,$&$resultado do processamento de cada linha.

$ >$GQ1&-&$G,!$ Q$ 3'4&%,-&$ !0;&$ V&D`+,%]0+$como uma interação de um loop de leitura dos arqui-vos de entrada. Dessa forma, cada linha lida de arqui-vo de entrada é processada em uma chamada do map.

$ :&$0E0G!;&$O0'#&A,!!0+C$0G$%,-,$%J,G,-da do método map o algoritmo interpreta uma linha -&$ ,+2*34&$ -0$ 0'1+,-,9$ $ %J,40$ +0!+0#0'1,-,$ !0;&$!,+bG01+&$]0g$Q$&$,'&$ 5&#$!+3G03+&#$ %,+,%10+0#$,'-10#$-&$!+3G03+&$r89$>$+0#1,'10$-,$;3'J,$L&+G,$&$4,;&+C$recebido como parâmetro value. Como o objetivo do MapReduce é calcular a média salarial de cada região -&$e+,#3;$,&$;&')&$-&#$,'&#C$1&-&#$&#$#,;F+3&#$-0$*G$mesmo ano e região devem ser agrupados em uma mesma estrutura para se obter a média posterior-G0'109$B#10$1+,D,;J&$-0$,)+*!,G0'1&$-&#$#,;F+3&#$Q$+0,;3H,-&$'&$O0'#&A,!!0+9$?,+,$,)+*!,+$&#$#,;F+3&#C$&$G,!!0+$!+0%3#,$-0('3+$*G,$%J,40$-0$#,R-,$'&$L&+-G,1&$,'&S+0)3=&9$ $3'L&+G,<=&$-&$,'&$PF$0#1F$-3#!&-'R40;$'&$!,+bG01+&$]0g9$VF$,$+0)3=&$0#1F$%&'%,10',-,$%&G$&*1+&#$-,-&#$'&$!,+bG01+&$4,;*09$ $4,+3F40;$4,-lue é então convertida em String e associada à vari-F40;$;3'J,9$BG$#0)*3-,C$;3'J,$Q$-343-3-,$0G$*G$%&'-junto de elementos String armazenados em um array nomeando valores, usando o método split da própria %;,##0$ .1+3')9$ ##3GC$ 0E1+,3S#0$ ,$ 3'L&+G,<=&$ -0$ +0-gião e concatena-se a mesma com o ano para formar a chave de saída do mapper, e salvamos essa chave P*'1&$%&G$&$4,;&+$-&$#,;F+3&$!,+,$&$K0-*%0+C$*#,'-&$&$&DP01&$%&'10E1$0$#0*$GQ1&-&$f+3109$$$$

Listagem 12. Classe CensoMapper para dados censo.

public class CensoMapper extends Mapper <Text, Text, Text, DoubleWritable>{ @Override public void map(Text key, Text value, Context context) throws IOException, InterruptedException { // a linha é formada por todos os caracters apos o // separador da chave, // neste exemplo: chave=>1980, valor=> // 31#Sul#Santa Catarina#Xanxere#1700.50

String linha = value.toString(); String[] valores = linha.split(“#”); Text chaveSaidaMapper = new Text(); // monta a chave resultante como [ano]-[região] ex: // 1980-Sul chaveSaidaMapper.set(key.toString() + “-” + valores[1]); //grava um valor de salário para essa chave context.write(new Text(chaveSaidaMapper), new DoubleWritable(new Double(valores[4]))); }}

:,$ M3#1,)0G$ j\C$ ,$ %;,##0$ CensoReducer rece-be o resultado do mapper$ %&'10'-&$ 1&-&#$ &#$ #,;F-+3&#$ PF$ ,)+*!,-&#$!&+$ ,'&S+0)3=&9$>$ %F;%*;&$-,$GQ-dia é implementado de forma simples no método reduce(Text key, Iterable<DoubleWritable> va-lues, Context context), onde a chave de saída do mapper$ 5,'&S+0)3=&8$Q$+0%0D3-,$'&$!,+bG01+&$]0gC$0$1&-&#$&#$#,;F+3&#$-,$G0#G,$+0)3=&$0$-&$G0#G&$,'&$estão disponíveis no parâmetro values. Com esses da--&#C$&$%F;%*;&$-,$GQ-3,$#0$+0#*G0$,$310+,+$,$4,+3F40;$values$0G$*G$;&&!C$#&G,'-&$1&-&#$&#$#,;F+3&#$0$-3-43-3'-&$&$+0#*;1,-&$!0;,$2*,'13-,-0$1&1,;$-0$#,;F+3&#$presente na coleção values.

Listagem 13. Classe CensoReducer para dados censo.

public class CensoReducer extends Reducer <Text, Text, Text, Text> { public void reduce(Text key, Iterable<Text> values, Context context) throws IOException, InterruptedException{ double soma = 0, total=0; for(Text salario: values){ soma+=salario.get(); total++; } if(soma > 0 && total>0){ double media = soma/total; context.write(key, new DoubleWritable(media)); } }}

?,+,$0E0%*1,+$&$A,!K0-*%0C$Q$'0%0##F+3&$,3'-,$,$-0('3<=&$-0$*G,$%;,##0$,*E3;3,+C$ %&'10'-&$,;)*G,#$%&'()*+,<I0#$DF#3%,#$#&D+0$&$!+&%0##&$,$#0+$0E0%*1,-do pelo Hadoop. Essa classe é comumente denomina-da Driver, e é ela que deve ser informada no coman--&$ -&$ /,-&&!$ -0$ 0E0%*<=&$ -&$ !+&%0##&9$ O&'L&+G0$o framework do Hadoop, um Driver deve estender a

clas

se !"#$%&'(

e i

mpl

emen

tar

a in

terf

ace

To

ol,

,G

D,#$!+&43-,#$!0;,$ ?k9$O&G&$&$6+340+$Q$*G,$%;,#

-#0$-0$0E0%*<=&C$0;,$1,G

DQG$)0+,;G0'10$3G!;0G0'1,$

*G$GQ1&-&$!*D;3%$#1,13%$4&3-$G,3'5.1+3')st$,+)#8$!,+,$

iníc

io d

o pr

ogra

ma.

:,$M3#1,)0G$ju$Q$G&#1+,-,$,$%;,##0$C

en

soD

river

%&G&$&$6+340+$-&$A,!K0-*%0$-&$0E0G!;&$-0$%0'#&9$

$G0#G,$-0('0$*G$GQ1&-&$m

ain$!,+,$3'R%3&$-0$0E0-

cuçã

o, o

qu

al d

eleg

a o

proc

essa

men

to p

ara

o m

étod

o ru

nC$%*P,$3G!;0G0'1,<=&$Q$&D+3),1"+3,$PF$2*0$&$G0#

-G&$0#1F$0#!0%3(%,-&$',$3'10+L,%0$

To

ol.

Ess

e m

étod

o %&'1QG$,;)*G,#$3'L&+G,<I0#$DF#3%,#$#&D+0$&$A,!K0-

-*%0$!,+,$&$/,-&&!9$ !"#$4,;3-,+$,$2*,'13-,-0$-0$

!,+bG

01+&#$!,##,-&#C$&$6+340+$&D1QG$,$%&'()*+,<=&$

DF#3%,$-&$/,-&&!C$-0('0$&$%,+,%10+$#0!,+,-&$-0$%J,-

40$0$4,;&+$-0$*G,$;3'J,C$0#!0%3(%,$,$%;,##0$6+340+C$&$

'&G0$-&$!+&%0##&C$,$%;,##0$A,!!0+$0$K0-*%0+C$-0('0$

&#$13!&#$-0$#,R-,C$&$L&+G,1&$-0$0'1+,-,$5%&G&$%,-,$

;3'J,$-&$,+2*34&$-0$0'1+,-,$#0+F$-343-3-,$0G$%J,40$0$

4,;&+$!,+,$&$G,!!0+8$0$%&G&$#0+F$&$L&+G,1&$-&$,+2*3-

4&$+0#*;1,'10$-&$!+&%0##&C$(',;3H,'-&$%&G$,$3'L&+-

maç

ão d

os c

amin

hos

de

entr

ada

e sa

ída

dos

arqu

ivos

n

o H

DFS

.

Lis

tag

em

14

. D

rive

r d

e ex

ecu

ção

do

Map

Red

uce

.

pu

bli

c cl

ass

Cen

soD

rive

r ex

ten

ds( !'$/0*,"(

imp

lem

en

ts T

oo

l {

@

Ove

rrid

e

p

ub

lic

int

run

(Str

ing

[] a

rgs)

th

row

s E

xcep

tio

n {

if (

arg

s ==

nu

ll ||

arg

s.le

ng

th <

2)

{

Sys

tem

.err

.pri

ntl

n(“

Mo

do

de

uso

:

Cen

soD

rive

r <i

np

ut-

pat

h>

+

“<o

utp

ut-

pat

h>”

);

re

turn

-1

;

}

((((( !'$/0*&1#!'(%!'2(3(g

etC

on

f();

con

f.se

t(“k

ey.v

alu

e.se

par

ato

r.in

.inp

ut.

lin

e”, “

#”)

;

/ 46

Job job = new Job(conf); job. !"#$%&'()$ (CensoDriver.class); job.setJobName(“Censo”); job.setMapperClass(CensoMapper.class); job.setReducerClass(CensoReducer.class); job. !"*+",+"-!'()$ (Text.class); job. !"*+",+".$)+!()$ (DoubleWritable.class); job.setInputFormatClass( KeyValueTextInputFormat.class); job. !"*+",+"/0%1$"()$ (TextOutputFormat.class); FileInputFormat.setInputPaths(job, new Path(args[0])); FileOutputFormat. !"*+",+"2$"3(job, new Path(args[1])); boolean success = job.waitForCompletion(true); return (success ? 0 : 1); } public static void main(String[] args){ "%' { int ret = ToolRunner.run(new CensoDriver(), args); System.exit(ret); } catch (Exception ex) { ex.printStackTrace(); } }}

!"!#$%#%&%'()!"#*#+"*'%$$*#,!+-%.('%/#.%0%1$%#criar um arquivo jar contendo a classe Mapper, a clas-$%#-%.('%"#%#!#'2!$$%#3"40%"5#6*#%&%7+2*#.*#'%8$*/#*#9!"#'*8)%":#*#;%8$*,!++%"/#*#;%8$*-%.('%"#%#*#;%81$*3"40%"5# 6!# %&%'(<=*# .%$$%# 9!"# '*7*# ,!+-%.('%/#8=*#$%#($!#'*7!8.*#9!0!#>9!"#+!."=*#.*#9!0!/#7!$#(7#'*7!8.*#%$+%'?@#'*#.*#()424):"4*#A!.**+#B9:#()424C!.*#anteriormente para interação com o HDFS), mostra-.*#8!#D4$)!E%7#FG5#

Listagem 15. Executando o primeiro programa.

#HADOOP_HOME/bin/./hadoop jar /home/user/mundoj-censo-mr.jar mundoj.censo.mr.CensoDriver /mundoj/censo/censo.data /mundoj/output/output-01

6*# '*7!8.*# A!.**+# 9!"# .!# D4$)!E%7# FG# %$):#sendo passado como primeiro parâmetro o jar con-)%8.*#!$# '2!$$%$#.*#,!+-%.('%# B8*# '!$*/# *# !"H(40*#7(8.*91'%8$*17"59!"#%$):#8*#.4"%)I"4*# JA*7%J($%"K5#L#$%E(8.*#+!"M7%)"*#N#!#'2!$$%#3"40%"#'*8)%8.*#!$#'*8@#E("!<O%$# .*#,!+-%.('%5#L# )%"'%4"*# +!"M7%)"*#N# *# '!748A*# .*# !"H(40*# .%# %8)"!.!# 8*#P3QR# B8%$1$%#%&%7+2*/#*#!"H(40*#'%8$*5.!)!# 48'2(?.*#8*#P3QR#anteriormente). Como último parâmetro, o caminho do arquivo de saída contendo os resultados do Map-1-%.('%#8*#P3QR5#S$)%#.4"%)I"4*#8=*#+"%'4$!#%&4$)4"/#*#P!.**+#*# '"4!":#!()*7!)4'!7%8)%#!*#@#7#.!#%&%1'(<=*5#L#8*7%#+!."=*#.*$#!"H(40*$#.%#$!?.!#N#+!")11"1TTTT5# !"!#04$(!24C!"#*#"%$(2)!.*#.*#+"*'%$$*/#U!$)!#%&%'()!"#(7#'!)#B7*$)"!.*#8!#D4$)!E%7#FFK#+!$$!8.*#o arquivo de saída como parâmetro, ou navegar pela %$)"()("!#.*#P3QR#($!8.*#*#248V#WX"*Y$%#)A%#@#2%$Z$1)%7[#8!#48)%"\!'%#Y%U#B7*$)"!.!#8!#@#E("!#GK#!'%$$!1.!#!#+!")4"#.*#%8.%"%<*#A))+]JJ2*'!2A*$)]GTT^TJ.\$A%1alth.jsp, mostrado anteriormente.

Figura 5. !"#$%&' () ")*$+,-(' &%*$-+%.-(' /)+- %0,)"1-2) 3)45

(04 56!%$

78! 9:94$5

_$#48\*"7

!<O%$#'*8)4.!$#8%$)%#!")4E*#$=*#$(@#1

cien

tes

para

qu

e o

leit

or p

ossa

in

stal

ar u

m c

lust

er

Had

oop

em m

odo

pseu

dodi

stri

buíd

o, in

tera

gir

com

o

P3QR#+%2!#248A!#.%#'*7!8.*#B'"4!8.*#.4"%)I"4*$/#'*1

+4!8.*#%#2%8.*#!"H(40*$K/#!$$47#'*7*#()424C!"#!#_ `#

Java

do

Had

oop

para

esc

reve

r se

us

prim

eiro

s pr

ogra

-m

as M

apR

edu

ce.

Poré

m,

mu

itos

det

alh

es a

rqu

itet

u-

rais

do

Had

oop

impo

rtan

tes

para

o p

lan

ejam

ento

e

inst

alaç

ão d

e u

m c

lust

er r

ealm

ente

dis

trib

uíd

o n

ão

\*"!7#'*U%")*$/#9:#H(%#!#+"4*"4.!.%#.%$)%#)%&)*#%"!#

W!+"%$%8)!"[#!#!U*".!E%7

#.%#+"*E"!7

!<=*#,

!+-%1

.('%/#U%7

#'*7*#%&%7+2*$#.%#'%8:"4*$#!*$#H(!4$#)!2#

abor

dage

m p

ode

ser

apli

cada

com

o so

luçã

o, e

mos

-)"!"#(7#%&%7+2*#+":)4'*#.%#+"*E"!7

!<=*#,

!+-%.(1

'%5#a!7

UN7

#'*7#*#*U9%)40*#.%#$47+24@#'!"#*#'*8)%b.*#

dest

e ar

tigo

in

trod

utó

rio,

fer

ram

enta

s ú

teis

par

a in

-te

graç

ão d

o H

adoo

p co

m o

utr

os s

iste

mas

, bem

com

o _ `$#%#+"*E"!7

!$#!(&424!"%$#.%#'*8@#E("!<=*#%#7*841

tora

men

to d

e cl

ust

ers

Had

oop

fora

m a

pen

as c

itad

os

na

intr

odu

ção

dest

e ar

tigo

. É e

vide

nte

, por

tan

to, q

ue

A:#!48.!#7(4)*$#)I+4'*$#$*U"%#%$)!#)%'8*2*E4!#!#$%1

rem

cob

erto

s po

r ar

tigo

s fu

turo

s.

> !"#$%&$'!()$*+(',#$-(.%%+$/$,""+011,(.%%+2(+(',#2%341

> !"#$%&$'!()$.!5"3!67!89%$:)%7.#3($/$,""+011;

;;2')%7.#3(2

co

m/

> <!=3%$-(.%%+$>?$*'"!%?@$.#$:,7'A$<(B

> <!=3%$-(.%%+@$C,#$D#&$?!"!=#$E7!.#@$.#$C%B$F

,!"#

> G

(?7()$.#$>?5"()(89%$:)%7.#3($/$,""+5011''+2')%7.#3(2

'%B1.!5+)(H1:D-DI:1:D-JK>?5"())("!%?

>C7"%3!()$-(.%%+$:)%7.#3($/$,""+5011''+2')%7.#3(2'%B1

.!5+)(H1 LMMINC1-(.%%+KC7"%3!()

>GOP7!?($=!3"7()$:)%7.#3($/$,""+5011''+2')%7.#3(2'%B1

.!5+)(H1 LMMINC1:)%7.#3(QRS5K-(.%%+KD#B

%KTG

>*3"!4%$D#=#)%+#3F%3A5$.($>UG$#B$+%3"747V5@$+(3"#$W$#$R

,""+011;

;;2!6B2'%B1.#=#)%+#3;%3A51631')%7.1)!63(3H1)X

,(.%%+XW1

,""+011;

;;2!6B2'%B1.#=#)%+#3;%3A51631)!?7Y1)!63(3H1)X

,(.%%+XR1!?.#Y2,"B

)

/referências