Guia de 5 minutos sobre Spark

A MapR, empresa responsável por uma das principais distribuições Hadoop, traz um ótimo texto sobre as diferenças entre o Spark e o MapReduce, por que é mais fácil desenvolver em Spark, e os cinco principais casos de uso.

Então, o que é o Spark?


Spark é um outro framework de execução. Assim como o MapReduce, que funciona com um sistema de arquivos para distribuir os seus dados através do cluster e processá-los em paralelo.

Ele também tem um conjunto de instruções de um aplicativo escrito por um desenvolvedor. O MapReduce foi codificado a partir do Java. O Spark não suporta apenas Java, mas também Python e Scala, que é uma linguagem mais recente e contém algumas propriedades atraentes para a manipulação de dados.

Quais são as principais diferenças entre o Spark e MapReduce?


O Spark tenta manter tudo na memória, ao passo que o MapReduce mantém os dados em disco, acessando-os quando necessário.

O MapReduce insere barreiras e leva muito tempo para escrever os dados no disco e lê-los de volta. Assim, o MapReduce tende a ser lento e mais trabalhoso.

A eliminação desta restrição faz do Spark mais rápido. Para coisas como motores de SQL, como o Hive, uma cadeia de operações MapReduce é normalmente necessária, e isso requer muita atividade de I/O.

Quando operações similares são executadas no Spark, ele pode manter os dados na memória, sem I/O, para que possa continuar operando mais rapidamente. Isso resulta em melhorias na performance e significa que o Spark está em uma categoria interativa.

Para a gravação de dados, existem alguns benefícios do MapReduce, como a possibilidade de reiniciar após uma falha. Se você estiver executando um trabalho de várias horas, você não vai querer começar de novo do zero.

Para aplicativos no Spark, que são executados em segundos ou minutos, reiniciar é, obviamente, um problema menor.


É mais fácil desenvolver para Spark. Ele é muito mais poderoso e expressivo em termos de como você pode fornecer instruções para dividir os dados.

O Spark tem uma função Map e uma função Reduce, assim como o MapReduce, mas acrescenta outras como Filter, Join e Group-by, por isso é mais fácil desenvolver para Spark.

Na verdade, o Spark prevê lotes de instruções que estão em um nível maior de abstração do que o MapReduce disponibiliza. Você pode pensar mais sobre como você deseja que os dados sejam processados, ao invés de instruir o MapReduce a fazer o que você quer.

Isto pode não parecer tão importante, até você ver o código do MapReduce -WordCount. Este é o código que faz uma contagem de palavras em um arquivo de texto, feito em MapReduce. Tem mais do que 100 linhas de código, nada intuitivas.

O código  equivalente em Spark tem apenas 4 linhas, ao invés de 100. Se você estiver tentando fazer cálculos de risco em Wall Street, qual você vai escolher? A mesma coisa vale para alguém que deseja escrever um novo aplicativo analítico ou um novo mecanismo de consulta. É um acéfalo.

Relacionado com este tema da facilidade de desenvolvimento, o Spark é mais inteligente no que tange a operação dos dados. Ele suporta avaliação lenta. Normalmente, não gosto de nada lento mas, neste caso, a avaliação lenta significa que se você disser ao Spark para operar em um conjunto de dados, ele entende o que você pediu para ele fazer, escreve algum atalho para que ele não se esqueça e depois não faz absolutamente nada. Ele continuará a não fazer nada, até que você pergunte a resposta final.

Por que isso é bom? Porque muitas vezes funciona magicamente. Isto é um pouco parecido com a época em que você estava na escola e sua mãe lhe pede para fazer uma tarefa ("traga-me um pouco de leite para o jantar de hoje à noite"). Sua resposta: dizer que você estava indo fazer, em seguida, continuar fazendo o que você já estava fazendo. Poderia acontecer de sua mãe voltar e dizer que ela não precisava mais ("substituiu por água"). Mágica, o trabalho salvo! Às vezes, o mais lento termina em primeiro lugar.

O Spark é a mesma coisa. Ele espera até que você termine, dando-lhe os operadores e apenas quando você pedir para ele lhe dar a resposta final é que ele vai avaliar, sempre verificando para limitar a quantidade de trabalho que tem que fazer. Suponha primeiro que você pergunte ao Spark para filtrar um petabyte de dados, como por exemplo: encontrar todos os registros de ponto de vendas para a loja de Chicago. Em seguida você pergunta para ele para lhe dar apenas o primeiro resultado.

