Baixe o app para aproveitar ainda mais
Prévia do material em texto
INTRODUÇÃO A BIG DATA E INTERNET DAS COISAS Sandra Rovena Frigeri Introdução ao Hadoop Objetivos de aprendizagem Ao final deste texto, você deve apresentar os seguintes aprendizados: Descrever o Hadoop e sua utilização. Resumir as características do Hadoop. Analisar o Map Reduce. Introdução As pessoas ao redor do mundo geram, diariamente, grandes volumes de dados, alguns estruturados e outros não. Esses dados são uma va- liosa fonte de informações, mas analisá-los eficientemente ainda é um desafio, pois os mecanismos tradicionais de gerenciamento de dados não disponibilizam o suporte adequado para a realização dessa tarefa. O Apache Hadoop é um framework para o armazenamento e proces- samento de Big Data. Ele possui ferramentas para armazenar e recuperar grandes volumes de dados distribuídos e para realizar o processamento distribuído, garantindo escalabilidade e disponibilidade e possibilitando a ex- tração de conhecimento útil a partir de análises e cruzamentos desses dados. Grandes corporações já utilizam o Hadoop e o consideram uma fer- ramenta eficaz e que traz bons resultados. Portanto, é um recurso que precisa ser conhecido pelos profissionais da área de computação. Neste capítulo, você vai conhecer os fundamentos do Apache Ha- doop, identificando seus componentes, características, vantagens e apli- cações. Além disso, você verá como o MapReduce, que é responsável pelo processamento distribuído, é utilizado com o Hadoop. Hadoop Armazenar, manipular e analisar dados são tarefas convencionais para siste- mas computacionais, mas tomam outra dimensão quando o volume de dados alcança a dimensão de petabytes diários. Esses dados são gerados por sistemas C16_Introducao_Hadoop.indd 1 10/01/2019 10:39:17 corporativos, serviços, sistemas web, mídias sociais, comércio eletrônico, etc. Todos são potencialmente valiosos e há muito interesse em extrações de informações que podem ser obtidas a partir de análises e cruzamentos desses dados. Boa parte deles não está armazenada de forma estruturada e têm os mais diversos formatos e estruturas, que, muitas vezes, não são compatíveis. O alto valor agregado da empresa Google não se deve apenas ao seu potente algoritmo de busca na web ou a suas inúmeras ferramentas, mas, também, à enorme quantidade de informações que mantém sobre seus usuários e buscas realizadas na web. A análise desses dados permite identificar padrões de comportamentos e correlações entre perfis de usuários, e isso é extremamente útil. Portanto, essas informações não são valiosas apenas para a Google, já que também podem ser comercializadas. O termo Big Data não se refere apenas ao volume de dados, mas, também, à sua diversidade de formatos (estruturados ou não), à variedade de fontes e à velocidade para processá-lo. Já as aplicações Big Data são soluções compu- tacionais que possibilitam a análise de grandes bases de dados, processando algoritmos que permitam identificar correlações entre os dados para mapear padrões e comportamentos, conhecidos ou inéditos. A partir disso, torna-se possível criar estratégias ou disponibilizar produtos e serviços. Essas aplicações têm seu poder de processamento limitado pelo poder compu- tacional das máquinas atuais, pois podem utilizar horas ou muitos dias para obter os resultados desejados. Mesmo a evolução contínua dos recursos computacionais é insuficiente para atender ao crescimento da complexidade desse tipo de aplicação. Como alternativa ao processamento convencional, tem-se a computação paralela e distribuída, que pode ser realizada por meio de clusters (grades) de computadores a um custo relativamente baixo. A ideia básica é dividir cada tarefa em subtarefas, que serão executadas paralelamente em diversos computa- dores. Porém, essa tarefa não é trivial, pois exige o adequado dimensionamento das subtarefas, além de ser necessário tratar questões como o balanceamento de carga e escalonamento das tarefas, visando maximizar a utilização dos recursos computacionais e garantindo alternativas de recuperação em situações de falha de computadores que estão alocados para realizar o processamento. Para atender a esse tipo de demanda é que foi projetado o Apache Hadoop, um framework que promove um processamento muito mais rápido que outras Introdução ao Hadoop2 C16_Introducao_Hadoop.indd 2 10/01/2019 10:39:17 tecnologias e que simplifica o trabalho com sistemas distribuídos, tornando transparentes diversas funções, tais como a disponibilidade dos nós do cluster, escalabilidade da aplicação, integridade dos dados e recuperação em caso de falhas. Além disso, ele possui um sistema de licenciamento flexível, que torna possíveis modificações e redistribuição do programa-fonte. Isso permitiu o surgimento de inúmeras implementações derivadas dele com novas funcionalidades ou que se especializam em algum nicho de mercado, além de agregar serviços aos que desejam utilizar seus recursos. Amazon Web Service, Cloudera, Hortonworks, KarmaSphere, Pentaho e Tresada são exemplos de empresas que customizaram o Apache Hadoop e oferecem serviços de implantação, suporte e treinamento. Quando se precisa de alto desempenho em processamento de grande volume de dados, o Apache Hadoop é indicado como uma das melhores ferramentas. Veja, a seguir, alguns benefícios que a sua utilização apresenta: Código aberto: o projeto Apache Hadoop possui uma comunidade composta por desenvolvedores independentes e empresas engajadas no desenvolvimento de suas funcionalidades, melhorias contínuas, além de cuidarem de sua documentação. É uma comunidade ágil, que rapidamente resolve falhas que são encontradas e que disponibiliza continuamente novos recursos. Baixo custo: ao optar pela utilização do Hadoop, você já economiza por não ser necessário adquirir licenças (software livre). Além disso, pela sua forma de processamento, é possível utilizar computadores e redes convencionais para realizar o processamento dos dados, não sendo necessário fazer investimento em hardwares específicos. Por fim, tem-se a possibilidade de alugar os serviços em nuvem, como a Amazon Elastic MapReduce (EMR), em que se pode alugar um conjunto de máquinas virtuais ou pagar pelo tempo de processamento. Robustez: o Hadoop oferece estratégias automáticas para garantir o pro- cessamento em caso de falhas em computadores alocados para o proces- samento, garantindo sua continuidade. Para isso, ele realiza replicação de dados, armazenamento de metadados e de informações de processamento. 3Introdução ao Hadoop C16_Introducao_Hadoop.indd 3 10/01/2019 10:39:17 Escalabilidade: para o Hadoop, é relativamente simples aumentar a quantidade de máquinas a serem utilizadas no processamento. Isso é feito com pequenas alterações em um arquivo de configuração e não exige a reescrita do código-fonte. Os ajustes ficam limitados ao espaço em disco e à capacidade de processamento dos computadores alocados. Simplicidade: ao usar o Hadoop, as operações são especificadas por funções de mapeamento (Map) e de junção (Reduce). Assim, é possível manter o foco na abstração do problema e sua resolução pelo modelo de programação MapReduce. Dessa forma, não é necessário se preocupar com a computação paralela (balanceamento de carga, tolerância a falhas e escalonamento). Um software que possui código aberto deve garantir quatro liberdades aos seus usuários: liberdade de execução: o programa pode ser executado com qualquer propósito; liberdade de análise: o programa pode ser livremente estudado, para que seja entendido o seu funcionamento e projetadas adaptações; liberdade de redistribuição: o programa pode ser copiado e redistribuído, tanto em sua versão original quanto na adaptada; liberdade de modificação: o programa pode ser modificado e as modificações podem ser distribuídas, de modo que toda a comunidade tenha acesso e possa se beneficiar. O Apache Hadoop é um framework que ainda está amadurecendoe está em constante evolução, de modo que ainda existem características que podem ser melhoradas. Uma fragilidade dele é o uso de um único nó mestre, pois essa cen- tralidade pode limitar a escalabilidade ou tornar-se crítica em caso de falha. Outra questão frágil é a dificuldade em gerenciar os dados resultantes do processamento paralelo, pois sua depuração é morosa e complexa em algumas situações. Há situações em que o Hadoop não é a alternativa adequada, como as apresentadasa seguir: Problemas não paralelizáveis ou com grande dependência entre os dados: para que se possa obter um bom resultado com o Hadoop, deve ser possível distribuir os dados e paralelizar seu processamento, mas há situações em que isso não é possível. Processamento de arquivos pequenos: o Hadoop foi desenvolvimento para trabalhar com grandes volumes de dados, e o processamento adicional que realiza é pequeno nessas situações. Porém, se os dados Introdução ao Hadoop4 C16_Introducao_Hadoop.indd 4 10/01/2019 10:39:17 são poucos, o custo adicionado pela divisão e junção de tarefas, comu- nicação, rotinas e processamento pode ser proporcionalmente grande. Problemas com muito processamento em poucos dados: o foco do Hadoop é trabalhar com simplicidade, de modo que o ideal é trabalhar com funções que possam ter sua complexidade reduzida e subtarefas cada vez mais simples. Porém, isso nem sempre é possível, então pro- blemas que possuam regras complexas e/ou com fluxo de execução extenso não são adequados ao uso do Hadoop. Componentes do Hadoop O trabalho do Hadoop utiliza cinco processos: NameNode, DataNode, Seconda- ryNameNode, JobTracker e TaskTracker. NameNode, DataNode, SecondaryNa- meNode são integrantes do modelo de programação MapReduce. Já JobTracker e TaskTracker fazem parte do sistema de arquivo HDFS. Os componentes Name- Node, JobTracker e SecondaryNameNode são únicos para toda a aplicação; por outro lado, DataNode e JobTracker são instanciados para cada computador alocado. NameNode: localiza-se no nó mestre, juntamente ao JobTracker, e é responsável pelo gerenciamento dos arquivos utilizados pelo HDFS (Hadoop Distributed File System). Ele mantém seus dados em memória, por questões de performance, pois frequentemente precisa mapear a localização de arquivos, dividi-los em blocos, encaminhando-os aos nós escravos, além de gerenciar os metadados e réplicas dos arquivos. DataNode: localiza-se nos nós; são os dados que são distribuídos e replicados. Cada DataNode reporta-se ao NameNode, indicando quais blocos guarda e as atualizações realizadas neles. JobTracker: controla o plano de execução das tarefas do MapReduce, designa quais nós serão utilizados no processamento e os monitora. TaskTracker: executa uma tarefa Map ou uma tarefa Reduce que lhe for designada. Cada TaskTracker executa em uma máquina virtual e pode-se ter várias máquinas virtuais em um único computador físico, utilizando melhor os seus recursos. SecondaryNameNode: auxilia o NameNode e é a alternativa para recuperação em caso de falha. Ele verifica os pontos de checagem (checkpointing) para garantir a sua recuperação. 5Introdução ao Hadoop C16_Introducao_Hadoop.indd 5 10/01/2019 10:39:17 Na Figura 1, você pode ver os processos da arquitetura Hadoop e suas ligações. O primeiro é a aplicação, que contém o NameNode, o JobTracker e, possivelmente, o SecondaryNameNode. Já o segundo representa cada ins- tância, ou seja, cada nó, e contém TaskTracker e um DataNode, vinculados, respectivamente, ao JobTracker e ao NameNode do nó mestre. A aplicação se conecta ao nó mestre e inicia a sua execução. A partir disso, o JobTracker gera o plano de execução e determina a quantidade e quais nós escravos processarão os dados. Em paralelo, o NameNode armazena e gerencia as informações dos arquivos. Nos nós (escravos), o TaskTracker executa as tarefas a ele atribuídas, Map ou Reduce, e o DataNode gerencia os blocos de arquivos. Eles também se comunicam com o nó mestre. Em paralelo, o SecondaryNameNode registra checkpoints do log do NameNode. Figura 1. Componentes do Hadoop. Fonte: Adaptada de Dean e Ghemawat (2004). Execução do Hadoop O Hadoop foi construído para trabalhar com um conjunto de máquinas, mas permite outras formas de execução: modo local (standalone mode), modo pseudo-distribuído (pseudo-distributed mode) e modo completamente distribu- ído ( fully distributed mode). A especifi cação do modo de execução é defi nida na confi guração dos arquivos: core-site.xml, hdfs-site.xml e mapred-site.xml. Introdução ao Hadoop6 C16_Introducao_Hadoop.indd 6 10/01/2019 10:39:18 Modo local: é o modo padrão; assim, os parâmetros dos arquivos de configuração já estarão prontos. É recomendado utilizar esse modo nas fases iniciais do desenvolvimento, quando se tem mais erros e são necessários muitos testes. Nesse modo, todo o processamento da aplicação é executado apenas na máquina local. Modo pseudo-distribuído: nesse modo, a aplicação é processada em modo local, que será um cluster de uma máquina só. Esse modo permite a sua simulação, pois utiliza todos os processos de uma execução pa- ralela efetiva (Figuras 2 e 3). Além dessas configurações, é necessário indicar a localização do SecondaryNameNode e dos nós escravos. Essa localização é dada pelo endereço de rede ou pelo apelido desses recursos nos respectivos arquivos masters e slaves. No modo pseudo-distribuído, é simulada uma execução distribuída; dessa forma, para esse modo, esses locais serão sempre os mesmos. Figura 2. Configuração do arquivo core-site.xml no modo pseudo-distribuído. Figura 3. Configuração do arquivo hdfs-site.xml no modo pseudo-distribuído. 7Introdução ao Hadoop C16_Introducao_Hadoop.indd 7 10/01/2019 10:39:18 Modo completamente distribuído: utiliza um cluster de computador real. Nessa opção, é necessário definir os parâmetros específicos e a localização do SecondaryNameNode e dos nós escravos. Também é necessário indicar quais máquinas irão efetivamente executar cada componente, indicando o seu endereço IP. HDFS O Hadoop Distributed File System é o sistema de arquivos distribuídos do Ha- doop que possui um conjunto de funções como: armazenamento, organização, nomeação, recuperação, compartilhamento, proteção e permissão de acesso aos arquivos. Além de prover funções tradicionais de gerenciamento de arquivos, precisa prover a distribuição dos dados de forma transparente, garantindo efi ci- ência e escalabilidade. Tudo isso deve ser transparente e não exigir conhecimento adicional para operá-lo. Um sistema de arquivos distribuído deve garantir: Segurança: garantir o acesso às informações, cuidando do controle de privacidade e gerenciando as permissões de acesso. Tolerância a falhas: garantir a disponibilidade do sistema em casos de falhas. Integridade: controlar as modificações realizadas conforme permissões. Consistência: garantir que o dado visto seja o mesmo para todos. Desempenho: o desempenho do sistema de arquivos distribuído deve ser alto. Existem muitas implementações de sistemas de arquivos distribuídos, algumas co- merciais e outras de software livre, tais como: GNU Cluster File System (GlusterFS), da empresa Red Hat; Moose File System (MooseFS), desenvolvido pela Gemius SA; Lustre, originário da Carnegie Mellon University, atualmente é mantido pela Sun Microsystems; CODA, também desenvolvido na Carnegie Mellon University; General Parallel File System (GPFS) e OpenAFS, da IBM, esse último derivado do Andrew File System (AFS), que também foi desenvolvido na Carnegie Mellon University; e os mais conhecidos, Network File System (NFS) e Google File System (GFS). Introdução ao Hadoop8 C16_Introducao_Hadoop.indd 8 10/01/2019 10:39:18 O HDFS é integrado ao framework do Hadoop, teve forte inspiração no GFS da Google, mas se diferencia por ser de código aberto e implementado na linguagem Java. O HDFS tambémoferece suporte ao armazenamento e ao processamento de grandes volumes de dados em agrupamentos de computadores heterogêneos. O número de máquinas utilizadas em um HDFS é uma grandeza diretamente proporcional à probabilidade de uma dessas máquinas vir a falhar, ou seja, quanto mais máquinas, maior a chance de acontecer algum erro em uma delas. Comandos HDFS Para iniciar os trabalhos em um aglomerado Hadoop, é necessário formatar o HDFS no intuito de prepará-lo para receber os dados de sua aplicação. Essa ação pode ser realizada por meio do comando hadoop namenode -format, executado na máquina em que se encontra o NameNode. Embora possa ser manipulada por diversas interfaces, uma das formas comumente utilizada para manipular o HDFS é por linha de comando. Nessa interface, é possível realizar várias operações, como leitura, escrita, exclusão, listagem, criação de diretório, etc., com comandos similares aos do Linux, mas iniciados pelo prefi xo “hadoop fs”. A sintaxe dos comandos segue a seguinte estrutura: hadoop fs -comando [argumentos]. A listagem, a explicação e os argumentos válidos para todos os comandos do HDFS podem ser consultados executando o seguinte comando: hadoop fs -help. Antes de iniciar uma aplicação Hadoop no modo pseudo-distribuído ou completamente distribuído, é necessário que os dados que serão utilizados já estejam armazenados no HDFS. Dessa forma, o usuário precisa copiar os arquivos de dados da sua máquina local para o HDFS. No exemplo a seguir, está explicitado o comando para carregar no HDFS o arquivo meuarquivo.txt. hadoop fs -put meuarquivo.txt /user/hadoop_user Nesse exemplo, foi utilizado o comando -put e informados como parâmetros o nome do arquivo e o diretório user/hadoop_user, para o qual ele será adicionado. Por padrão, o HDFS possui um diretório com o nome do usuário dentro do diretório /user. Nesse exemplo, o usuário é o hadoop_user. Se o usuário desejar criar outros diretórios, o comando que realiza essa ação é o mkdir, conforme exemplo a seguir, em que será criado o diretório arquivos_hadoop. hadoop fs –mkdir arquivos_hadoop 9Introdução ao Hadoop C16_Introducao_Hadoop.indd 9 10/01/2019 10:39:18 Nesse caso, não foi mencionado o caminho completo do local no qual o diretório deverá ser criado; assim, quando essa informação for omitida, o arquivo será armazenado no diretório padrão user/hadoop_user. Portanto, o caminho completo para acesso dos arquivos inseridos no diretório arqui- vos_hadoop será user/hadoop_user/arquivos_hadoop. Para listar todos os arquivos e diretórios contidos no diretório raiz, que, no caso, é /user/hadoop_user, executamos o seguinte comando: hadoop fs –ls Para listar arquivos, diretórios e os subdiretórios, deve-se acrescentar o comando de recursividade, como no exemplo a seguir: hadoop fs -lsr A partir do momento em que os arquivos estão armazenados no HDFS, já são passíveis de serem submetidos ao processamento de uma aplicação Hadoop. Se, após a execução, for necessário copiar novamente os arquivos ao sistema local, isso poderá ser feito pelo comando -get, conforme o seguinte exemplo: hadoop fs -get meuarquivo.txt localfile Nesse exemplo, após o comando, como primeiro argumento, deve ser passado o nome do arquivo que se deseja copiar do HDFS, com o seu respectivo caminho. O segundo parâmetro é o diretório local no qual se deseja colocar o arquivo copiado. Como é possível ver, a interface de linha de comando pode ser utilizada sem muita dificuldade, principalmente para os conhecedores de Linux. Entre- tanto, caso essa interface não seja adequada, o usuário pode optar por outras alternativas providas pelo HDFS, podendo até mesmo usar a API Java para realizar essa manipulação. Perceba que em nenhum momento falamos de comandos específicos para um sistema de arquivos distribuídos, como para tratar tolerância a falhas, balanceamento de carga e disponibilidade, pois são todas ações tratadas pelo próprio arcabouço. Divisão em blocos Grandes arquivos não podem ser armazenados em um único disco e, por isso, precisam ser divididos e distribuídos em um cluster de computadores. Essa questão estrutural relativa à distribuição dos arquivos é feita de forma implícita, Introdução ao Hadoop10 C16_Introducao_Hadoop.indd 10 10/01/2019 10:39:18 devendo apenas o desenvolvedor apontar corretamente os parâmetros de con- fi guração. O HDFS adota a estratégia de que, antes de armazenar os arquivos, esses sejam submetidos a um procedimento de divisão em uma sequência de blocos de tamanho fi xo. O tamanho padrão defi nido no framework é 64 Mb, mas ele pode ser alterado. Somente depois de dividido é que esses arquivos são distribuídos para os diversos nós escravos. Arquitetura O HDFS possui uma arquitetura mestre/escravo: no lado mestre, tem uma ins- tância do NameNode e, em cada escravo, uma instância do DataNode. É possível ter centenas ou milhares de máquinas escravas. O NameNode é o componente central do HDFS; assim, é recomendável ser implantado em um nó exclusivo, e, preferencialmente, o nó com melhor desempenho. Para desempenhar seu papel de gerenciar todos os blocos de arquivos, o NameNode possui duas estruturas de dados importantes: o FsImage e o EditLog. O primeiro arquivo é o respon- sável por armazenar informações estruturais dos blocos, como o mapeamento e namespaces dos diretórios e arquivos, e a localização das réplicas desses arquivos. O segundo, EditLog, é um arquivo de log responsável por armazenar todas as alterações ocorridas nos metadados dos arquivos. Ao iniciar uma instância do NameNode, suas tarefas iniciais são: realizar a leitura do último FsImage e aplicar as alterações contidas no EditLog. Ter- minada essa operação, o estado do HDFS é atualizado e o arquivo de log é esvaziado para manter apenas as novas alterações. Esse procedimento ocorre somente quando o NameNode é iniciado, e, por tal motivo, passado muito tempo de sua execução, o EditLog tende a ficar muito extenso e pode afetar o desempenho do sistema ou, ainda, acarretar muitas operações na próxima inicialização do NameNode. Para que isso não ocorra, existe um componente assistente ao NameNode chamado SecondaryNameNode. Mesmo não sendo exatamente um backup do NameNode, no caso de que esse venha a ser interrompido, uma solução é tornar o SecondaryNameNode o NameNode primário, como uma forma de prevenção de interrupção do sistema. O SecondaryNameNode tem como principal função realizar a junção entre o FsImage e EditLog, criando pontos de checagem, de modo a limpar o arquivo de log. Essa operação é feita em intervalos de tempo definidos na configuração do sistema. Dessa forma, como o SecondaryNameNode não é atualizado em tempo real, esse atraso poderia ocasionar a perda de dados. Enquanto o nó mestre é o responsável por armazenar os metadados dos arquivos, os nós escravos são os responsáveis pelo armazenamento físico dos 11Introdução ao Hadoop C16_Introducao_Hadoop.indd 11 10/01/2019 10:39:18 dados. São nesses escravos que temos os DataNodes. Em uma aplicação Hadoop, cada nó escravo contém um DataNode, que trabalha com um TaskTracker — o primeiro é para armazenamento e o segundo, para processamento dos dados. A primeira comunicação entre o mestre e o escravo ocorre quando o Da- taNode é registrado no NameNode, que pode ocorrer no momento da inicia- lização ou quando esse for reinicializado. Todo esse procedimento de registro é armazenado no arquivo FsImage do NameNode. Após essa interação, o DataNode precisa, ainda, periodicamente, comunicar-se com o NameNode, enviando informações estatísticas dos blocos que está armazenando, bem como informações de suas alterações locais. São nesses momentos de interação que se torna possível ao NameNode definir quais nós deverão armazenar quais blocos. Se o NameNode não conseguir receber informações do DataNode, é solicitado que esse DataNode seja novamente registrado. Replicação de dados Além dedividir os arquivos em blocos, o HDFS ainda replica esses blocos na tentativa de aumentar a segurança. Por padrão, um bloco do HDFS possui três réplicas alocadas em diferentes nós, e essa quantidade pode ser confi gurada. Ainda existe uma recomendação, por questão de confi abilidade e desempenho, de alocar duas réplicas no mesmo armário, mas em nós distintos, e a outra réplica em um armário diferente. Como tipicamente a velocidade de comunicação entre máquinas de um mesmo rack é maior que em racks diferentes, por questão de desempenho, no momento de selecionar uma réplica para ser substituída em um processo, o HDFS dá preferência à réplica pertencente ao mesmo rack. O maior benefício com a replicação é a obtenção de maior tolerância a falhas e confi abilidade dos dados, pois, no caso de um nó escravo vir a falhar, o processamento passará a ser feito por outra máquina que contenha a réplica desse bloco, sem haver a necessidade de transferência de dados e a interrupção da exe- cução da aplicação. Tudo isso é feito de forma transparente, pois o Hadoop oferece mecanismos para reiniciar o processamento sem que os demais nós percebam a falha ocorrida. No contexto de uma falha, ocorrerá uma diminuição da quantidade de réplicas de um bloco. Então, para retomar Introdução ao Hadoop12 C16_Introducao_Hadoop.indd 12 10/01/2019 10:39:18 a sua margem de confi abilidade, o NameNode consulta os metadados sobre os DataNodes falhos e reinicia o processo de replicação em outros DataNodes para garantir o seu fator mínimo. Hadoop MapReduce O paradigma de programação MapReduce implementado pelo Hadoop se inspira em duas funções simples (Map e Reduce) presentes em diversas linguagens de programação funcionais. Uma das primeiras linguagens a implementar os con- ceitos dessas funções foi LISP. Essas funções podem ser facilmente explicadas de acordo com suas implementações originais, conforme mostram os exemplos a seguir, em que serão usados pseudocódigos para ilustrar tais funções. A função Map recebe uma lista como entrada e, aplicando uma função dada, gera uma nova lista como saída. Um exemplo simples é aplicar um fator multiplicador a uma lista, por exemplo, dobrando o valor de cada elemento: map({1,2,3,4}, (x2)) > {2,4,6,8} Nesse exemplo, para a lista de entrada {1,2,3,4}, foi aplicado o fator mul- tiplicador 2, gerando a lista {2,4,6,8}. Veja que a função é aplicada a todos os elementos da lista de entrada. Logo, cada iteração na lista de entrada vai gerar um elemento da lista de saída. A função de mapeamento no exemplo dado poderia chamar-se “dobro”. A chamada com a função dobro pode ser expressa como: map({1,2,3,4}, dobro) > {2,4,6,8} A função Reduce, similarmente à função Map, vai receber como entrada uma lista e, em geral, aplicará uma função para que a entrada seja reduzida a um único valor na saída. Algumas funções do tipo Reduce mais comuns seriam “mínimo”, “máximo” e “média”. Aplicando essas funções ao exemplo, temos as seguintes saídas: reduce({2,4,6,8}, mínimo) > 2 reduce({2,4,6,8}, máximo) > 8 reduce({2,4,6,8}, média) > 5 13Introdução ao Hadoop C16_Introducao_Hadoop.indd 13 10/01/2019 10:39:18 No paradigma MapReduce, as funções Map e Reduce são utilizadas em con- junto e, normalmente, as saídas produzidas pela execução das funções Map são utilizadas como entrada para as funções Reduce. Associando as funções dos exem- plos apresentados, pode-se expressar o seguinte conjunto de funções aninhadas: reduce(map({1,2,3,4}, dobro), mínimo) > 2 reduce(map({1,2,3,4}, dobro), máximo) > 8 reduce(map({1,2,3,4}, dobro), média) > 5 Google MapReduce O paradigma de programação MapReduce demonstrou ser adequado para trabalhar com problemas que podem ser particionados ou fragmentados em subproblemas. Isso porque se pode aplicar separadamente as funções Map e Reduce a um conjunto de dados. Se os dados forem sufi cientemente grandes, podem ainda ser particionados para a execução de diversas funções Map ao mesmo tempo, em paralelo. Essas características despertaram a atenção ao paradigma, que entrou em evidência novamente quando foi implementado pela Google, utilizando os conceitos de programação paralela e distribuída: As funções Map e Reduce deixaram de ser restritas ao paradigma de programação funcional, sendo disponibilizadas em bibliotecas Java, C++ e Python. O MapReduce foi introduzido na computação paralela e distribuída. Isso foi feito pela explícita retroalimentação dos resultados da função Map como entrada para a função Reduce, conforme os exemplos anteriores. A abordagem permite que os dados distribuídos ao longo dos nós de um aglomerado sejam utilizados nas funções Map e Reduce quando necessário. No Google MapReduce (Figura 4), é aplicada uma função Map em um conjunto de valores e utilizada a sua saída para aplicar a função Reduce, gerando a saída final. Essa abordagem adota o princípio de abstrair toda a complexidade da paralelização por meio das funções Map e Reduce. A ideia simples dessas funções é eficaz para a resolução de problemas para programação paralela, uma vez que tanto Map quanto Reduce são funções sem estado associado e, portanto, facilmente paralelizáveis. Introdução ao Hadoop14 C16_Introducao_Hadoop.indd 14 10/01/2019 10:39:19 Figura 4. Modelo MapReduce implementado pela Google. Fonte: Adaptada de Dean e Ghemawat (2004). O Hadoop MapReduce pode ser visto como um paradigma de programação que expressa computação distribuída como uma sequência de operações distri- buídas em conjuntos de dados. Para tal, a base de uma aplicação MapReduce consiste em dividir e processar esses dados com o uso das funções Map e Reduce. As funções Map utilizam os blocos dos arquivos armazenados com entrada. Os blocos podem ser processados em paralelo em diversas máquinas do aglomerado. Como saída, as funções Map produzem, normalmente, pares chave/valor. As funções Reduce são responsáveis por fornecer o resultado final da execução de uma aplicação, juntando os resultados produzidos por funções Map. Essa composição denota claramente como o Apache Hadoop tomou proveito das melhores características do Google MapReduce. Quando aplicado ao ambiente distribuído, como em um cluster de com- putadores, o Hadoop MapReduce executa um conjunto de funções Map e Reduce definidas pelo usuário. Essas funções são denominadas tarefa pelo Hadoop. A computação é distribuída e controlada pelo arcabouço, que utiliza o seu sistema de arquivos (HDFS) e os protocolos de comunicação e troca de mensagens para executar uma aplicação MapReduce. O processamento tem três fases: uma fase inicial de mapeamento, em que são executadas diversas tarefas Map; uma fase intermediária, na qual os dados são recolhidos das 15Introdução ao Hadoop C16_Introducao_Hadoop.indd 15 10/01/2019 10:39:19 funções Map, agrupados e disponibilizados para as tarefas de Reduce; e uma fase de redução, em que são executadas diversas tarefas Reduce para agrupar os valores comuns e gerar a saída da aplicação. Os dados utilizados na fase de mapeamento, em geral, devem estar armaze- nados no HDFS. Dessa forma, os arquivos contendo os dados serão divididos em um número de blocos e armazenados no sistema de arquivos. Cada um desses blocos é atribuído a uma tarefa Map. A distribuição das tarefas Map é feita por um escalonador, que escolhe quais máquinas executarão as tarefas. Isso permite que o Hadoop consiga utilizar praticamente todos os nós do aglo- merado para realizar o processamento. Ao criar uma função Map, o usuário deve declarar quais dados contidos nas entradas serão utilizados como chaves e valores. Ao ser executada, cada tarefa Map processa pares de chave/valor. Após o processamento, a tarefa produz um conjunto intermediário de pares chave/valor. De maneira mais genérica, para cada par de chave/valor (k1, v1), a tarefa Map invoca um processamento definido pelo usuário, que transforma a entrada em um par chave/valor diferente(k2, v2). Após a execução das tarefas Map, os conjuntos que possuem a mesma chave poderão ser agrupados em uma lista. A geração dessa lista ocorre com a execução de uma função de combinação, opcional, que agrupa os elementos para que a fase intermediária seja realizada de maneira mais eficiente. De maneira genérica, temos: map(k1,v1) →→ list(k2,v2) (I) Após o término das execuções das tarefas de Map, o arcabouço executa uma fase intermediária denominada Shuffle, que agrupa os dados intermediários pela chave e produz um conjunto de tuplas (k2, list(v2)). Assim, todos os valores associados a uma determinada chave serão agrupados em uma lista. Após essa fase intermediária, o arcabouço também se encarrega de dividir e replicar os conjuntos de tuplas para as tarefas Reduce que serão executadas. A fase de Shuffle é a que mais realiza troca de dados (E/S), pois os dados de diversos nós são transferidos entre si para a realização das tarefas de Reduce. Na fase de redução, cada tarefa consome o conjunto de tuplas (k2, lista(v2)) atribuído a ele. Para cada tupla, uma função definida pelo usuário é chamada e transformada em uma saída formada por uma lista de pares chave/valor (k3, v3). Novamente, o arcabouço se encarrega de distribuir as tarefas e fragmentos pelos nós do aglomerado. Esse conjunto de ações também pode ser expresso da seguinte forma: reduce(k2,list(v2)) →→ list(k3,v3) (II) Introdução ao Hadoop16 C16_Introducao_Hadoop.indd 16 10/01/2019 10:39:19 DEAN, J.; GHEMAWAT, S. MapReduce: Simplified Data Processing on Large Clusters. OSDI, 2004. Disponível em: <https://static.googleusercontent.com/media/research.google. com/pt-BR//archive/mapreduce-osdi04.pdf>. Acesso em: 22 dez. 2018. Leituras recomendadas AMARAL, F. Introdução à Ciência de Dados: mineração de dados e big data. Rio de Janeiro: Alta Books, 2016. HEKIMA. O Guia Definitivo de Big Data para Iniciantes. 2017. Disponível em: <http:// www.mettodo.com.br/ebooks/O_guia_definitivo_de_Big_Data_para_iniciantes. pdf>. Acesso em: 22 dez. 2018. HURWITZ, J. et al. Big Data Para Leigos. Rio de Janeiro: Alta Books, 2015. PRAJAPATI, V. Big Data Analytics with R and Hadoop. Birmingham: Packt Publishing, 2013. TAURION, C. Big Data. Rio de janeiro: Brasport, 2013. WHITE, T. Hadoop: The Definitive Guide. Sebastopol: O’Reilly, 2009. Disponível em: <http://barbie.uta.edu/~jli/Resources/MapReduce&Hadoop/Hadoop%20The%20 Definitive%20Guide.pdf>. Acesso em: 22 dez. 2018. 17Introdução ao Hadoop C16_Introducao_Hadoop.indd 17 10/01/2019 10:39:19 Conteúdo:
Compartilhar