Hadoop significa HDFS, YARN, MapReduce e muitas outras coisas. Você quer dizer Spark vs MapReduce ? Porque o Spark é executado no / com Hadoop, que é o ponto.
O principal motivo para usar o Spark é a velocidade, e isso vem do fato de que sua execução pode manter os dados na memória entre os estágios, em vez de sempre persistir no HDFS após um Mapa ou Redução. Essa vantagem é muito acentuada para cálculos iterativos, que têm dezenas de estágios, cada um dos quais tocando os mesmos dados. É aqui que as coisas podem ser "100x" mais rápidas. Para trabalhos simples de ETL de uma passagem para os quais o MapReduce foi projetado, geralmente não é mais rápido.
Outro motivo para usar o Spark é a linguagem de alto nível mais agradável em comparação com o MapReduce. Ele fornece uma visão funcional de programação que imita o Scala, que é muito melhor do que escrever código MapReduce. (Embora você precise usar o Scala ou adotar as APIs Java ou Python um pouco menos desenvolvidas para o Spark). O Crunch e o Cascading já fornecem uma abstração semelhante sobre o MapReduce, mas ainda é uma área em que o Spark é agradável.
Finalmente, o Spark tem subprojetos ainda jovens, mas promissores para ML, análise de gráficos e streaming, que expõem uma API coerente e semelhante. Com o MapReduce, você teria que recorrer a vários outros projetos para isso (Mahout, Giraph, Storm). É bom tê-lo em um pacote, embora ainda não esteja "cozido".
Por que você não usaria o Spark? Parafraseando- me:
- O Spark é principalmente o Scala, com APIs Java portadas; O MapReduce pode ser mais amigável e mais nativo para desenvolvedores baseados em Java
- Agora há mais experiência no MapReduce do que o Spark
- Para as tarefas paralelas de dados, de uma passagem, semelhantes a ETL, que o MapReduce foi projetado, o MapReduce é mais leve em comparação com o equivalente do Spark
- O Spark está bastante maduro e o YARN agora, mas o Spark-on-YARN ainda é bastante novo. Os dois podem ainda não estar perfeitamente integrados. Por exemplo, até recentemente, acho que o Spark não poderia pedir ao YARN alocações com base no número de núcleos? Ou seja: o MapReduce pode ser mais fácil de entender, gerenciar e ajustar