O MapReduce é um modelo de programação que permite o processamento de dados massivos em um algoritmo paralelo e distribuído, geralmente em um cluster de computadores. Hoje, o Hadoop é utilizado em larga escala por grandes corporações, como Facebook e Twitter, em aplicações Big Data. Este tema será útil para aplicações que envolvam dados massivos para processamento paralelo (embora seja interessante para processamento de quaisquer dados), geralmente utilizando um cluster de computadores.

A capacidade dos discos rígidos e outros elementos de armazenamento aumentaram bastante nos últimos anos, mas a velocidade de leitura e escrita dos mesmos não acompanhou o mesmo ritmo. Como um exemplo, a leitura de todo um disco rígido 20 anos atrás levava cerca de cinco minutos. Atualmente, leva mais de duas horas e meia. Trata-se de um longo período para ler todos os dados, e escrever é ainda mais lento. A solução mais óbvia para resolver esse problema é ler/escrever os dados em paralelo, utilizando vários discos. Deste modo, se existem 100 HDs, cada um com 1% do total dos dados, por exemplo, a leitura pode ser realizada 100 vezes mais rapidamente, em teoria.

No caso dessa leitura/escrita paralela dos dados, dois problemas são bastante comuns. O primeiro é bastante óbvio: se há 100 vezes mais discos rígidos, a chance de existir falha em um deles é 100 vezes maior, o que pode ocasionar perda de dados. Para evitar esse problema, geralmente utiliza-se a replicação, onde cópias de segurança dos dados são mantidas em diferentes discos. Outro problema é que muitas tarefas de análise de dados necessitam combinar dados “espalhados” em discos diferentes. Entretanto, esses problemas não geram dores de cabeça aos programadores, pois o MapReduce oferece um modelo de programação que os abstrai, uma vez que o processamento é realizado através de uma combinação entre chaves e valores (keys e values) que podem estar em diferentes discos.

No meio da análise de dados, um conceito que ganha força, e no qual grande parte do MapReduce está baseado, é o Big Data. Trata-se de um termo empregado para descrever o crescimento, o uso e a disponibilidade das informações, sejam elas estruturadas ou não. Para o Big Data, o importante não é a coleta de grandes quantidades de dados, mas sim como eles são processados. O potencial que ele traz para as empresas é imenso e para utilizá-lo, elas precisam ser capazes de aproveitar as informações contidas em suas gigantescas bases de dados para tomar as melhores decisões. Em outras palavras, Big Data não se refere apenas aos dados, mas também às soluções tecnológicas criadas para lidar com esses dados em quantidade, variedade e velocidade bastante significativos.

Nesse cenário, é praticamente impossível falar de MapReduce e esquecer do Hadoop. Basicamente, foi ele quem trouxe o MapReduce como solução para o processamento paralelo de dados e deu a ele o status que tem hoje. O Hadoop é um projeto que oferece uma solução para problemas relacionados à Big Data, tendo em seu núcleo duas partes essenciais: o Hadoop Distributed Filesystem (HDFS), que é um sistema de arquivos distribuído e confiável, responsável pelo armazenamento dos dados, e o próprio Hadoop MapReduce, responsável pela análise e processamento dos dados. Ambos possuem a confiabilidade como uma marca, o que torna o sistema muito robusto para aplicações que envolvem dados massivos e importantes para as organizações que o utilizam.

Hadoop

O Hadoop é uma coleção de subprojetos relacionados para computação distribuída, sendo todos eles hospedados pela Apache Software Foundation. Por possuir o código aberto, ele permite modificações relacionadas às necessidades de cada um, tal como é visto em larga escala com as distribuições Linux. Com isso, verifica-se a existência de alguns projetos privados, baseados no Hadoop que não são hospedados pela Apache. Já o próprio tem suas origens no Apache Nutch, um motor de pesquisa online juntamente com vários outros elementos, como o GDFS (Google Distributed FileSystem). Eles foram sendo portados para funcionar com o modelo MapReduce (que se via, já na época, ser uma solução mais eficiente), até que houve a necessidade de serem fundidos em um projeto maior, que é o Hadoop. Este nome surgiu de um elefante de pelúcia que pertencia ao filho do criador, Doug Cutting. Com esse nome, o projeto foi batizado em 2006, quando incorporado pela Yahoo!. Essa incorporação permitiu um crescimento muito rápido do Hadoop, pois o Yahoo!, sendo uma grande companhia, foi capaz de fornecer um time de profissionais dedicados e os recursos necessários para torná-lo um sistema a ser utilizado em larga escala.

