Apache Hadoop: O poder do processamento paralelo e distribuído

Uma breve introdução do Apache Hadoop, HDFS e MapReduce

Iury Rosal
Data Hackers
12 min readAug 7, 2021

--

Hoje temos o desafio de trabalhar com grandes volumes de dados, com uma variedade considerável de dados e com exigência de velocidade, além de necessitarmos fornecer a garantia da veracidade deles. Estes são os famosos 4 V’s do Big Data, introduzida pela IBM. Como conversamos no artigo “Dados: um briefing executivo”, as empresas hoje necessitam buscar soluções tecnológicas e de engenharia para atuarem neste cenário. O Apache Hadoop é um belo exemplo disso! Neste artigo, iremos introduzir essa ferramenta, destacando alguns pontos do seu funcionamento e ferramentas centrais.

Ecossistema Hadoop. Fonte: DTI

Processamento Paralelo e Distribuído

Imagine você ter 1 único computador para capturar, processar e operar uma gigantesca massa de dados. Você já pode imaginar que terá problemas quanto a velocidade, processamento e custos disso tudo, podendo ocasionar em problemas em outros processos dependentes desse procedimento de dados ou da máquina em operação. E de que forma podemos possibilitar essa operação de forma rápida, prática e com custos mais viáveis? Podemos pegar um conceito bem comum de estrutura de dados: “Divisão e Conquista”, que consiste em pegar o problema e ir dividindo-o em problemas cada vez menores, que são mais simples de serem resolvidos, até, no final, termos a solução completa. Esse conceito é análogo a ideia de pegarmos essa gigantesca massa de dados e dividi-la entre vários computadores independentes entre si, em que cada um irá lidar com uma parte do problema, e depois agruparmos tudo novamente.

Essa ideia foi muito estimulada pelas limitações dos recursos computacionais convencionais que se tornaram muito restritos para acompanhar a crescente exigência computacional e aumento de complexidade para lidar com esses procedimentos de dados. Aqui falamos de computação paralela e distribuída. Esse modelo computacional consiste em clusters, que são um conjunto de computadores convencionais (nós) interligados entre si por uma espécie de rede (network). Com certeza, pegar várias máquinas para trabalharem, de forma paralela e simultânea, pequenos problemas, iremos obter uma grande capacidade de processamento. No entanto, pegar uma tarefa, dividi-la e distribuí-la é uma coisa extremamente complexa. Além do trabalho de realizar a divisão, lidar com todos os erros que podem aparecer no meio desse processo e depois unificar tudo também agrega um desafio computacional e operacional considerável.

Nesse contexto, foi desenvolvido o Hadoop, um framework, implementado em Java, para armazenamento e processamento de grandes quantidades de dados distribuídas em um cluster com máquinas de baixo custo. O framework facilita o trabalho na integridade dos dados, disponibilidade das máquinas, escalabilidade do sistema e recuperação de falhas, sendo totalmente transparente ao usuário.

O Hadoop foi desenvolvido, inicialmente, em 2006, a partir do Yahoo!, se tornando o principal contribuinte em 2007. Nessa época, o fundador do Hadoop era ex-funcionário do Google e tinha contribuído na criação da tecnologia de MapReduce, que melhorava o sistema de busca em termos de velocidade. Em 2008, o Hadoop recebeu constantes atualizações, se tornando um dos principais projetos da Apache Foundation. Em 2009, a Cloudera criou a primeira distribuição comercial que integra várias ferramentas ao ecossistema Hadoop. A partir daí, o Hadoop vem crescendo e se desenvolvendo, tendo a versão 2.0 lançada em 2013, a versão 3.0 em 2018 e a versão 3.2.x em 2019. Por ser Open Source, muitos desenvolvedores e empresas têm contribuído para a melhoria contínua deste framework, sendo um grande beneficio dessa tecnologia.

Mas por que Hadoop? Muitos podem achar que Hadoop é um acrônimo, mas na verdade, não. O criador inicial deu esse nome em homenagem a sua filha, que tinha um elefante de pelúcia amarelo com nome Hadoop. Isso explica até a logo do Hadoop. =)

O Hadoop trouxe vários outros benefícios, como:

  • Economia: por ser open source, tira a necessidade de aquisição de licenças, além de possibilitar o uso de cluster em nuvem (mais barato do que adquirir uma infraestrutura física própria).
  • Escalabilidade: menor trabalho para configuração, independente do número de computadores no cluster do Hadoop.
  • Robustez: oferece mecanismos para recuperação em casos de falhas, evitando grandes danos caso uma máquina sofresse alguma falha durante o processamento do cluster, por exemplo.

