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!