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.
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.
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:
Paradigma de programação MapReduce inflexível
Embora a exposição das interfaces Map e Reduce para programadores tenha simplificado 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 é o processo iterativo. 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.
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.
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.