Isso é uma coisa muito comum de fazer. Por vezes, um analista de dados só quer ver um registro típico para a loja de Chicago. Se o Spark estava rodando explicitamente como você forneceu as instruções, ele iria carregar o arquivo inteiro. Em seguida ele iria filtrar todos os registros de Chicago. De posse de todos eles, ele iria escolher apenas a primeira linha para você.

Isso é um enorme desperdício de tempo e recursos. O Spark, pelo contrário, vai esperar para ver a lista completa de instruções e compreender toda a cadeia. Se você só queria a primeira linha que corresponde ao filtro, o Spark vai apenas encontrar o primeiro registro Chicago POS. Em seguida, ele vai mostrar a resposta e parar. É muito mais fácil filtrar do primeiro tudo e em seguida escolher apenas a primeira linha.

Agora, você poderia escrever seus trabalhos de MapReduce mais inteligentemente para evitar o excesso de uso de recursos. Entretanto, é muito mais difícil fazer isso. O Spark faz isso acontecer automaticamente para você. Normalmente, um software como o Hive evita rodar muitos jobs MapReduce e os programadores escrevem códigos complexos e difíceis de entender para forçar cada job MapReduce. Isso faz com que o desenvolvimento e a manutenção do código sejam difíceis.

Ao invés disso, usando o Spark, você pode escrever códigos que descrevem como você deseja processar os dados e não como você deseja que a execução seja feita. Com isso, o Spark "faz a coisa certa" para executar o código da forma mais eficiente possível. Esta é a mesma coisa que uma linguagem de programação de alto nível faz: aumentar a camada de abstração, deixando o desenvolvedor mais livre e expressivo, fazendo o trabalho nos bastidores para garantir que a execução do código ocorra o mais rápido possível.

O Spark também traz bibliotecas para aprendizagem de máquina, streaming, programação gráfica e SQL. Isso também torna as coisas muito mais fáceis para os desenvolvedores. Estas bibliotecas são integradas, promovendo melhorias ao Spark e trazendo benefícios adicionais, como a adição de novos pacotes.

A maioria dos analistas de dados teria que recorrer ao uso de outros pacotes não relacionados para fazer seu trabalho, o que torna as coisas mais complexas. As bibliotecas do Spark são projetadas para trabalhar juntas, na mesma área de dados, tornando mais integrado e mais fácil de usar.

Em particular, o Spark streaming fornece uma maneira de fazer o processamento de fluxo de dados em tempo real. O projeto Apache Storm foi projetado para fazer este tipo de trabalho, mas desenvolver para Spark é muito mais fácil do que desenvolver para Storm. O Spark permitirá aos desenvolvedores fazer análise em tempo real de tudo, como por exemplo, dados de cliques em páginas web,utilizando um ambiente fácil de desenvolvimento, em alta velocidade.

Em resumo, o Spark é promissor ao acelerar o desenvolvimento de aplicativos de 10 a 100x, fazer aplicações mais portáteis e executá-las 100x mais rápido.Isto demonstra o porquê as pessoas estão entusiamadas.

Como alguém desenvolve um aplicativo para o Spark?


O Spark é um conjunto de bibliotecas. Você pode programar com essas bibliotecas a partir de três linguagens de programação: Java, Python, e uma linguagem mais nova chamada Scala.

Não há muitos desenvolvedores Scala atualmente, ao passo que existem milhões de desenvolvedores Java e Python. Mas Scala é melhor projetado para trabalhar com o Spark e oferece uma maior redução no número de linhas de código ao desenvolver uma aplicação.

Muitas aplicações complexas que tinham centenas de linhas de código, podem ser reescritas em Scala em quantidade menor. A metodologia de projeto de Scala é mais compatível com o Spark do que com qualquer outra linguagem.

Scala também compila o mesmo bytecode que uma Java Virtual Machine (JVM) executa. Portanto, qualquer código existente que você tem em Java pode ser usado por Scala.

Esta é uma das maiores vantagens do Scala: dar-lhe o melhor dos dois mundos. Scala oferece suporte de primeira classe para a integração com Java.

Na verdade, muito do Scala é diretamente dependente do Java. Todo o código Java que você já tem pode ser reaproveitado. E o código importante que representa a parte crítica do aplicativo de divisão de dados pode ser reescrito em Scala, em uma proporção muito menor, sendo muito mais fácil para os desenvolvedores lerem e manterem o código. 