Embora os subprojetos do Hadoop mais conhecidos sejam o MapReduce e seu sistema de arquivos distribuídos (HDFS), outros subprojetos oferecem uma série de serviços complementares ou adicionam abstrações de maior nível, ou seja, facilitando o desenvolvimento. Entre os demais subprojetos, vale destacar:

  • Avro: um sistema de serialização de dados que fornece RPCs (Remote Procedure Calls) eficientes e independentes de linguagem, armazenamento persistente de dados, estruturas de dados ricas, entre outros recursos, sendo muito utilizado com linguagens de programação dinâmicas;
  • Pig: uma plataforma para grandes conjuntos de dados que possui uma linguagem de programação de alto nível para realizar a análise desses dados. Além disso, possui a infraestrutura necessária para avaliar os programas criados, como um compilador especial que transforma as aplicações desenvolvidas nessa linguagem em uma sequência de programas MapReduce;
  • HBase: uma base de dados distribuída, criada para armazenar tabelas muito grandes (milhões de colunas x bilhões de linhas). Trata-se de um modelo de armazenamento orientado a colunas, muito fácil de utilizar com a API Java;
  • ZooKeeper: um serviço centralizado para coordenação de aplicações distribuídas. Mantém informações de configuração das aplicações distribuídas, além de fornecer a sincronização das mesmas. Esse tipo de serviço é comumente utilizado em aplicações distribuídas, e o ZooKeeper fornece uma interface simples para auxiliar o desenvolvedor, evitando bugs e condições de corrida (race conditions);
  • Hive: Uma espécie de Data Warehouse distribuído, facilita a utilização de grandes conjuntos de dados (datasets) em ambientes de armazenamento paralelo. Provê uma linguagem baseada em SQL, chamada HiveQL, que serve para facilitar a estruturação dos e pesquisa nos dados.

Esses subprojetos do Hadoop fornecem uma gama de opções muito grande para lidar com vários formatos de dados, o que aumenta a capacidade do mesmo e também sua confiabilidade e robustez. Eles criam um alto nível de abstração para que o desenvolvedor não precise ter a preocupação de entender a fundo o funcionamento de sistemas distribuídos para criar a sua infraestrutura e trabalhar com ela.

Hadoop Distributed FileSystem

O HDFS é um sistema de arquivos criado para armazenar arquivos muito grandes de forma distribuída. O conceito sobre o qual o HDFS foi construído é o chamado write-once, read-many-times, ou seja, escreva uma vez, leia muitas vezes. Esse tipo de construção é essencial para o Hadoop, uma vez que os dados serão processados inúmeras vezes, dependendo da aplicação, embora, normalmente, sejam escritos apenas uma vez. Esse tipo de construção faz com que seja desaconselhável a modificação de arquivos, pois acaba gerando muita sobrecarga. Além disso, como qualquer sistema de arquivos, o HDFS possui blocos de dados de tamanho fixo, porém com um tamanho muito maior do que sistemas de arquivos comuns. Enquanto os comuns giram em torno dos 512 bytes, o HDFS possui blocos de 64 MB, por padrão.

Sendo um sistema de arquivos, o HDFS possui as operações básicas comuns a todos eles. Com isso, tem-se que todos os arquivos possuem permissões para escrita, leitura e execução, bem como um dono. Isso também é visto em sistemas de arquivos tradicionais, onde cada arquivo é de posse de um usuário, e somente ele (ou o administrador) pode modificar suas permissões. Além disso, o HDFS possui um arquivo especial, basicamente um log de edição de dados, para que haja um controle maior a respeito das modificações nos dados presentes no sistema de arquivos.

