• Nenhum resultado encontrado

Processando dados com

N/A
N/A
Protected

Academic year: 2021

Share "Processando dados com"

Copied!
10
0
0

Texto

(1)

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

"#$ %

"#$ %

(2)

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

(3)

<%!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!+('!

(4)

#%$()#:),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#Download

Instalaçã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

(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-;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 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,-&#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

(6)

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,!,$

(7)

-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

(8)

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&#1+,-,$ ,$ %;,##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 ” , “#” );

(9)

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.

(10)

(

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 c

obertos 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)

/ref

erências

Referências

Documentos relacionados

Na terceita parte foi desenvolvida a ferramenta, que partindo de ficheiros de entrada com o posicionamento dos jogadores e da bola durante um jogo, consegue calcular automaticamente

No final, os EUA viram a maioria das questões que tinham de ser resolvidas no sentido da criação de um tribunal que lhe fosse aceitável serem estabelecidas em sentido oposto, pelo

Acrescenta, também, que as preocupações centrais para as feministas quanto à prestação de trabalho não remunerado debruçam-se sobre como valorizá-lo e partilhá-lo de

Contudo, não é possível imaginar que essas formas de pensar e agir, tanto a orientada à Sustentabilidade quanto a tradicional cartesiana, se fomentariam nos indivíduos

Pretendo, a partir de agora, me focar detalhadamente nas Investigações Filosóficas e realizar uma leitura pormenorizada das §§65-88, com o fim de apresentar e

No capítulo 4 são abordados os principais resultados obtidos diante das restrições impostas à coleta de dados, bem como a avaliação dos dados obtidos caracterizando os períodos

No primeiro, destacam-se as percepções que as cuidadoras possuem sobre o hospital psiquiátrico e os cuidados com seus familiares durante o internamento; no segundo, evidencia-se

Todavia, nos substratos de ambos os solos sem adição de matéria orgânica (Figura 4 A e 5 A), constatou-se a presença do herbicida na maior profundidade da coluna