Por que eu devo ler este artigo: Este artigo aborda os fundamentos básicos e a instalação da tecnologia Apache Hadoop em um ambiente para desenvolvimento de aplicações que manipulam grandes volumes de dados (Big Data).

Hadoop destaca-se como uma tecnologia aberta, baseada no paradigma MapReduce, que utiliza a computação paralela e distribuída para resolver o problema da escalabilidade no processamento de BigData, com garantias de tolerância a falhas. Das vantagens em adotá-lo, está o fato de se utilizar aglomerados de máquinas convencionais, tornando-o eficaz como solução de baixo custo de implantação. Ademais, com ele as empresas podem conquistar uma grande vantagem competitiva, dispondo de um mecanismo que possibilita avaliar grandes quantidades de dados em busca de novas informações.


Guia do artigo:

Vivenciamos a era da informação, na qual volumes expressivos de dados são produzidos pelas mais diversas organizações e estruturas de sistemas, alcançando dimensões que superam com facilidade os petabytes diários. Tal volume surge de diversas fontes de dados, como, por exemplo, medições coletadas por sensores dos mais diversos tipos, histórico dos serviços oferecidos por sistemas Web, variados conteúdos produzidos pelos usuários em redes sociais, acesso a bases de dados de imagens e mapas, e muito mais. Tais fontes heterogêneas produzem uma quantidade de dados acima da capacidade que normalmente pode ser processada por tecnologias tradicionais de banco de dados relacional.

Nesse contexto, o termo Big Data (aqui denominado Bigdata) foi definido considerando as seguintes questões:

  1. Volume de dados em grande quantidade (acima de terabytes);
  2. Velocidade nacriação e captura de dados brutos a taxas muito rápidas, podendo ser arquivos em lote, obtidos de bancos de dados, ou dados gerados em tempo real (em streaming); e,
  3. Variedade no formato dos dados, podendo ser estruturado, semiestruturado, e até mesmo não estruturado, ou uma combinação dessas variações. Essas três questões estão ilustradas na Figura 1.
As três dimensões do Bigdata: volume, variedade e velocidade
Figura 1. As três dimensões do Bigdata: volume, variedade e velocidade

Assim, considerando as características extremas do Bigdata, uma nova classe de aplicações deve ser construída para analisar grandes bases de dados, processar pesados cálculos sobre esses dados, identificar comportamentos e disponibilizar serviços especializados em seus domínios.

Entretanto, não é uma tarefa trivial implementar tais soluções, pois há, na maioria das vezes, a inviabilidade de executá-las no modelo computacional tradicional, usando tecnologias baseadas em banco de dados relacional, e processando em máquinas com escalabilidade baixa. Os ditos problemas grandes ou complexos chegam a consumir horas ou dias de processamento nas arquiteturas convencionais. Embora em constante evolução, os recursos computacionais convencionais são insuficientes para acompanhar a crescente complexidade das novas aplicações.

Como proposta para superar os desafios, surge o Apache Hadoop, um framework para o processamento de grandes quantidades de dados em aglomerados e grades computacionais. A ideia de promover soluções para os desafios dos sistemas distribuídos em uma só plataforma é o ponto central do projeto Hadoop. Nessa plataforma, problemas como integridade dos dados, disponibilidade dos nós, escalabilidade da aplicação e recuperação de falhas são simplificadas para quem desenvolve as aplicações.

Além disso, seu modelo de programação e sistema de armazenamento dos dados promove um rápido processamento, muito superior às outras tecnologias similares. Atualmente, além de estar consolidado no mundo empresarial, o Hadoop tem obtido crescente apoio da comunidade acadêmica, proporcionando, assim, estudos científicos e práticos.

Com base em tudo o que foi citado, este artigo apresenta os fundamentos das técnicas e dos conceitos envolvidos no projeto Apache Hadoop, em especial o modelo de programação MapReduce. Em seguida, são detalhadas as etapas para a instalação e configuração de um ambiente Hadoop a ser utilizado no desenvolvimento e testes de aplicações Bigdata.

O que é o Apache Hadoop?

O Apache Hadoop é um framework open source para o armazenamento e processamento de dados em larga escala. Ele oferece como ferramentas principais uma implementação do modelo MapReduce, responsável pelo processamento distribuído, e o Hadoop Distributed File System (HDFS), para armazenamento de grandes conjuntos de dados, também de forma distribuída.