Observe que com o Java 8.0 suportando expressões lambda, um desenvolvedor Java pode se tornar muito mais produtivo sem mudar para Scala completamente.

As bibliotecas fornecidas pelo Spark foram discutidas anteriormente. A comunidade de desenvolvedores está animada com o Spark, porque tudo é integrado com ele.

Se você deseja desenvolver aplicações com MapReduce, você terá alguns problemas. 

Primeiro, MapReduce praticamente tem que ser feito com Java. Este não é o caso com o Spark: Python e Scala são duas outras opções.

Em segundo lugar, você tem que combinar o MapReduce com outras tecnologias. 

Aprendizado de máquina? Você tem que integrar separadamente ferramentas como Mahout, H2O ou Oryx para fazer as coisas, descobrir como ele funciona e como configurá-lo.

Gostaria de um banco de dados gráfico com ferramentas próprias para análise gráfica? Bem, mais uma vez, você tem que escolher entre Giraph, TitanDB, Neo4j ou alguma outra tecnologia.

O ponto é que a integração de todas essas partes definitivamente não é nada fácil. Cada um deles tem que ser usado da sua forma específica.

O Spark oferece um modelo diferente. Você começa com SQL, aprendizagem de máquina, análise gráfica e streaming em um único conjunto de bibliotecas em que todos trabalham em conjunto com o núcleo Spark.

Você pode manipular os mesmos conjuntos de dados com todos eles. E quando o núcleo do Spark recebe melhorias, todas as bibliotecas também são aperfeiçoadas. A integração é muito mais fácil, as aplicações são muito mais fáceis de manter, os custos diminuem, os desenvolvedores ficam mais felizes.

O mais importante para as equipes de campo entenderem: se uma empresa que desenvolve aplicações vai fazer uma aposta em uma única base para as suas aplicações, o Spark é a melhor escolha no momento.

O Spark não substitui o Hadoop. Você ainda precisa de uma única camada de dados, de preferência uma que é hiper-escalável e extremamente rápida, e é aí que entra o MapR. O MapR torna o Spark mais rápido, mais escalável e mais confiável.

Quais são os casos de uso do Spark?


Databricks (uma empresa fundada pelos criadores do Apache Spark), lista os seguintes casos de uso:
  1. Integração de dados e ETL
  2. Análise Interativa ou Business Intelligence (BI)
  3. Computação de alto desempenho (batch)
  4. Aprendizado de máquina e análise avançada
  5. Processamento de fluxo de dados em tempo real
Muitas pessoas estão fazendo a integração de dados e ETL em MapReduce, bem como computação em batch, aprendizado de máquina batch analytics.

Contudo, tudo isso será muito mais rápido no Spark.

Análise interativa e BI são possíveis com o Spark, e o mesmo vale para o processamento de fluxo de dados em tempo real.

Então, alguns dos novos casos de uso são apenas os antigos casos de uso, feitos mais rápidos, enquanto alguns são totalmente novos. Há algumas coisas que simplesmente não poderiam ter sido feitas com um desempenho aceitável utilizando o MapReduce.


Conclusão



Trouxe este artigo com o objetivo de compartilhar com você as principais diferenças entre o Spark e o MapReduce, por que é mais fácil desenvolver em Spark e os cinco principais casos de uso.

Espero que tenha gostado.


Para saber mais

  1. Baixe o ebook sobre soluções para Big Data que escrevi;
  2. Se inscreva na lista que criei para discutir o tema no Google Groups;
  3. Confira minha palestra virtual apresentando os conceitos básicos da tecnologia, depois venha trocar idéias!

Christian Guerreiro

Professor por vocação, blogueiro e servidor público por opção, amante da tecnologia e viciado em informação.


Ensino a distância em Tecnologia da Informação: Virtualização com VMware, Big Data com Hadoop, Certificação ITIL 2011 Foundations e muito mais.


Suporte o Tecnologia que Interessa!

Você acha que as informações compartilhadas aqui são úteis?
Então me ajude a produzir ainda mais e melhores conteúdos!


É muito fácil. Basta divulgar nossos treinamentos pra alguém que conheça!


E se for de Salvador, podemos estruturar um curso presencial para sua empresa!

Eu vou ficar muito grato (e quem fizer os curso também :)!