No entanto, nem tudo são flores, existem algumas desvantagens no Apache Hadoop. Uma delas é que ele foi desenvolvido para lidar com grandes bases dados, logo colocar Hadoop para lidar com pequenas tarefas e bases de dados, se torna um desperdício de recurso, além de ser menos eficiente do que operar em uma arquitetura convencional. Além disso, na arquitetura do Hadoop, existe um único agente master (Node Master Único), o que se torna um ponto central de falhas perigoso.

O Ecossistema Hadoop

Ao longo do tempo, baseado no crescimento da necessidade de lidar com grandes exigências computacionais, várias ferramentas surgiram para somar ao Hadoop e acabaram se incorporando ao seu ecossistema. Reforço que o Hadoop não é um único elemento, mas sim um conjunto de ferramentas integradas, cada uma com uma finalidade específica. Inclusive, o básico para o Hadoop operar seriam as seguintes ferramentas: o HDFS, YARN e o MapReduce, sendo perfeitamente possível operar com apenas essas ferramentas. A adição das outras ferramentas vai pela necessidade do projeto, sendo que estas tem como base de uso esses componentes centrais. Irei comentar um pouco de algumas ferramentas deste ecossistema:

Ecossistema Hadoop. Fonte: Fema
  • MapReduce: Módulo de processamento de dados.
  • HDFS (Hadoop Distributed File System): Sistema de arquivos distribuídos, voltado para trabalhar em um cluster de computadores (e não em uma única máquina).
  • YARN (Yet Another Resource Negociator): Gerenciador de recursos (memória, CPU, por exemplo) para o Apache Hadoop.
  • Zookeeper: Auxilia na configuração de máquinas no cluster, sincronização de processos distribuídos e fornece serviços de coordenação para aplicações distribuídas de alto desempenho que serão executados em um cluster.
  • Hive: Prover infraestrutura que permita utilizar a linguagem HQL (linguagem de consulta muito similar ao SQL), que permite montar um Data Warehouse sobre o Apache Hadoop.
  • HBase: Banco de dados NoSQL (Não relacional) distribuído e escalável, permitindo armazenar dados sem se preocupar com schema.
  • PIG: Linguagem de alto nível orientada a fluxo de dados com execução em computação paralela. Com ele, você cria um script em linguagem PIG e o compila, posteriormente transformando em um job (tarefa/processo) de MapReduce que será executado no cluster. Isso facilita alguns procedimentos, pois desenvolver diretamente em MapReduce exigirá conhecimento avançado em Python e Java, além da complexidade.
  • Sqoop: Ferramenta de transferência de dados, possibilitando a importação e exportação de dados do HDFS com dados de um banco de dados relacional.
  • Flume: Permite a ingestão (importação) de dados de diversas fontes distintas para o Apache Hadoop, inclusive de arquivos de logs.
  • OOzie: Sistema de gerenciamento de jobs. Qualquer coisa que seja executada no Hadoop é um job, esse job será dividido em tarefas sendo distribuídas nas máquinas do cluster para serem executadas de forma paralela. O OOzie permite gerenciar isso, sem se preocupar com a complexidade dessas divisões e distribuições.
  • Mahout: permite executar modelos de machine learning (aprendizado de máquina) em um cluster, em que os dados estão armazenados em um ambiente distribuído.

Essas são algumas ferramentas do ecossistema, mas existem muitas outras que você pode integrar no ecossistema Hadoop dependendo da sua necessidade. Neste artigo, não conseguirei aprofundar todas elas devido as nossas limitações. Mas quem sabe no futuro eu faça artigos dedicados para cada uma delas☻. Aqui, iremos olhar um pouco mais a fundo para as duas ferramentas principais de operação do Hadoop: HDFS e MapReduce.

HDFS: O sistemas de arquivos do Hadoop

Um sistema de arquivos fornece um conjunto de funcionalidades envolvendo armazenamento, organização, nomeação, recuperação, compartilhamento, proteção e permissões de acesso. O gerenciamento disso deve ser algo transparente e acessível aos usuários, omitindo toda a complexidade da sua estrutura, evitando a exigência de muitos conhecimentos ao usuário para operá-lo. Cada sistema operacional possui seu sistema de arquivos.

Um sistema de arquivos deve se preocupar com os seguintes aspectos:

  • Tolerância a falhas: mecanismos que evitem que o sistema seja interrompido em caso de falhas.
  • Desempenho: suportar usuários simultâneos no sistema, além de ter um bom desempenho nas tarefas que for desempenhar.
  • Consistência: todos os usuários que consultarem um mesmo arquivo, devem ver a mesma coisa.
  • Integridade: garantir integridade do sistema de arquivos, controlando permissões.
  • Segurança: garantindo que o arquivo não seja danificado durante uma transferência ou consulta, além de controle de privacidade e permissões.