Embora recente, o Apache Hadoop tem se destacado como uma ferramenta eficaz, sendo utilizado por grandes corporações como IBM, Oracle, Facebook, Yahoo!, entre outras. Mas para chegar nesse ponto, alguns eventos importantes ocorreram nos últimos dez anos, como demonstram os fatos históricos a seguir:

  • Fevereiro de 2003: Jeffrey Dean e Sanjay Ghemawat, dois engenheiros do Google, desenvolvem a tecnologia MapReduce, que possibilitou otimizar a indexação e catalogação dos dados sobre as páginas Web e suas ligações. O MapReduce permite dividir um grande problema em vários pedaços e distribuí-los em diversos computadores. Essa técnica deixou o sistema de busca do Google mais rápido mesmo sendo executado em computadores convencionais e menos confiáveis, diminuindo assim os custos ligados à infraestrutura;
  • Outubro de 2003: O Google desenvolve o Google File System, um sistema de arquivos distribuído o GoogleFS (depois chamado de GFS), criado para dar suporte ao armazenamento e processamento do grande volume de dados da tecnologia MapReduce;
  • Dezembro de 2004: o Google publica o artigo Simplified Data Processing on Large Clusters, de autoria dos engenheiros Dean e Ghemawat, onde eles apresentam os principais conceitos e características da tecnologia MapReduce, porém, sem detalhes sobre a implementação;
  • Dezembro de 2005: o consultor de software Douglas Cutting divulgou a implementação de uma versão do MapReduce e do sistema de arquivos distribuídos com base nos artigos do GFS e do MapReduce publicados pelos engenheiros do Google. A implementação faz parte do subprojeto Nutch, adotado pela comunidade de software livre para criar um motor de busca na Web, normalmente denominado web crawler (um software que automatiza a indexação de páginas) e um analisador de formato de documentos parser . Tempos depois o Nutch seria hospedado como o projeto Lucene, na Apache Software Foundation , tendo como principal função fornecer um poderoso mecanismo de busca e indexação de documentos armazenados em diversos formatos, como arquivos de texto, páginas web, planilhas eletrônicas, ou qualquer outro formato do qual se possa extrair informação textual;
  • Fevereiro de 2006: a empresa Yahoo! decide contratar Cutting e investir no projeto Nutch, mantendo o código aberto. Nesse mesmo ano, o projeto recebe o nome de Hadoop, passando a ser um projeto independente da Apache Software Foundation;
  • Abril de 2007: o Yahoo! anuncia ter executado com sucesso uma aplicação Hadoop em um aglomerado de 1.000 máquinas. Também nessa data, o Yahoo! passa a ser o maior patrocinador do projeto. Alguns anos depois, a empresa já contava com mais de 40.000 máquinas executando o Hadoop (White, 2010);
  • Janeiro de 2008: o Apache Hadoop, na versão 0.15.2, amadurece como um projeto incubado na fundação Apache, e torna-se um dos principais projetos abertos da organização;
  • Julho de 2008: uma aplicação Hadoop em um dos aglomerados do Yahoo! quebra o recorde mundial de velocidade de processamento na ordenação de 1 terabyte de dados. O aglomerado era composto de 910 máquinas e executou a ordenação em 209 segundos, superando o recorde anterior que era de 297 segundos;
  • Setembro de 2009: a empresa Cloudera, especializa em Bigdata, contrata Cutting como líder do projeto. Cloudera é uma empresa que redistribui uma versão comercial derivada do Apache Hadoop;
  • Dezembro de 2011: passados seis anos desde seu lançamento, o Apache Hadoop disponibiliza sua versão estável (a 1.0.0). Entre as melhorias, destaca-se o uso do protocolo de autenticação de rede Kerberos, para maior segurança de rede; a incorporação do subprojeto HBase, oferecendo suporte a BigTable; e o suporte à interface WebHDFS, que permite o acesso HTTP para leitura e escrita de dados;
  • Maio de 2012: a Apache faz o lançamento da versão da 2.0 do Hadoop, incluindo alta disponibilidade no sistema de arquivos (HDFS) e melhorias no código.

Ao ser hospedado como um projeto da Apache Software Foundation, o Hadoop segue o modelo de licenciamento da Apache, bem mais flexível que outras modalidades de licença para software livre, permitindo modificações e redistribuição do código-fonte. Dessa forma, várias empresas surgiram no mercado distribuindo implementações do Hadoop.

