MapReduce
O que é MapReduce?
MapReduce é uma estrutura de execução distribuída baseada em Java que faz parte do ecossistema Apache Hadoop. Ele remove a complexidade da programação distribuída ao expor duas etapas de processamento para os desenvolvedores implementarem: 1) Map e 2) Reduce. Na etapa de Mapping, os dados são divididos entre tarefas de processamento paralelo. Cada bloco de dados pode ter lógica de transformação aplicada a ele. Quando essa etapa é concluída, a fase Reduce é executada; e os dados divididos pela etapa Map são agregados. O MapReduce normalmente usa o Hadoop Distributed File System (HDFS) para entrada e saída. Mas existem tecnologias como o Sqoop desenvolvidas com base nele que podem acessar sistemas relacionais.
História do MapReduce
O MapReduce foi desenvolvido no Google em 2004 por Jeffery Dean e Sanjay Ghemawat (Dean & Ghemawat, 2004). Em seu artigo “MapReduce: Simplified Data Processing on Large Clusters”, eles mostram que o MapReduce é inspirado nas funções Map e Reduce comumente usadas em programação funcional. Na época, o próprio sistema MapReduce do Google funcionava com o Google File System (GFS). Em 2014, no entanto, o Google não usava mais o MapReduce como seu principal modelo de processamento de big data. O MapReduce costumava ser a única maneira de recuperar dados armazenados em HDFS. Hoje, existem outros sistemas baseados em query, como o Hive e o Pig, para recuperar dados do HDFS usando comandos semelhantes a SQL que são executados junto com jobs escritos em modelos MapReduce.
Como funciona o MapReduce?
Um sistema MapReduce, que é generalizado como uma combinação de operações/funções Map e Reduce, geralmente consiste em três etapas. Vamos dar uma olhada em cada uma:
- Map: os dados de entrada são divididos em blocos menores. O framework Hadoop determina o número de mappers a serem usados com base no tamanho dos dados a serem processados e nos blocos de memória disponíveis em cada servidor mapper. Em seguida, cada bloco é atribuído a um mapper e processado. Cada nó do “worker” aplica a função Map aos seus dados locais e grava a saída no armazenamento temporário. O nó principal (master) garante que apenas uma cópia dos dados de entrada redundantes seja processada.
- Shuffle, Combine e Partition: os nós do worker redistribuem os dados com base nas chaves de saída geradas pela função Map para que todos os dados pertencentes a uma chave sejam colocados no mesmo nó do worker. Combiner (Reducer), um processo opcional, pode ser executado separadamente em cada servidor mapper para restringir ainda mais os dados de cada mapper, reduzindo o volume de dados e facilitando o embaralhamento e a classificação. Partition não é uma opção, é um processo que determina como os dados são apresentados a um Reducer e atribuídos a um determinado Reducer.
- Reduce: um Reducer não pode ser iniciado enquanto um mapper estiver em andamento. Os nós do worker processam cada grupo de dados de saída do par <key,value> em paralelo e produzem pares <key,value> como saída. Todos os valores de saída de Map com a mesma chave são atribuídos a um Reducer, que agrega os valores para essa chave. Ao contrário da função Map, que requer filtragem e classificação dos dados iniciais, a função Reduce é opcional.
Considerações sobre MapReduce
Paradigma de programação MapReduce inflexível
Embora a exposição das interfaces das operações Map e Reduce para programadores tenha facilitado a criação de aplicativos distribuídos no Hadoop, é difícil expressar uma ampla gama de lógica no paradigma de programação MapReduce. Um exemplo de lógica que não funciona bem com MapReduce é a iteração. Os dados normalmente não são mantidos na memória, e a lógica de iteração é manipulada pelo encadeamento de aplicativos MapReduce, adicionando complexidade.
Leitura/gravação intensiva
Os jobs MapReduce não têm conceito de uma estrutura de memória distribuída para dados do usuário; portanto, muito poucos dados são armazenados na memória, e os dados devem ser lidos e gravados no HDFS. Aplicativos MapReduce mais complexos usam jobs MapReduce menores encadeados. Os dados não podem ser transmitidos entre esses jobs, exigindo compartilhamento de dados via HDFS, o que cria um gargalo de processamento.
Foco em Java
O MapReduce é baseado em Java, portanto, talvez a maneira mais eficiente de escrever um aplicativo MapReduce seja usando Java. Esse código deve ser compilado em um ambiente de desenvolvimento separado e implantado em um cluster Hadoop. Esse estilo de desenvolvimento não é amplamente adotado por analistas de dados e data scientists acostumados a outras tecnologias, como SQL e linguagens interpretadas como Python. O MapReduce tem a capacidade de chamar a lógica Map/Reduce escrita em outras linguagens, como C, Python e Shell Script. No entanto, um processo do sistema deve ser iniciado para lidar com a execução do programa, e essa operação implica a sobrecarga que afeta o desempenho do job.
Eliminar gradualmente as ofertas de big data
MapReduce tende a ser excluído de ofertas que lidam com big data. Algumas distribuições Hadoop ainda incluem MapReduce, mas apenas para oferecer compatibilidade com aplicativos legados. Em vez de criar aplicativos MapReduce, os usuários de big data estão adotando frameworks simples e rápidos, como o Apache Spark.
Para que serve o MapReduce?
Aplicativos legados e ferramentas nativas do Hadoop, como Sqoop e Pig, ainda utilizam o MapReduce hoje. No entanto, o desenvolvimento de aplicações MapReduce é muito limitado e não se pode dizer que tenha feito uma contribuição significativa como tecnologia de código aberto.
Equívocos comuns sobre MapReduce e Spark
- Sobre o MapReduce
- Sobre o Spark
Vantagens do MapReduce
- Escalabilidade
- Flexibilidade
- Segurança e autenticação
- Processamento mais rápido de dados
- Modelo de programação extremamente simples
- Disponibilidade e natureza resiliente
Dicas para melhorar o desempenho do MapReduce
- Ativar modo Uber
- Usar biblioteca nativa
- Aumentar o tamanho do bloco
- Monitorar o tempo gasto pelas tarefas do mapa
- Determinar se a compactação de dados é divisível
- Definir o número de tarefas reduzidas
- Analisar a partição dos dados
- Analisar o comportamento de desempenho da fase Shuffle
- Otimizar código do MapReduce
MapReduce x Databricks Delta Engine
O Databricks Delta Engine é baseado em um mecanismo Apache Spark e C++ chamado Photon. Isso oferece a flexibilidade do processamento DAG não encontrado no MapReduce, a velocidade do processamento na memória e tempos de resposta de query extremamente rápidos com um mecanismo especial compilado nativamente. Os usuários podem interagir com o Databricks Delta Engine usando Python, Scala, R e SQL. Um aplicativo Spark existente pode ser modificado para usar o Delta Engine com uma simples alteração de linha, como especificar “delta” como o formato de dados. MapReduce e HDFS não oferecem suporte nativo à consistência transacional de dados ou à atualização/exclusão de dados existentes no conjunto de dados. O Delta Engine, por outro lado, permite acesso simultâneo aos dados por produtores e consumidores de dados e fornece funcionalidade CRUD completa. E, embora o MapReduce não tenha funcionalidade integrada para lidar com arquivos pequenos, um problema comum em ambientes de big data, o Databricks Delta Engine possui um recurso de autocompactação que otimiza o tamanho dos dados gravados no armazenamento. O comando OPTIMIZE também pode ser usado para compactar o arquivo, se desejado. Os recursos de consistência transacional do Delta permitem que essa operação ocorra enquanto os usuários finais e aplicativos estão acessando os dados.
Cinco alternativas melhores ao MapReduce
- apache spark
- Apache Storm
- Ceph
- Hydra
- Google BigQuery