Em termos de funcionamento, o HDFS necessita de dois tipos de nós de armazenamento: um namenode (mestre) e um ou mais datanodes (trabalhadores). O mestre comanda todo o sistema de arquivos, mantendo metadados para todos os arquivos e diretórios da árvore de diretórios e arquivos do sistema. Ele também sabe quais datanodes possuem os blocos de determinado arquivo. Já os datanodes guardam e recuperam blocos, quando mandados pelo nó mestre (os datanodes não fazem nada por conta própria), e enviam relatórios ao namenode periodicamente, com as listas dos blocos que eles estão armazenando.

Como o namenode é fundamental para o uso do sistema de arquivos, por comandar o mesmo, ele deve ser altamente resistente a falhas. Pensando nisso, o Hadoop fornece dois mecanismos. O primeiro deles é a realização de um backup dos arquivos essenciais do sistema de arquivos. Isto faz com que, em caso de problemas, seja possível retornar ao estado imediatamente anterior ao erro, de acordo com o backup, evitando perdas de dados muito significativas. A outra opção é utilizar um namenode secundário, que, apesar do nome, não atua como mestre, inicialmente. Este nó é utilizado apenas em caso de erro no namenode. O papel principal do “mestre secundário” é realizar uma junção, periodicamente, da imagem do sistema de arquivos com o log de edição, evitando que o log fique muito grande. Assim, como o estado desse namenode secundário é praticamente o mesmo do primário, em caso de falha do nó primário, é muito mais simples a recuperação do sistema. Basta copiar os arquivos de metadados do mestre para o secundário e rodar este como o novo primário.

Administrando o Hadoop

Quando utilizamos um sistema, é essencial que saibamos administrá-lo, e com o Hadoop não é diferente. Para isso, ele oferece uma série de ferramentas para facilitar a administração do cluster. Isso ocorre porque, é imprescindível saber como os componentes do HDFS (namenode, namenode secundário e datanodes) organizam seus dados. Embora tal organização seja abstraída no momento do processamento dos dados, o administrador precisa saber como os dados estão organizados, para o caso de algum problema com o sistema. Assim, é necessário saber informações como a versão do HDFS, o local onde estão armazenados os arquivos essenciais, como o log de edição, entre outras.

Além disso, informações contidas no namenode e no namenode secundário, que realiza um backup dos arquivos do primário, são essenciais para a administração do sistema como um todo. Já os datanodes possuem uma administração mais simples, pois criam seus diretórios de armazenamento de dados automaticamente quando iniciam suas atividades. Tal atitude facilita a administração do sistema visto que faz com que os datanodes não necessitem de nenhum tipo de atenção especial.

Em termos de segurança, vale ressaltar que o namenode possui um modo seguro. Neste modo, ele oferece apenas uma visão somente leitura do sistema de arquivos para o cliente, evitando assim modificações indesejadas dos dados. Isso é muito utilizado em casos de dados que estão sendo utilizados por vários clientes ao mesmo tempo. Ademais, o monitoramento do sistema é outra parte importante da administração, e para tanto, o Hadoop produz arquivos de log que são muito úteis para que se saiba o que está ocorrendo no sistema.

A administração de qualquer sistema também diz respeito à manutenção do mesmo, e nesse ponto o Hadoop oferece backups dos metadados e dos próprios dados, pois, como sabemos, ainda que o HDFS tenha sido criado para armazenar dados de forma confiável, a perda de dados pode ocorrer. Para evitar problemas, duas ferramentas importantes que o Hadoop oferece são: o fsck (Filesystem Check), que procura blocos corrompidos ou faltantes; e o Filesystem Balancer, que mantém os datanodes igualmente balanceados. Outra questão que chama atenção no Hadoop é a possibilidade de adição ou remoção de nós do cluster a qualquer momento que o administrador desejar. Essas operações são chamadas de comissionamento e descomissionamento de nós. Por fim, é importante a realização de planejamento em caso de upgrade em um cluster Hadoop, pois dependendo das alterações de uma versão para outra, pode haver perda de dados.