◌ Se um sistema de arquivos já tem suas complexidades, imagine além de contar com isso tudo, ter que lidar com essa operação em diversas máquinas dentro de um sistema distribuído e paralelo.

O HDFS é um sistema de arquivos distribuídos integrado ao Hadoop, possuindo características bem similares com outros sistemas de arquivos, mas permitindo o armazenamento e compartilhamento dos arquivos em diferentes hardwares diferentes interligados por uma rede (cluster de computadores). Além disso, ao usuário, deve-se fornecer a capacidade de gerenciar os arquivos como se estes estivessem em uma única máquina local, omitindo toda a complexidade e, ao mesmo tempo, tendo um processamento similar a um sistema tradicional com escalabilidade. Vale lembrar que o HDFS possibilita o trabalho com grandes tamanhos de arquivos, chegando até na casa dos petabytes, que seria inviável armazenar em um sistema de arquivos tradicionais.

Quanto maior o número de máquinas no cluster, maior a probabilidade de alguma máquina falhar durante algum processamento. O HDFS para contornar isso possui o principio de tolerância, detecção e recuperação automática de falhas, evitando que caso uma máquina falhe, durante algum processamento, este afete ou interrompa o cluster como um todo.

Outra complexidade que o HDFS auxilia é na tarefa de armazenar grandes arquivos no cluster (arquivos que dificilmente seriam armazenados em um único disco rígido), dividindo esses grandes arquivos em blocos e distribuindo estes nos computadores do cluster. Todo esse processo ocorre de forma implícita, apenas necessitando ao desenvolvedor a configuração dos parâmetros de execução.

Por padrão, o HDFS ramifica o arquivo em blocos de 128 MB, sendo um tamanho muito superior aos dos sistemas de arquivo tradicionais (que usam blocos de 512 bytes). Após essa divisão, os blocos, que foram gerados, são distribuídos nos nós do cluster. Se um determinado dado não ocupar totalmente espaço do bloco reservado a ele, o HDFS aproveita esse espaço restante para outros dados.

Exemplificação de divisão de um arquivo em blocos no HDFS. Fonte: Dummies

Para aumentar a segurança e a tolerância a falhas, o HDFS lida com um procedimento de replicação dos blocos, durante o processo de divisão do arquivo. Por padrão, cada bloco original terá duas cópias (ou seja, outros dois blocos idênticos a ele). Essas 3 réplicas serão alocadas em diferentes máquinas do cluster. Existe uma boa prática de deixar duas réplicas em máquinas diferentes dentro de um mesmo rack. Um rack são máquinas alocadas em um mesmo espaço físico, interligadas por um comutador (switch), uma estrutura muito comum em um data center.

Exemplo de rack. Fonte: Turbosquid

A 3° réplica fica alocada em um rack diferente. Vale lembrar que isso é recomendável pois duas máquinas em um mesmo rack possuem uma comunicação mais rápida do que duas máquinas em racks distintos. Então, na necessidade de buscar uma réplica para substituição, o HDFS dará preferência para a réplica que esteja em uma máquina no mesmo rack em que a anterior estava. Essa replicação se torna eficiente, já que caso alguma máquina dê problema durante algum procedimento, o HDFS consegue contornar essa situação buscando as réplicas dos blocos daquela máquina em outras máquinas, evitando assim que o sistema seja afetado devido a essa falha. Quando isso ocorre, baseado no armazenamento dos metadados, o HDFS também realiza novamente o procedimento de replicação dos blocos que foram afetados e redistribui eles para manter sua margem de segurança (já que os blocos foram perdidos na máquina que falhou).

Esquematização da replicação de blocos e sua distribuição nos computadores. Fonte: Quora

A arquitetura do HDFS se resume a Arquitetura Master/Worker, tendo no lado mestre o serviço NameNode e, no lado trabalhador, o serviço DataNode. Existe um único computador, que é o master, que gerencia diversos computadores (workers). Existe uma preferência de que o NameNode seja atribuído a melhor máquina (nó) do cluster, tendo melhor desempenho, maior quantidade de memória e uma CPU mais aprimorada. As demais máquinas do cluster assumem o papel de worker.

Arquitetura do HDFS. Fonte: Augusto Oeiras

O NameNode cuida do armazenamento dos metadados dos DataNodes e do gerenciamento dos mesmos. Enquanto, nos workes, os DataNodes cuidam do armazenamento dos dados fisicamente, que trabalham simultaneamente com o TaskTracker, responsável pelo processamento dos dados, ligado ao MapReduce.