Cada uma dessas implementações normalmente acrescenta novas funcionalidades, aplicam especificidades de um nicho de mercado, ou ainda se limitam a prestação de serviços como implantação, suporte e treinamento. Dentre algumas empresas com estes objetivos temos a Amazon Web Service, Cloudera, Hortonworks, KarmaSphere, Pentaho e Tresada. Atualmente, a Cloudera é uma das líderes no mercado, chefiada por Douglas Cutting, um dos criadores do Apache Hadoop original.

Nota: A licença Apache exige a inclusão do aviso de direitos autorais (copyright) e termo de responsabilidade, mas não é uma licença totalmente livre, comcopyleft, permitindo seu uso em um software comercial.

Arquitetura Hadoop

Os componentes chave do Hadoop são o modelo de programação MapReduce e o sistema de arquivos distribuído HDFS. Entretanto, em meio a sua evolução, novos subprojetos, que são incorporados como componentes à arquitetura Hadoop, completam a infraestrutura do framework para resolver problemas específicos. Uma visão simplificada dessa organização de componentes pode ser vista na Figura 2.

Na camada de armazenamento de dados há o sistema de arquivos distribuído Hadoop Distributed File System (HDFS), um dos principais componentes do framework. Já na camada de processamento de dados temos o MapReduce, que também figura como um dos principais subprojetos do Hadoop. Na camada de acesso aos dados são disponibilizadas ferramentas como Pig, Hive, Avro, Mahout, entre outras.

Estas ferramentas tendem a facilitar a análise e consulta dos dados, fornecendo uma linguagem de consulta similar às utilizadas em bancos de dados relacionais (como a SQL, por exemplo). Assim, todo um ecossistema em volta do Hadoop é criado com ferramentas que suprem necessidades específicas; por exemplo, ZooKeeper, Flume e Chukwa, que melhoram a camada de gerenciamento. Essas ferramentas fornecem uma interface com o usuário que busca diminuir as dificuldades encontradas no manuseio das aplicações que rodam nessa plataforma.

Hadoop
Figura 2. Componentes da arquitetura Hadoop

Para funcionar, uma aplicação Hadoop exige no mínimo a utilização das ferramentas da camada de armazenamento (HDFS) e processamento MapReduce. As demais camadas podem ser adicionadas conforme a necessidade. A seguir, cada componente é explicado em sua essência.

Componentes principais

O projeto Hadoop, em sua versão estável (a 1.0), atualmente sob a tutela da Fundação Apache, inclui os seguintes módulos, mantidos como subprojetos:

  • Hadoop Common: contém um conjunto de utilitários e a estrutura base que dá suporte aos demais subprojetos do Hadoop. Utilizado em toda a aplicação, possui diversas bibliotecas como, por exemplo, as utilizadas para serialização de dados e manipulação de arquivos. É neste subprojeto também que são disponibilizadas as interfaces para outros sistemas de arquivos, tais como Amazon S3 e CloudSource;
  • Hadoop MapReduce: implementa um modelo de programação na forma de uma biblioteca de classes especializadas no processamento de conjuntos de dados distribuídos em um aglomerado computacional. Abstrai toda a computação paralela em apenas duas funções: Map e Reduce;
  • Hadoop Distributed File System (HDFS): um sistema de arquivos distribuído nativo do Hadoop. Permite o armazenamento e transmissão de grandes conjuntos de dados em máquinas de baixo custo. Possui mecanismos que o caracteriza como um sistema altamente tolerante a falhas.

Componentes adicionais

Além desses, há outros projetos na comunidade Apache que adicionam funcionalidades ao Hadoop, como:

  • Ambari: ferramenta baseada na Web para o suporte, gerenciamento e monitoramento de outros módulos Hadoop, como HDFS, MapReduce, Hive, HCatalog, HBase, ZooKeeper, Oozie, Pig e Sqoop;
  • Avro: sistema de serialização de dados;
  • Cassandra: banco de dados escalável, com tolerância a falhas;
  • Flume e Chukwa: sistemas que tratam da coleta de ocorrências (logs) para o monitoramento do Hadoop;
  • HBase: banco de dados escalável e distribuído que suporta o armazenamento de dados estruturados para grandes tabelas;
  • Hive: infraestrutura de data warehouse que fornece sumarização de dados e consultas adhoc;
  • Mahout: sistema para desenvolvimento de aplicações de aprendizagem de máquina e biblioteca com funções de mineração de dados;
  • Pig:fornece uma linguagem de consulta de alto nível (PigLatin) orientada a fluxo de dados, e uma estrutura de execução para computação paralela;
  • ZooKeeper: serviço de coordenação de alto desempenho para aplicações distribuídas.

