Processando dados com

Save this PDF as:
 WORD  PNG  TXT  JPG

Tamanho: px
Começar a partir da página:

Download "Processando dados com"

Transcrição

1 hadoop_ Processando dados com Hadoop é um sistema de persistência e proces- distribuído, escrito em Java e desenvol- samento É, 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 MapReduce de arquivos similar ao de um sistema operacional - tail, cat, rm, grep), onde os dados são armazenados ção entre eles. Detalhes relacionados ao gerenciamento de replicação de arquivos, divisão em blocos, / 38

2 André Luiz Forchesatto - Wellington Ramos Chevreuil Engenheiro de Computação, SCJP, SCJD, SCMAD, SCWCD, SCBCD, SCEA. Atualmente utilizando hadoop e mapreduce em projetos 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 armazenamento de dados no mundo corporativo, propiciou a ascensão de empresas que enfatizaram a importância da análise de dados - - ter a qualidade da análise dos dados de uma carga crescente de - - apresentaremos neste artigo os conceitos básicos por trás de sua simulação de um cluster Hadoop em um ambiente de desenvolvi- Hadoop. toda a cargo do Hadoop, aliviando o desenvolvedor processamento distribuído dos algoritmos desenvolvidos. Para tanto, esses algoritmos devem seguir a abordagem MapReduce apresentada pelo Google, e op, o mesmo tem que implementar ou estender algu- doop, provendo uma espécie de framework java para de ser escrito em Java, o Hadoop também permite dos. Essa alternativa é chamada streamjob). - uma versão do Hadoop em modo pseudodistribuído 39 \

3 - Conceitos básicos - - essas características através de redundância e otimização do uso de recursos, e o gerenciamento dos diversos nós do cluster é feito de forma a tornar os mesmos o menos dependente possível uns dos outros. Em - rodando no nó falho), e clientes que estejam usan- do Hadoop é a capacidade de redimensionamento do cluster sem necessidade de reinicialização de sistema, ou seja, nós podem ser adicionados/removidos do cluster sem nenhuma parada de sistema. Um cluster Hadoop em funcionamento consiste cutando como Daemons, cada qual com uma respon- - - vidades). No caso da persistência, o sistema composto pelo nado namenode, e mantém um registro de onde os arquivos estão armazenados nos nós escravos. Um serão replicados nos diferentes nós do cluster. Essa escravos do HDFS são chamados de datanode, e sem- - 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- blocos, os quais, então, poderão ser consumidos ao mesmo tempo. também segue a abordagem de mestre e escravos. No caso do mestre, o daemon é chamado de jobtracker, processamento, escalonando as tarefas entre os nós tasktrackers Cliente Cluster Hadoop Namemode JobTracker DataNode DataNode DataNode TaskTracker TaskTracker TaskTracker Figura 1. Componentes de um Cluster Hadoop. / 40

4 mesmo nó do cluster), porém eles rodam em uma 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 - -blocos de dados sendo analisados por essa tarefa es- quina do tasktracker, evitando o consumo de rede. Na e seus relacionamentos. Hadoop na prática - contendo apenas artefatos do próprio Hadoop. No poníveis para download podem ser encontradas no seguinte link: releases.html#download Instalação e funcionamento possam rodar o Hadoop. che, descompacte o mesmo para uma pasta qualquer vel JAVA_HOME no arquivo hadoop-env.sh, disponível no diretório conf HADO- OP_HOME). - - Listagem 1. <property> <name>fs.default.name</name> <value>hdfs://localhost:9000</value> </property> gurar o nível de replicação dos arquivos para apenas - hdfs-site. xml Listagem 2. bloco de arquivo inserido no cluster. <property> <name>dfs.replication</name> <value>1</value> </property> - -Reduce, conhecido como JobTracker. Essa proprie- dades, nesse caso, o mapred-site.xml Listagem 3. duce (JobTracker). <property> <name>mapred.job.tracker</name> <value>localhost:9001</value> </property> teja devidamente instalado. É importante ressaltar que o Hadoop não usa SSH para a comunicação interna dos seus componentes. feita via RPC SSH apenas padrão do cluster em modo pseudodistribuído, conectando os respectivos daemons. Como trabalhamos em uma 41 \

5 Listagem 4. $ sudo su - # ssh-keygen -t dsa -P -f ~/.ssh/id_dsa # cat ~/.ssh/id_dsa.pub >> ~/.ssh/authorized_keys minal como root, deve-se formatar o sistema de ar- rio Hadoop administrativos. Um desses comandos é o format do sistema de arquivos limpo e pronto para usar. Figura 2. Interface Web do NameNode. Listagem 5. Formatando HDFS. <value>hdfs://localhost:9000</value> # HADOOP_HOME/bin/hadoop namenode -format instalação em modo pseudodistribuído, a inicializa- - do Hadoop. Figura 3. Listagem 6. Comando para iniciar o Hadoop. # HADOOP_HOME/bin/start-all.sh lizados corretamente, pode-se usar o comando jps, daemons namenode, secondarynamenode, datanode, jobtracker, tasktracker. para monitoramento do cluster, e uma vez inicializa- navegador de internet, através das seguintes URLs, JobTracker e do HDFS, respectivamente: faces web. cipal atribuição do Hadoop é o processamento de a partir de dezenas ou centenas de Gigabyets, Petabytes ou mesmo Terabytes de dados) disponível no - - veis entrevistados em diferentes pesquisas, gerando como resultado a média salarial por região, em cada da suposta entrevista, dados de idade, a residência e - - / 42