A primeira comunicação entre o worker e o master é quando o DataNode é registrado no NameNode, que ocorre durante a fase de inicialização ou quando o NameNode é reinicializado. Após essa iteração, o DataNode precisa periodicamente enviar informações ao NameNode, envolvendo alterações locais e outras informações estatísticas. Caso o NameNode não consiga contato com o DataNode é solicitado sua reinicialização.

MapReduce: Processamento dos Dados

O MapReduce possibilita o processamento em paralelo e distribuído, permitindo que processos sejam executados paralelamente sem a exigência ao programador de linhas de código extra para isso. Para ficar claro o que consiste o MapReduce é basicamente um processo que é executado pelo Hadoop. Este processo transforma os dados brutos maiores em um conjunto de dados menores já voltados para uma finalidade, por exemplo, um consulta. O programa MapReduce é programado pelo usuário, podendo ser implementado em diversas linguagens, como Python. O programa MapReduce possui duas funções:

  • Map (Mapear): realiza o processamento primário dos dados de entrada, tendo a leitura do dado bruto. A entrada dessa função são os blocos dos pedaços de um arquivo, armazenado no HDFS. A saída dessa função são pares de chave e valor (similar ao que encontramos no dicionário).

Após essa fase, o próprio Hadoop realiza o agrupamento desses pares, em uma fase conhecida como shuffing. Esses resultados são gravados em disco rígido.

Uma curiosidade é que o Apache Spark funciona da mesma forma que o MapReduce, a diferença é que nesta fase intermediária, o Spark utiliza memória RAM em vez de disco rígido, o que potencializa o processamento. Então, dependendo da situação, utilizar o Apache Spark em vez do MapReduce pode ser vantajoso…

  • Reduce (Reduzir): A saída da função map, agrupados, é a entrada da função reduce. A função reduce é responsável por fornecer o resultado final de uma aplicação. A saída do reduce é armazenado no HDFS.
Ilustração das fases do procedimento de MapReduce. Fonte: InfoQ

Para exemplificar e entendermos melhor, imagine uma mega base de dados sobre o salário de diversas pessoas residentes no estado do Ceará. Essa base contém as seguintes colunas: ID da pessoa, cidade residente, salário, cargo de ocupação e formação. Essa base, armazenada no Hadoop, está ramificada em diversos blocos distribuídos pelo cluster. Agora queremos realizar uma consulta extraindo o salario médio por cidade do estado. Para isso, desenvolvemos um script em Python com duas funções: uma map e outra reduce. Esse script servirá basicamente para realizar essa consulta, como fossemos lidar em uma máquina convencional, sem se preocupar com a complexidade do cluster.

O Hadoop irá gerar um job (tarefa) baseado nesse script que irá rodar de forma paralela e distribuída em todos os blocos referentes a esse arquivo em todos os computadores do cluster (o Task Tracker auxilia nesse processo, ele se encontram junto ao DataNode dentro dos workers). Neste procedimento, a função map irá capta a coluna cidade (chave) e o salário do individuo residente (valor). Após isso, o próprio Hadoop irá agrupar as mesmas cidades, como se a cidade virasse uma chave única e o conjunto de salários pertencentes virassem um array de valores. Logo em seguida, a função reduce realizará a transformação (cálculo da média). Veja o exemplo a seguir:

1° linha: 01 | Iguatu | 6000 | Analista de Dados | Engenheiro de Computação

2° linha: 02 | Fortaleza | 2000 | Comercial | Administração

3° linha: 03 | Iguatu | 3500 | Analista | Administração

  • Após o map: [Captamos o que interessa]

“Iguatu”: 6000

“Fortaleza”: 2000

Iguatu: 3500

  • Após o Shuffle: [Agrupamento]

“Iguatu”: 6000, 3500

“Fortaleza”: 2000

  • Após o reduce: [Transformação para a resposta final da aplicação]

“Iguatu”: 4750

“Fortaleza”: 2000

◌ Simples, não é? Isso que é bacana, você programa de uma forma simples, focando apenas na consulta desejada, sem se preocupar com complexidades referentes ao processamento paralelo e distribuído. Vale lembrar ainda que temos a figura do Hive, que facilita ainda mais esse processo de consulta, visto que tira a necessidade de você desenvolver, diretamente, scripts MapReduce, incrementando abstrações.

Exemplo de procedimento MapReduce. Fonte: Edupristine

Conclusão

Aqui conseguimos realizar uma breve introdução do Hadoop e de suas duas principais ferramentas que possibilitam sua operação. Deixo meu Linkedin e Instagram (@iuryrosaltech) disponível para quem desejar efetuar contato. Sou também aberto para feedbacks! Forte abraço.

--

--

Iury Rosal
Data Hackers

Analista de Dados @Accenture | Bacharel em Engenharia de Computação @UFC