Uma parte muito importante em qualquer sistema diz respeito à entrada e saída de dados. O Hadoop, nativamente, vem com uma série de primitivas para isso. Algumas delas são genéricas e aparecem em vários outros sistemas, tais como as que dizem respeito à integridade e compressão de dados, mas existem alguns detalhes importantes a serem levados em consideração quando elas estão lidando com datasets de vários terabytes. As primitivas que são exclusivas do Hadoop são ferramentas ou APIs, como frameworks de serialização e estruturas de dados diretamente no disco, que facilitam essas operações de entrada e saída de dados.

Hadoop MapReduce

O Hadoop MapReduce é uma parte essencial do framework, uma vez que é o responsável pelo processamento de dados. O Hadoop trouxe o modelo de programação do MapReduce à tona, tornando o mesmo famoso. O MapReduce é uma excelente solução para o processamento paralelo de dados devido ao fato de serem inerentemente paralelos. O programador não precisa realizar nenhum tipo de programação extra para garantir que os processos serão processados paralelamente. Isso o coloca como uma solução fantástica para problemas envolvendo análise de dados em larga escala.

O MapReduce possui duas fases de processamento: o Map e o Reduce. A primeira fase, a fase de mapeamento, é responsável pelo processamento primário dos dados de entrada. Então, os resultados dessa fase são enviados para a função de redução como entradas. Então, o resultado final é realizado pela fase de redução e enviado para arquivos que conterão esses resultados. O escalonamento dos processos é feito internamente pelo Hadoop, e o desenvolvedor nem sequer fica sabendo como isso é realizado.

Porém, quais são os dados que o MapReduce é capaz de ler? Normalmente, os programas MapReduce leem dados de arquivos .csv, que são capazes de separar os dados mais ou menos com o mesmo formato que se vê em bases de dados de qualquer tipo, onde cada valor representa uma coluna de dados. Não é o único tipo de dados a serem lidos, porém: é possível ler dados de arquivos de texto ou qualquer outro tipo, desde que haja uma stream de dados de entrada que possa ser transformada em pares chave/valor, que é o que a aplicação irá entender posteriormente.

No MapReduce, ele funciona da seguinte forma: a entrada da aplicação é, como já informado, uma lista de pares chave/valor. Então, esses pares são pegos um a um e processados, cada um gerando um par chave/lista de valores. Os detalhes dessa transformação é que normalmente definem o que o programa MapReduce faz. A partir daí, essa nova lista de pares é pega como entrada pela função Reducer e é agregada de alguma forma, gerando uma saída final.

Através desse artigo foi possível entender que o MapReduce é capaz de realizar qualquer coisa que quisermos, partindo de um arquivo de entrada e enviando para um arquivo de saída.

Um exemplo muito simples e comum de programação paralela é a contagem de palavras em vários documentos diferentes. Sem utilizar o MapReduce, o desenvolvedor estaria envolvido em uma série de problemas que são inerentes ao processamento paralelo de dados. Porém, utilizando o MapReduce, o Hadoop cuida automaticamente disso para o programador, evitando que o mesmo tenha que se preocupar com problemas de escalonamento e o local que os dados se encontram no sistema de arquivos.

Outro ponto que conta a favor do Hadoop é a facilidade que o mesmo possui na administração. Com vários elementos para adicionar robustez ao sistema, bem como facilitar o controle sobre as atividades dentro do cluster, o Hadoop fornece uma solução excelente e simples para as empresas que necessitam processar seus dados de diversas maneiras para crescer, ou, em alguns casos, continuar dominando o mercado. Não à toa grandes corporações como o Facebook e o Twitter utiliza o Hadoop.


Saiu na DevMedia!

  • O JavaScript está dominando o mundo?:
    Apresentamos aqui o JavaScript na sua versão mais moderna. Ao acompanhar os cursos dessa série você se sentirá à vontade para programar em Angular, React ou Vue.
  • #partiu programar para Android?:
    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.
  • O que é Protocolo HTTP?:
    Nesta série falamos sobre o que vem depois do HTML/CSS. Saiba o que é requisição, resposta e se prepare para os seus primeiros passos na programação back-end.

Saiba mais sobre Big Data ;)

  • 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.
  • Big Data com Java:
    Neste Guia de Consulta você encontrará todo o conteúdo que precisa para entender a que se refere o termo Big Data, bem como sua importância, da perspectiva de um programador Java.
  • 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.