6 Listagem 7. Formato da base de dados-exemplo, usando # como separador de colunas. 1980#31#Sul#Santa Catarina#Xanxerê# #33#Sul#Santa Catarina#Xanxerê# #28#Sul#Santa Catarina#Xanxerê# #19#Sul#Santa Catarina#Xanxerê# #19#Sul#Santa Catarina#Xanxerê# #19#Sul#Santa Catarina#Xanxerê# #39#Suldeste#São Paulo#Campinas# Para visualizar o conteúdo do arquivo direto no de comando usando o comando cat, conforme Lis- Listagem 11. Comando de visualização de arquivo no HDFS. #HADOOP_HOME/bin/./hadoop dfs cat /mundoj/ censo/censo.data 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- Hadoop mato do comando sempre segue o seguinte padrão: Hadoop [tipo do comando] [comando] [possíveis parâmetros]. Para prepararmos a entrada dos dados dados do censo, bem como enviar o arquivo para o HDFS. Primeiramente, criaremos a estrutura de dire- dfs, que indica que iremos interagir com o HDFS, o mkdir / mundoj/censo, para criarmos essa estrutura de pas- Listagem 8. Comando de criação de diretórios no HDFS. #HADOOP_HOME/bin/./hadoop dfs mkdir /mundoj/ censo HDFS mostrada anteriormente, ou diretamente pela linha de comando usando o comando ls, conforme 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 basta enviar o arquivo com os dados do censo, conforme put Listagem 10. Comando para envio de arquivos ao HDFS. #HADOOP_HOME/bin/./hadoop dfs put /home/user/ Documents/censo.data /mundoj/censo Figura 4. Terminal bash com exemplo de comando do Hadoop. Implementando um MapReduce classes que facilitam a implementação de processos que consumam dados do HDFS. Para a implementa- ponibiliza a classe Mapper níveis no HDFS) em linhas no formato de chave/valor. 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 quivo. É possível mudar esse formato usando a classe gistro seja formada por elementos da própria linha do arquivo, onde todos os caracteres que estiverem parâmetros do método map da classe Mapper, onde deve ser implementada a lógica de processamento Hadoop permite que esse comportamento seja con- 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- sultado do processo em si, e é gerado um arquivo de saída no HDFS contendo esses dados processados. CensoMapper 43 \

7 - - representam os tipos dos dados de entrada e os dois método map(text key, Text value, Context con- text) - map possui três parâmetros: key, va- resultado do processamento de cada linha. como uma interação de um loop de leitura dos arquivos de entrada. Dessa forma, cada linha lida de arquivo de entrada é processada em uma chamada do map. da do método map o algoritmo interpreta uma linha - recebido como parâmetro value. Como o objetivo do MapReduce é calcular a média salarial de cada região mesmo ano e região devem ser agrupados em uma mesma estrutura para se obter a média posterior- - - lue é então convertida em String e associada à vari- junto de elementos String armazenados em um array nomeando valores, usando o método split da própria gião e concatena-se a mesma com o ano para formar a chave de saída do mapper, e salvamos essa chave Listagem 12. Classe CensoMapper para dados censo. public class CensoMapper extends Mapper <Text, Text, Text, 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# 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]))); CensoReducer recebe o resultado do mapper - dia é implementado de forma simples no método reduce(text key, Iterable<DoubleWritable> values, Context context), onde a chave de saída do mapper estão disponíveis no parâmetro values. Com esses da- values - 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)); do pelo Hadoop. Essa classe é comumente denominada Driver, e é ela que deve ser informada no coman- o framework do Hadoop, um Driver deve estender a / 44

8 classe e implementar a interface Tool, - início do programa. CensoDriver main cução, o qual delega o processamento para o método run- Tool. Esse método mação dos caminhos de entrada e saída dos arquivos no HDFS. Listagem 14. Driver de execução do MapReduce. public class CensoDriver extends implements Tool public int run(string[] args) throws Exception { if (args == null args.length < 2) { System.err.println( Modo de uso: CensoDriver <input-path> + <output-path> ); return -1; getconf(); conf.set( key.value.separator.in.input.line, # );

9 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. (TextOutputFormat.class); FileInputFormat.setInputPaths(job, new Path(args[0])); FileOutputFormat. (job, new Path(args[1])); boolean success = job.waitforcompletion(true); sendo passado como primeiro parâmetro o jar con- anteriormente). Como último parâmetro, o caminho do arquivo de saída contendo os resultados do Map- o arquivo de saída como parâmetro, ou navegar pela alth.jsp, mostrado anteriormente. 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(); criar um arquivo jar contendo a classe Mapper, a clas- anteriormente para interação com o HDFS), mostra- 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 Figura 5. / 46

10 cientes para que o leitor possa instalar um cluster Hadoop em modo pseudodistribuído, interagir com o Java do Hadoop para escrever seus primeiros programas MapReduce. Porém, muitos detalhes arquiteturais do Hadoop importantes para o planejamento e instalação de um cluster realmente distribuído não abordagem pode ser aplicada como solução, e mos- deste artigo introdutório, ferramentas úteis para integração do Hadoop com outros sistemas, bem como toramento de clusters Hadoop foram apenas citados na introdução deste artigo. É evidente, portanto, que rem cobertos por artigos futuros. /referências > > com/ > > > > > >