Funcionamento da arquitetura básica

O Hadoop fornece uma arquitetura para que aplicativos MapReduce funcionem de forma distribuída em um cluster de máquinas, organizadas em uma máquina mestre e várias escravo. Para simplificar o desenvolvimento dessas aplicações, é possível instalar e executar o framework no modo simplificado, utilizando apenas uma máquina (que irá simular um ambiente paralelizável/distribuído).

Para que o Hadoop funcione, é necessários cinco processos: NameNode, DataNode, SecondaryNameNode, JobTracker e TaskTracker. Os três primeiros são integrantes do modelo de programação MapReduce, e os dois últimos do sistema de arquivo HDFS. Os componentes NameNode, JobTracker e SecondaryNameNode são únicos para toda a aplicação, enquanto que o DataNode e JobTracker são instanciados para cada máquina do cluster.

Considerando os dois principais componentes do Hadoop (MapReduce e HDFS), a arquitetura básica será explica a seguir.

HDFS (Hadoop Distributed File System)

Um sistema de arquivos distribuído é responsável pela organização, armazenamento, localização, compartilhamento e proteção de arquivos que estão distribuídos em computadores de uma rede. Em sistemas distribuídos, quando mais de um usuário tenta gravar um mesmo arquivo simultaneamente, é necessário um controle da concorrência (acesso simultâneo ao mesmo recurso) para que haja uma operação atômica dos processos a fim de garantir a consistência das informações.

Neste caso, um sistema de arquivos distribuídos deve garantir a atomicidade nas operações de leitura, escrita, criação ou remoção de um arquivo, de forma transparente para quem manipula os dados, como se fosse similar a um sistema de arquivos local.

Nota: Um sistema de arquivos é um componente do sistema operacional que permite ao usuário interagir com os arquivos e diretórios, seja para salvar, modificar ou excluir arquivos e diretórios (pastas), bem como instalar, executar ou configurar programas. Um sistema de arquivos distribuído faz tudo isso, mas em um ambiente de rede, onde os arquivos estão fisicamente espalhados em máquinas distintas. Para quem usa tais arquivos, o sistema deve permitir as mesmas facilidades de um sistema de arquivos local.

O HDFS atua como um sistema de arquivos distribuído, localizado na camada de armazenamento do Hadoop, sendo otimizado para alto desempenho na leitura e escrita de grande arquivos (acima dos gigabytes) que estão localizados em computadores (nós) de um cluster.

Dentre as características do HDFS estão a escalabilidade e disponibilidade graças à replicação de dados e tolerância a falhas. O sistema se encarrega de quebrar os arquivos em partes menores, normalmente blocos de 64MB, e replicar os blocos um número configurado de vezes (pelo menos três cópias no modo cluster, e um no modo local) em servidores diferentes, o que torna o processo tolerante a falhas, tanto em hardware quanto em software.

O fato é que cada servidor tem muitos elementos com uma probabilidade de falha, o que significa que sempre haverá algum componente do HDFS falhando. Por serem críticas, falhas devem ser detectadas de forma rápida e eficientemente resolvidas a tempo de evitar paradas no sistema de arquivos do Hadoop.

A arquitetura do HDFS é estruturada em master-slave (mestre-escravo), com dois processos principais, que são:

  • Namenode: responsável por gerenciar os dados (arquivos) armazenados no HDFS, registrando as informações sobre quais datanodes são responsáveis por quais blocos de dados de cada arquivo, organizando todas essas informações em uma tabela de metadados. Suas funções incluem mapear a localização, realizar a divisão dos arquivos em blocos, encaminhar os blocos aos nós escravos, obter os metadados dos arquivos e controlar a localização de suas réplicas. Como o NameNode é constantemente acessado, por questões de desempenho, ele mantém todas as suas informações em memória. Ele integra o sistema HDFS e fica localizado no nó mestre da aplicação, juntamente com o JobTracker;
  • Datanode: responsável pelo armazenamento do conteúdo dos arquivos nos computadores escravos. Como o HDFS é um sistema de arquivos distribuído, é comum a existência de diversas instâncias de DataNode em uma aplicação Hadoop, permitindo que os arquivos sejam particionados em blocos e então replicados em máquinas diferentes. Um DataNode poderá armazenar múltiplos blocos, inclusive de diferentes arquivos, entretanto, eles precisam se reportar constantemente ao NameNode, informando-o sobre as operações que estão sendo realizadas nos blocos.

