• Nenhum resultado encontrado

Escalabilidade horizontalEscalabilidade horizontal

3.2 PROCESSAMENTO DE DADOS COM HADOOP

Uma das primeiras tecnologias de Big Data e que até hoje continua sendo amplamente utilizada é o Hadoop, também conhecido como o famoso elefantinho amarelo. Embora seja usado atualmente para uma infinidade de aplicações de Big Data, esse framework foi inicialmente projetado para um propósito específico: uma engine de busca da Web, tal como o serviço do Google, porém open source.

Criado por Doug Cutting e Mike Cafarella, o framework, que antes era parte integrante do projeto Apache Nutch, foi lançado oficialmente em 2006, passando a se chamar Hadoop.

Apenas a título de curiosidade, o nome Hadoop surgiu do nome que o filho do Doug Cutting deu ao seu elefante de pelúcia amarelo. Atualmente, o filho está com 13 anos e diz em tons de brincadeira que vai processar o pai por direitos autorais.

O framework Hadoop teve como inspiração a publicação de duas soluções proprietárias da Google: o sistema de arquivos distribuído Google File System (GFS) e o modelo de programação distribuída MapReduce. Ambas as soluções eram utilizadas para dar suporte ao armazenamento e processamento do grande volume de dados que a Google manipulava.

Com base na descrição dos artigos, os criadores do Hadoop desenvolveram uma versão open source baseada nessas soluções, nascendo assim o Hadoop Distributed File System (HDFS) e o Hadoop MapReduce, considerados os principais componentes do framework.

Embora tenha sido desenvolvido para um propósito específico,

Forrester Research estimou que as organizações analisavam apenas 12% dos seus dados, enquanto os 88% restantes não eram utilizados na tomada de decisão. A flexibilidade oferecida pelo Hadoop, tanto no armazenamento quanto no processamento de diferentes tipos de dados, somada à capacidade de escalar a solução, permitiram a exploração de novas análises, até então, inviáveis.

Vimos anteriormente que a escalabilidade horizontal apresenta muitas vantagens, porém muitas tecnologias não estão adaptadas para atuarem nesse cenário. Isso ocorre porque, para processar bases de dados que excedem a capacidade de uma única máquina, torna-se necessário a implementação de soluções distribuídas, capazes de dividir uma grande tarefa em outras menores, executando-as paralelamente em um conjunto de nós.

Entretanto, o desenvolvimento dessas soluções é complexo. Além da lógica do problema, deve-se implementar mecanismos relacionados à distribuição dos dados e das tarefas, como alocação de máquinas, escalonamento de tarefas, balanceamento de carga, comunicação entre máquinas, tolerância a falhas, entre outros aspectos.

A implementação incorreta de algum desses mecanismos pode impactar diretamente o desempenho da solução. É exatamente nesse ponto que o Hadoop se destaca.

Conforme apresentado na figura a seguir, Hadoop oferece uma abstração dos mecanismos existentes em ambiente distribuído, permitindo que o desenvolvedor se concentre unicamente na lógica do problema. Por exemplo, caso a equipe do Big Compras precise executar uma aplicação de detecção de fraude utilizando Hadoop, ela pode se concentrar somente na lógica necessária para realizar a

detecção. Todas as outras questões relativas à execução da aplicação são tratadas pelo próprio framework, reduzindo consideravelmente o tempo gasto no desenvolvimento.

Figura 3.3: Abstração oferecida pelo Hadoop

Nas proximas seções falaremos com mais detalhes sobre o HDFS e o MapReduce, componentes-chave do Hadoop para o armazenamento e processamento de grande volume de dados.

Nas atividades relacionadas ao armazenamento dos dados, Hadoop oferece o Hadoop Distributed File System (HDFS), um sistema de arquivos distribuído que permite o armazenamento de grande volume de dados de maneira tolerante a falhas. Por meio desse sistema de arquivos, a distribuição dos dados é feita através dos servidores de um cluster Hadoop.

O HDFS possui uma arquitetura mestre-escravo, na qual um servidor (chamado NameNode) é responsável por fazer todo o gerenciamento de metadados do sistema, e um conjunto de servidores (chamados DataNodes) são utilizados para fazer o armazenamento dos dados dos usuários. No quesito tolerância a

HDFS

HDFS

falhas, o HDFS possui uma estratégia de replicação que garante a recuperação dos dados, mesmo na ocorrência de falhas em um servidor escravo.

Conforme apresentado na figura seguinte, no momento que um usuário submete um arquivo para ser armazenado no HDFS, este é dividido em blocos de tamanhos fixos (128 megabytes por padrão, porém pode ser alterado), que são distribuídos entre os DataNodes do cluster.

Para oferecer tolerância a falhas, para cada bloco são armazenadas outras duas réplicas (valor também configurável) em diferentes servidores do cluster. Essa estratégia garante que, mesmo que um servidor fique indisponível, os blocos que ali estavam podem ser recuperados por meio de suas réplicas em outros servidores.

Figura 3.4: Estratégia de armazenamento de dados no HDFS

Outro grande ponto a se destacar no HDFS é a capacidade de

tornar transparentes ao usuário questões complexas de distribuição dos dados. Ou seja, no momento que solicitamos a escrita ou leitura dos dados, não precisamos saber como essas operações serão realizadas internamente, o que torna bem mais simples sua utilização.

Podemos, por exemplo, fazer o envio de um arquivo local para o HDFS usando os comandos a seguir:

