Dividir um problema por menores até que os problemas individuais possam ser resolvidos independentemente e combiná-los para responder à pergunta original é conhecido como técnica de design do algoritmo de dividir e conquistar . [Veja: Introdução aos algoritmos pelo CLR]
Recentemente, essa abordagem para resolver problemas computacionais, especialmente no domínio de conjuntos de dados muito grandes, foi referida como MapReduce, em vez de dividir e conquistar.
Minha pergunta é a seguinte: O MapReduce é algo além de uma estrutura proprietária que se baseia na abordagem de dividir e conquistar, ou existem detalhes nela que a tornam única em algum aspecto?
algorithms
otto
fonte
fonte
Respostas:
Se você está perguntando sobre a arquitetura MapReduce, é apenas uma técnica de dividir e conquistar . No entanto, qualquer arquitetura útil do MapReduce terá montanhas de outras infra-estruturas para "dividir", "conquistar" e, finalmente, "reduzir" com eficiência o conjunto de problemas. Com uma grande implantação do MapReduce (milhares de nós de computação), essas etapas para particionar o trabalho, calcular alguma coisa e, finalmente, coletar todos os resultados não são triviais. Coisas como balanceamento de carga, detecção de nó morto, salvamento do estado intermediário (para problemas de longa execução), são problemas difíceis por si só.
fonte
O MapReduce é uma estrutura para implementar algoritmos de dividir e conquistar de uma maneira extremamente escalável , distribuindo automaticamente unidades de trabalho para nós em um cluster arbitrariamente grande de computadores e manipulando falhas automaticamente de nós individuais, redistribuindo a unidade de trabalho para outro nó.
Não é um conceito super sofisticado, mas uma infraestrutura muito útil.
fonte
O MapReduce diverge da maioria dos sistemas de divisão e conquista de uma maneira bastante fundamental, mas é tão simples que muitas pessoas quase perdem. O verdadeiro gênio disso é marcar os resultados intermediários.
Em um sistema típico de divisão e conquista (anterior), você divide o trabalho em série, executa pacotes de trabalho em paralelo e mescla os resultados desse trabalho em série novamente.
No MapReduce, você divide o trabalho em série, executa pacotes de trabalho em paralelo e marca os resultados para indicar quais resultados combinam com quais outros resultados. A mesclagem é então serial para todos os resultados com a mesma tag, mas pode ser executada em paralelo para resultados com tags diferentes.
Na maioria dos sistemas anteriores, a etapa de mesclagem se tornou um gargalo para todas as tarefas, exceto as mais triviais. Com MapReduce ele pode ainda ser se a natureza das tarefas exige que todos os fusão ser feito em série. Se, no entanto, a tarefa permitir algum grau de mesclagem paralela de resultados, o MapReduce fornecerá uma maneira simples de aproveitar essa possibilidade. A maioria dos outros sistemas faz uma de duas coisas: executar toda a fusão em série apenas porque pode ser necessário para algumas tarefas ou definir estaticamente a fusão paralela para uma tarefa específica. O MapReduce fornece dados suficientes na etapa de mesclagem para agendar automaticamente o máximo em paralelo possível, garantindo ainda (assumindo que você não cometeu erros na etapa de mapeamento) que a coerência é mantida.
Observe também que no MapReduce, está implícito que todas as etapas podem ser recursivas; portanto, eu posso ter uma etapa de mapeamento inicial que divide uma grande tarefa em cinco tarefas menores que podem ser executadas em paralelo - mas cada uma delas pode (em por sua vez) são mapeados para várias outras tarefas paralelas menores e assim por diante.
Isso leva a uma estrutura em árvore, nos lados do mapeamento e do redutor, para dividir rapidamente uma tarefa grande em partes suficientes para tirar proveito de muitas máquinas.
fonte
O MapReduce não é simplesmente uma técnica de dividir e conquistar, embora pareça assim em muitos exemplos.
Na etapa de mapeamento, você pode e deseja frequentemente fazer uma relação de um para muitos. Portanto, você não está simplesmente se dividindo em casos.
Entre o mapa e reduzir, existe (dependendo da implementação) uma classificação ou uma etapa de hash. A eficiência desta operação é extremamente importante para os requisitos gerais de recursos. Seus detalhes são invisíveis para o programador de aplicativos, mas esta etapa é o coração da estrutura.
A operação de redução é um tipo de mesclagem. O que pode ser considerado uma conquista, mas, na prática, tende a ser "emitir dados para uso posterior" ou "salvar dados em um armazenamento de dados". (Observe que, se você tiver grandes conjuntos de dados, realmente deseja que tudo seja distribuído, incluindo a entrada e os resultados finais. Portanto, um armazenamento de chave / valor distribuído faz sentido como um local para obter a entrada e armazenar a saída.)
fonte