MapReduce

O MapReduce é um modelo computacional para processamento paralelo das aplicações. Ele abstrai as dificuldades do trabalho com dados distribuídos, eliminando quaisquer problemas que o compartilhamento de informações pode trazer em um sistema dessa natureza. Consiste das seguintes funções:

  • Map: Responsável por receber os dados de entrada, estruturados em uma coleção de pares chave/valor. Tal função map deve ser codificada pelo desenvolvedor, através de programas escritos em Java ou em linguagens suportadas pelo Hadoop;
  • Shuffle: A etapa de shuffle é responsável por organizar o retorno da função Map, atribuindo para a entrada de cada Reduce todos os valores associados a uma mesma chave. Esta etapa é realizada pela biblioteca do MapReduce;
  • Reduce: Por fim, ao receber os dados de entrada, a função Reduce retorna uma lista de chave/valor contendo zero ou mais registros, semelhante ao Map, que também deve ser codificada pelo desenvolvedor.

A arquitetura do MapReduce segue o mesmo princípio master-slave, necessitando de três processos que darão suporte à execução das funções map e reduce do usuário, a saber:

  • JobTracker: recebe a aplicação MapReduce e programa as tarefas map e reduce para execução, coordenando as atividades nos TaskTrackers. Sua função então é designar diferentes nós para processar as tarefas de uma aplicação e monitorá-las enquanto estiverem em execução. Um dos objetivos do monitoramento é, em caso de falha, identificar e reiniciar uma tarefa no mesmo nó, ou, em caso de necessidade, em um nó diferente;
  • TaskTracker: processo responsável por executar as tarefas de map e reduce e informar o progresso das atividades. Assim como os DataNodes, uma aplicação Hadoop é composta por diversas instâncias de TaskTrackers, cada uma em um nó escravo. Um TaskTracker executa uma tarefa map ou uma tarefa reduce designada a ele. Como os TaskTrackers rodam sobre máquinas virtuais, é possível criar várias máquinas virtuais em uma mesma máquina física, de forma a explorar melhor os recursos computacionais;
  • SecondaryNameNode: utilizado para auxiliar o NameNode a manter seu serviço, e ser uma alternativa de recuperação no caso de uma falha do NameNode. Sua única função é realizar pontos de checagem (checkpointing) do NameNode em intervalos pré-definidos, de modo a garantir a sua recuperação e atenuar o seu tempo de reinicialização.

Na Figura 3 observa-se como os processos da arquitetura do Hadoop estão interligados, organizados em nós mestre e escravos. O mestre contém o NameNode, o JobTracker e possivelmente o SecondaryNameNode. Já a segunda camada, constituída de nós escravos, comporta em cada uma de suas instâncias um TaskTracker e um DataNode, vinculados respectivamente ao JobTracker e ao NameNode do nó mestre.

Uma tarefa (task) que roda em um nó escravo pode ser tanto de uma função map quanto de uma função reduce.

Funcionamento da arquitetura básica do Hadoop
Figura 3. Funcionamento da arquitetura básica do Hadoop

Instalação do ambiente Hadoop

O Hadoop possui três formas de instalação e execução da plataforma:

  • Modo Local ou Independente: Por padrão, o Hadoop foi configurado para executar em modo independente não distribuído. Esse modo é útil para desenvolver e testar um aplicativo;
  • Modo Pseudo distribuído: Pode executar em um único nó em modo pseudo distribuído. Nesse caso, cada instância de processo Hadoop executa como um processo Java diferente;
  • Modo Totalmente distribuído: O Hadoop é configurado em cluster com máquinas físicas (ou virtualizadas), cada qual com um endereço IP válido.

Na prática, é possível alternar entre essas configurações bastando que se editem as propriedades relacionadas em três arquivos: core-site.xml, hdfs-site.xml e mapred-site.xml. A seguir, é realizada a instalação do modo padrão (local), e no final é demonstrado o funcionamento da plataforma com a execução de uma aplicação exemplo.

Configuração do ambiente no modo local

O Hadoop está disponível como pacote open-source no portal da Apache (ver seção Links). Neste endereço você encontra a versão mais estável (1.2.x), a versão preliminar de atualização (a 2.x) e todas as versões anteriores a mais estável.

Entretanto, há no mercado versões que empacotam todo o ambiente de execução, bem como as configurações da plataforma operacional para a maioria das distribuições Linux atualmente em uso (Ubuntu, CentOS, RedHat, etc.).