$ hadoop fs -mkdir MeuDiretorio

$ hadoop fs -put $HOME/MinhaBase.csv MeuDiretorio

Nesse exemplo, primeiramente utilizamos o comando mkdir

da API do HDFS para criarmos um diretório chamado

MeuDiretorio no HDFS. Na sequência, utilizamos o comando put para fazermos uma cópia de um arquivo local no formato

CSV para dentro do diretório que acabamos de criar.

Perceba que em nenhum momento foi necessário inserir comandos relativos à distribuição dos dados. Tais operações são realizadas internamente pelo HDFS.

Para o processamento dos dados armazenados no HDFS, Hadoop oferece o modelo de programação MapReduce. Como o objetivo do processamento de dados em um cluster é melhorar o desempenho da aplicação por meio do processamento distribuído, esse modelo permite que grandes volumes de dados sejam processados por meio da divisão de uma aplicação em tarefas independentes, executadas em paralelo nos servidores do cluster.

Como o próprio nome indica, o modelo, inspirado em programação funcional, é composto por duas fases principais: map e reduce. A fase map é a primeira a ser executada em uma aplicação MapReduce. O objetivo dessa fase é processar um conjunto de

MapReduce

MapReduce

dados de entrada, que devem ser obtidos no formato de pares chave-valor.

Dessa forma, cada tarefa map processa cada par chave-valor individualmente, gerando como resultado uma saída, também no formato chave-valor. O resultado dessa saída dependerá da lógica do problema implementada pelo desenvolvedor da aplicação.

Antes de iniciar a fase reduce, ocorre um outro processo de ordenação dos dados. Conforme dados de saída são gerados pelas tarefas map, esses são movidos para serem utilizados nas tarefas reduce.

Cada tarefa reduce deverá receber uma lista contendo todos os valores associados a uma tarefa map. Para isso, é executada uma operação que captura todos os pares chave-valor gerados, e envia para uma tarefa reduce uma lista com a chave e todos os valores correspondentes a ela, de forma ordenada.

Após realizar essa operação para todas as chaves geradas na fase map, inicia-se então a fase reduce. Cada tarefa reduce recebe como parâmetro uma chave e sua respectiva lista de valores. Uma operação sobre essa lista de valores é então executada, gerando assim o resultado da aplicação, também no formato chave-valor.

Na figura adiante, é apresentado um exemplo do fluxo de execução de um algoritmo de contagem de palavras no modelo de programação MapReduce. O objetivo do algoritmo é verificar cada palavra existente no arquivo e contar a frequência de cada uma delas.

Para facilitar o entendimento, o conjunto de dados de entrada foi simplificado, contendo um arquivo com as palavras "Cloud", "IoT" e "Java". Lembre-se de que, em um cenário real, essa entrada pode ser um ou mais arquivos com milhões de palavras.

Figura 3.5: Fluxo de execução do algoritmo de contagem de palavras

Para fazer a divisão e distribuição das tarefas, o framework MapReduce realiza um processo chamado split dos dados, que faz uma divisão lógica dos blocos de dados utilizados na aplicação. A quantidade de tarefas map é então determinada pela quantidade de splits.

A partir dessa divisão, um processo do MapReduce inicia a distribuição das tarefas map entre servidores do cluster. O algoritmo da classe map é então executado pelas tarefas, que deverão gerar como resultado um par chave-valor, sendo a chave uma palavra e o valor o número 1.

Perceba que somente com o resultado da fase map não sabemos ainda a quantidade total de ocorrências das palavras, pois elas estão distribuídas entre as tarefas. Para chegarmos a esse valor, no processo de ordenação é gerada uma lista de todos os valores para cada chave. Nesse caso, para cada palavra.

Por fim, as tarefas reduce iteram sobre as listas de valores, gerando como resultado final um arquivo contendo em cada linha uma palavra (chave) e a quantidade de vezes que a palavra foi encontrada no texto (valor). No nosso exemplo, a palavra "Cloud" foi encontrada 4 vezes, a palavra "IoT" 2 vezes e a palavra "Java" 3

vezes.

O algoritmo de contagem de palavras é apenas um exemplo básico de aplicação no formato MapReduce. Esse modelo permite desde a implementação de operações básicas até a construção de soluções complexas, como por exemplo, as que utilizam mecanismos de aprendizado de máquina. O maior desafio está na capacidade do desenvolvedor se adaptar às regras de negócio para serem executadas no estilo map e reduce.

Um dos diferenciais do MapReduce que o tornou adequado para soluções de Big Data foi a estratégia de localidade dos dados. Como a transferência de dados de grande volume resultam em congestionamento da rede e, consequentemente, em baixo desempenho da aplicação, em vez de transferir os dados para onde as tarefas map e reduce deverão ser executadas (como ocorre na maioria das aplicações distribuídas), no MapReduce as tarefas é que são transferidas para onde os dados estão armazenados. Isso reduz drasticamente o consumo de dados transferidos pela rede.

A utilização do Hadoop por grandes organizações contribuiu para sua rápida evolução, tanto em aperfeiçoamento quanto em adição de novas funcionalidades. Como resultado, novos subprojetos foram criados no topo dos componentes principais do Hadoop, criando um ecossistema com diversas soluções de manipulação de dados.

A figura a seguir apresenta uma lista não exaustiva de subprojetos, representando a evolução do ecossistema Hadoop no decorrer dos anos:

Documentos relacionados