hadoop_
!
Hadoop é um sistema de persistência e proces-samento distribuído, escrito em Java e !"#$%#&$#$%'(#)*+$",$-(,./+$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 integraVW+%$(,),$#$J,"##(;$"+%"+$%!%*+7,%$"+$,"7!4!%*),-çã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
"#$ %
"#$ %
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 $"#$*(.*,)%!*(!K
L%)"
)+"&'.*#.&).+"+$=,:;!+"&)')"!+(!"&'$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 | wellington.chevreuil@gmail.com 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 | andreforchesatto@gmail.com 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
<%!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!+('!
#%$()#:),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ática
e#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#DownloadInstalação e funcionamento
F+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
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-;JZN[[\[TP&D1+,%]0+9P#!$ 0$ J11!ZTT;&%,;JZN[[^[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 TeraPeta-bytes 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,-	$B##0$,+2*34&$#0+F$,$0'1+,--,$-&$A,!K0-*%0C$0$#0*$L&+G,1&$(',;$Q$G+,-&$',$ 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
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+,-&$',$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 -&#$-,-	$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+,$ ,$ %;,##0$ CensoMapper &'-0$ #0+F$ 3G!;0G0'1,-&$ &$ !+&%0##,G0'1&$ -,$ 01,!,$
-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 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.publicclass CensoMapper extends Mapper <Text, Text, Text, DoubleWritable>{
@Override
publicvoidmap(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 = newText();
// 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(newText(chaveSaidaMapper), newDoubleWritable(newDouble(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.publicclass CensoReducer extends Reducer <Text, Text, Text, Text> {
publicvoidreduce(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, newDoubleWritable(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 Ha%&'()*+,<I0#$DF#3%,#$#&D+0$&$!+&%0##&$,$#0+$0E0%*1,-doop. Essa classe é comumente denomina-da Driver, e é ela que deve ser informadenomina-da no coman--&$ coman--&$ /,-&&!$ -0$ 0E0%*<=&$ coman--&$ !+&%0##&9$ O&'L&+G0$ o framework do Hadoop, um Driver deve estender a
classe !"#$%&'( e implementar a interfac e T ool , ,GD,#$ !+& 43-,#$ !0;,$ ?k9 $O &G&$ &$ 6+34 0+$ Q$ *G,$ %;,# -#0$ -0$ 0E 0%*<=&C $0;,$ 1,GDQG$ )0+,;G0'10$ 3G!;0G0'1,$ *G$ GQ1&-&$ !*D;3%$ #1,13%$ 4&3-$ G,3'5.1+3')st$ ,+)#8$ !,+,$ início do programa. :,$ M3#1,)0G$ ju$ Q$ G+,-,$ ,$ %;,##0$ C enso Driv er %&G&$ &$ 6+34 0+$ -&$ A,!K 0-*% 0$ -&$ 0E 0G!;&$ -0$ %0'#&9 $ $G0#G,$ -0('0$ *G$ GQ1&-&$ main $!,+,$ 3'R%3&$ -0$ 0E 0-cução, o qual delega o proc essamento para o método run C$%*P,$ 3G!;0G0'1,<=&$ Q$ &D+3),1"+3,$ PF$ 2*0$ &$ G0# -G&$ 0#1F$ 0#!0%3(%,-&$ ',$ 3'10+L,% 0$ T ool . Esse método %&'1QG$ ,;)*G,#$ 3'L &+G,< I0#$ DF#3%,#$ #&D+0$ &$ A,!K 0--*% 0$ !,+,$ &$ /,-&&!9 $ !"#$ 4,;3-,+$ ,$ 2*,'13-,-0$ -0$ !,+bG01+&#$ !,##,-&#C $&$ 6+34 0+$ &D 1QG$ ,$ %&'()*+,<=&$ DF#3%,$ -&$ /,-&&!C $-0('0$ &$ %,+,% 10+$ #0!,+,-&$ -0$ %J, -40$ 0$ 4,;&+$ -0$ *G,$ ;3'J,C $0#!0%3(%,$ ,$ %;,##0$ 6+34 0+ C$ &$ '&G0$ -&$ !+&% 0##&C $,$ %;,##0$ A,!!0+$ 0$ K 0-*% 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,4 0$ 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 dos caminhos de entrada e saída dos arquiv os no HDFS.
Listagem 14.
Driv er de e xe cução do MapR educ e. public class C ensoDriv er e xt ends ( !'$/0*,"( implements T ool { @ O verride public int run (String[] args) thro ws Ex ception { if (args == null || args.length < 2 ) { Syst em.err . println ( “Modo de uso: C ensoDriv er <input -path> “ + “<output -path>” ); return -1 ; } ((((( !'$/0*&1#!'(% !'2(3( getC onf (); c onf . set ( “k ey .value.separat or .in.input .line ” , “#” );Job job = newJob(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, newPath(args[0]));
FileOutputFormat. !"*+",+"2$"3(job, newPath(args[1]));
boolean success = job.waitForCompletion(true);
return (success ? 0 : 1); }
publicstaticvoidmain(String[] args){ "%' {
int ret = ToolRunner.run(newCensoDriver(), 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#+!")1 1"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%1 alth.jsp, mostrado anteriormente.
(
04 56!%$7
8! 9:
94$5
_$# 48\ *"7!< O%$# '*8)4.!$# 8%$)%# !")4E*# $=*# $(@ #1 cientes para que o leitor possa instalar um cluster Hadoop em modo pseudodistribuído, interagir 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 Hadoop para escre ver seus primeiros progra-mas MapR educ e. P orém, muitos detalhes arquitetu-rais do Hadoop importantes para o planejamento e instalação de um cluster realmente distribuído 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# abordagem pode ser aplicada como solução, e mos-)"!"# (7# %& %7+2*# +":)4' *# .%# +"*E"!7!<=*# ,!+-%.(1 '%5 #a !7UN7# '*7# *# *U9%)40 *# .%# $47+24@ #'!"# *# '*8)%b.*# deste artigo introdutório, f erramentas úteis para in-tegração do Hadoop com outros sistemas, bem como _ `$# %# +"*E"!7!$# !(&424!"%$# .%# '*8@ #E("!<=*# %# 7*841 toramento de clusters Hadoop foram apenas citados na introdução deste artigo. É evidente, portanto, que A:# !48.!# 7(4)*$# )I+4' *$# $*U"%# %$)!# )%'8*2*E4!# !# $%1 rem cobertos por artigos futuros.
> !"#$%& $'!()$ * +(',#$-(.%%+$/$,""+011,(.%%+2(+(',#2%341 > !"#$%& $'!()$.!5"3!67!8 9%$:)%7.#3($/$,""+011; ; ; 2')%7.#3(2 c om/ > <!=3%$-(.%%+$>?$ * '"!%?@ $.#$:,7'A$<(B > <!=3%$-(.%%+@ $C ,#$D#& $?!"!= #$E7!.#@ $.#$C %B$F,!"# > G(?7()$.#$>?5"()(8 9%$:)%7.#3($/$,""+5011' '+2')%7.#3(2 '%B1.!5+)(H1:D-DI:1:D-JK>?5"())("!%? >C 7"%3!()$-(.%%+$:)%7.#3($/$,""+5011' '+2')%7.#3(2' %B1 .!5+)(H1 LMM IN C1-(.%%+KC 7"%3!() > GOP7!?($=!3"7()$:)%7.#3($/$,""+5011' '+2')%7.#3(2' %B1 .!5+)(H1 LMM IN C1:)%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)