Entre essas versões comerciais, porém gratuitas, uma das mais utilizadas é a ofertada pela empresa Cloudera (ver seção Links), denominada CDH (atualmente nas versões 3.x e 4.x), que pode ser instalada em uma máquina virtual (VMware, por exemplo), baseada no Linux CentOS.

Para efeito de demonstração, foi escolhida a instalação padrão do projeto Apache. Neste caso, é necessário verificar se a instalação Linux escolhida está configurada com os pacotes Java e SSH. Para os exemplos deste artigo, foi utilizado o seguinte ambiente: Linux Ubuntu 12.x, Java JDK 1.7, Apache Hadoop-1.2.1.

Após a definição e ativação do sistema operacional Linux, é recomendado criar um usuário e um grupo dedicados para o Hadoop, executando os comandos vistos na Listagem 1.


// Criando grupo com o nome “hadoopgrupo”: 
$ sudo addgroup hadoopgrupo 
// Adicionado o usuário “hadoop” ao grupo: 
$ sudo adduser --ingroup hadoopgrupo hadoop 
Listagem 1. Comandos para criação de usuário e grupo

Em seguida, providencie uma chave de autenticação SSH. Isso se faz necessário porque o Hadoop utiliza conexão segura (SSH) para gerenciar seus nós (mestre e escravos). No caso de conexão local (localhost), não há necessidade de senha na configuração do SSH. Os comandos vistos na Listagem 2 mostram como criar a chave de conexão SSH para o localhost.


$ ssh-keygen -t rsa -P “”
$ cat $HOME/.ssh/id_rsa.pub >> $HOME/.ssh/authorized_keys
Listagem 2. Comandos para criação da chave SSH

Certifique-se que o Hadoop esteja instalado na versão definida neste artigo (a 1.2.x). Uma forma de instalar o Hadoop no Linux é baixando o pacote a partir de um endereço homologado pela Apache. Em nosso exemplo, a opção foi a oferecida pela Unicamp. Os comandos para esse tipo de instalação podem ser vistos na Listagem 3.


$ cd /usr/local
$ sudo wget http://ftp.unicamp.br/pub/apache/hadoop/core/hadoop-1.2.1/
hadoop-1.2.1.tar.gz
$ sudo tar xzf hadoop-1.2.1.tar.gz
$ sudo ln -s hadoop-1.2.1 hadoop
$ sudo chown -R hadoop:hadoopgrupo hadoop-1.2.1
Listagem 3. Comandos para instalação do pacote Hadoop

Logo após, adicione a variável de ambiente da instalação Java (variável $JAVA_HOME) com os comandos (confirme os locais e versões do Java) mostrados na Listagem 4.


$sudo nano /usr/local/hadoop/conf/haoop-env.sh
export JAVA_HOME=/usr/lib/jvm/java-7-oracle
Listagem 4. Configuração da variável de ambiente para o compilador Java

A instalação exige que se crie um diretório que servirá de apoio ao armazenamento temporário dos arquivos de uma aplicação cliente, que serão manipulados no HDFS. Para isso, crie esse diretório com o nome tmp, executando os comandos da Listagem 5.


$sudo mkdir /home/hadoop/tmp
$sudo chown hadoop:hadoopgrupo /home/hadoop/tmp
$sudo chmod 750 /home/hadoop/tmp
Listagem 5. Diretório tmp para apoio ao ambiente HDFS

Agora, atualize a referência ao caminho do diretório no arquivo de configuração, editando o arquivo core-site.xml, como é visto na Listagem 6.


$sudo nano /usr/local/hadoop/conf/core-site.xml
Listagem 6. Editando o arquivo de configuração core-site.xml

Neste arquivo de configuração, adicione o código visto na Listagem 7 entre as tags <configuration > e </configuration > . Dentro dessa marcação XML ficam todas as propriedades de configurações básicas do Hadoop, como a localização da pasta de arquivos temporários e o host do serviço do HDFS (hdfs://localhost:54310).


  <configuration>
   
    <property>
         <name>hadoop.tmp.dir</name>
         <value>/home/hadoop/tmp</value>
         <description>A base for other temporary 
           directories.</description>
    </property>
   
    <property> 
         <name>fs.default.name</name>
         <value>hdfs:
         //localhost:54310</value>
         <description>The name of the default file system. A URI whose
         scheme and authority determine the FileSystem implementation. The
         uri"s scheme determines the config property (fs.SCHEME.impl) naming
         the FileSystem implementation class. The uri"s authority is used to 
         determine the host, port, etc. for a filesystem.</description>
    </property>
   
  </configuration>
Listagem 7. Atualizando a configuração do arquivo "core-site.xml"

Do mesmo modo, edite o arquivo de configuração hdfs-site.xml, como visto na Listagem 8.


$ sudo nano /usr/local/hadoop/conf/hdfs-site.xml
Listagem 8. Editando o arquivo hdfs-site.xml

No código deste arquivo, adicione o conteúdo mostrado na Listagem 9. Na propriedade dfs.replication você estabelece o fator de replicação padrão dos blocos de dados no HDFS. Esse valor define o número de réplicas que serão criadas e, normalmente, em uma instalação local do Hadoop (usada neste artigo), assume o valor “1”.


  <configuration>
    <property>
         <name>dfs.replication</name>
         <value>1</value>
         <description>Default block replication.
         The actual number of replications can be sepecified 
          when the file is created.
         The default is used if replication is not specified in create time.
         </description>
    </property>
  </configuration>
Listagem 9. Configuração do arquivo hdfs-site.xml

Feito isso, formate o sistema de arquivos para inicializar as pastas do nó principal do HDFS e permitir o uso do MapReduce, conforme os comandos da Listagem 10. O resultado desse processo é visto na Figura 4.


$su - hadoop
$ /usr/local/hadoop/bin/hadoop namenode –format
Listagem 10. Formatação do sistema de arquivos
Tela com as mensagens da formatação do NameNode
Figura 4.Tela com as mensagens da formatação do NameNode

O passo seguinte é preparar o Hadoop para ser utilizado, levantando todos os seus processos na memória. Para isso, execute o arquivo de comandos start-all.sh, confirmando o processo no final com “yes”. Depois, para verificar se tudo foi corretamente executado, chame o comando jps. Veja a sequência das instruções na Listagem 11 e o resultado na Figura 5.


$ /usr/local/hadoop/bin/start-all.sh
$ jps
Listagem 11. Inicialização do Hadoop
Inicialização do Hadoop
Figura 5. Processos do Hadoop em execução
Nota:Para evitar a necessidade de digitar o caminho completo do Hadoop até os arquivos executáveis no momento de executar um comando, configuraremos a variável de ambiente PATH . Considerando que o caminho (diretório) onde estão localizados os comandos (arquivos executáveis) é o diretório de instalação (/usr/local/hadoop/bin), abra o arquivo bashrc (use nano ~/.bashrc) e acrescente esse caminho à variável PATH usando o código: export PATH=$PATH:/usr/local/hadoop/bin.

Teste do ambiente Hadoop

Para validar o ambiente, o Hadoop disponibiliza o clássico exemplo de contar palavras (WordCount), que ilustra de forma didática a execução de uma aplicação MapReduce. Esse exemplo utiliza como entrada de dados um conjunto de arquivos texto, a partir dos quais a frequência das palavras será contada. Como saída, será gerado outro arquivo texto contendo cada palavra e a quantidade de vezes que cada uma foi encontrada.

Para ilustrar esse processamento, baixe uma coleção de dados sobre livros da biblioteca Gutenberg (ver seção Links), cujo conteúdo está disponível para uso livre em diversos formatos (HTML, PDF, TXT, ePub, entre outros). Neste caso, foi feito o download do arquivo texto pg20417.txt para uma pasta chamada gutenberg, conforme demonstra os comandos da Listagem 12.


$ mkdir gutenberg
$ lynx -dump http://www.gutenberg.org./cache/epub/20417/pg20417.txt >
gutenberg/pg20417.txt
Listagem 12. Download do arquivo de entrada

Em seguida, usando o comando de cópia de pasta (copyFromLocal) do sistema HDFS, transfira o conteúdo da pasta que contém o arquivo de palavras (pg20417.txt) ao ambiente Hadoop. Para isto, execute: hadoop dfs -copyFromLocal gutenberg gutenberg.

Feito isso, abra a pasta do Hadoop e execute o exemplo WordCount (distribuído no pacote do framework), como demonstra a Listagem 13. Observe que o caminho /user/hadoop/gutenberg representa a entrada (in), e /user/hadoop/gutenberg-output, a pasta com a saída do processo reduce.


 $ cd /usr/local/hadoop
$ hadoop jar hadoop-examples-1.2.1.jar wordcount /user/hadoop/gutenberg
 /user/hadoop/gutenberg-output 
Listagem 13. Executando as funções map e reduce do contador de palavras

No final do MapReduce é produzido um arquivo (denominado part-r-00000) que armazena a contagem de palavras presentes nos arquivo da pasta de entrada do Hadoop. Para ver esse conteúdo, execute o comando hadoop dfs -cat/user/hadoop/gutenberg-output/part-r-00000. A Figura 6 apresenta um trecho do resultado.

Trecho do resultado do processo de contagem de palavras
Figura 6 . Trecho do resultado do processo de contagem de palavras

Conclusão

Este artigo apresentou a ferramenta Hadoop como proposta para o processamento de grandes conjuntos de dados, que aqui chamamos de Bigdata . A ideia principal do funcionamento dessa ferramenta está no uso da técnica MapReduce, que permite a análise e tratamento desses dados facilitando a construção de aplicações que sigam o modelo previsto em duas funções, uma para o map e outra para o reduce.

Definidas as funções do MapReduce, Hadoop realiza o processamento distribuído em um conjunto (cluster) de computadores de baixo custo. O modelo de programação e a infraestrutura disponível na arquitetura MapReduce se encarregam de particionar e distribuir os dados de entrada, escalonar as execuções das funções map e reduce em máquinas distintas, tratar as falhas e a comunicação entre essas máquinas. Para assegurar a integridade e o controle dos dados na rede, Hadoop também apresenta um sistema de arquivos distribuído, o HDFS, fundamental para o funcionamento da arquitetura. O HDFS fornece os mecanismos que garantem a transparência na manipulação dos arquivos, com segurança e alto desempenho.

As características supracitadas constituem o sucesso da tecnologia, mas a sua adoção é restrita ao domínio de problemas que possam ser formulados e resolvidos dentro do contexto do paradigma; no caso, os dados devem estar organizados em uma coleção do tipo chave/valor e o processamento deve ser dividido em duas funções que se complementam, o map e o reduce.

Apesar de fazer parte de um projeto de código aberto, mantido pela comunidade Apache, Hadoop mostra ser, em pouco tempo de vida, uma tecnologia com maturidade e confiabilidade. Prova disso é a decisão que várias empresas de tecnologia da informação fizeram ao adotá-la para resolver seus problemas.

Além de usar essa tecnologia, gigantes como IBM, Google, Yahoo! e Oracle apostam e investem em projetos relacionados ao Hadoop e MapReduce.


Saiu na DevMedia!

  • Android Developer:
    Aprenda a programar e depurar aplicativos no Android Studio. Com os cursos desta série você saberá quais são as principais classes do Android SDK e conhecerá os componentes de aplicativo, criando os seus primeiros projetos.
  • MVC e Regras de negócio:
    Em uma arquitetura MVC, temos três camadas com diferentes responsabilidades. Em qual destas camadas deveria estar a regra de negócio da aplicação? Saiba isso e muito mais nesta série.

Saiba mais sobre Big Data ;)

  • Big Data na plataforma Java:
    Neste artigo apresentaremos uma visão conceitual sobre o que é big data, onde se originou, seus motivadores e principais usuários. Demonstraremos também modelos de programação como o MapReduce, assim como ferramentas Java para lidar com big data.
  • Analisando o Big Data na teoria e na prática:
    Este artigo irá introduzir o Big Data, apresentando um pouco da historia. Também iremos analisar algumas das principais tecnologias que foram criadas com o principal objetivo de fornecer recursos para se trabalhar com os conjuntos de dados.
  • Big Data em pequenos negócios:
    Veja neste artigo algumas definições sobre do que se trata o Big Data e alguns exemplos de como podemos usar isso a favor dos pequenos negócios.
Links:
  • Página oficial do projeto Apache Hadoop
  • Página oficial do projeto Lucene
  • Artigo que apresenta a técnica MapReduce
  • Artigo que explora os principais recursos da arquitetura do HDFS
  • Site da distribuição Hadoop oferecido pela Cloudera, em sua versão comunitária (aberta)
  • Projeto Gutenberg para livros eletrônicos grátis em língua portuguesa
Livros
  • Hadoop: The Definitive Guide - 3rd Edition. Tom White. O"Reilly. 2012. O livro aborda o tema Hadoop de forma didática e atualizada em sua atual versão (2.x), apresentando estudos de caso usados para resolver problemas no modelo mapreduce.