Spark - Resilient Distributed Datasets

Big Data & Spark

Spark é uma estrutura de processamento paralelo, um sistema Open Source para computação em cluster cujo objetivo é possibilitar que a análise de dados seja a mais rápida possível. Spark foi pensado com base na crescente necessidade de análise de grandes volumes de dados no menor tempo possível. Seu mecanismo de processamento foi desenvolvido com foco em velocidade e facilidade de uso, visando sempre uma análise sofisticada.

spark-bigdata

Estou falando de um projeto Apache anunciado como “lightning fast cluster computing”, que te permite (segundo o Apache) executar programas 100 vezes mais rápidos em memória e 10 vezes mais rápidos em disco, quando comparado ao Hadoop, por exemplo.

Em 2014, no durante toda a bateria de testes do Daytona GraySort contest, Spark se mostrou 3x mais rápido que o Hadoop e foi considerado a solução open source mais rápida no processamento de um petabyte.

Outra vantagem é em relação a codificação. Observe o exemplo abaixo:


sparkContext.textFile("hdfs://...")
    .flatMap(line => line.split(" "))
    .map(word => (word, 1)).reduceByKey(_ + _)
    .saveAsTextFile("hdfs://...")

Este é um exemplo simples de um Word Count, o Hello World em big data. Este código de MapReduce escrito em Java seria feito com cerca de 50 linhas, enquanto no Spark podemos utilizar Scala para uma codificação bem mais simplificada.

Spark também é compatível com Hadoop, sendo assim qualquer sistema de armazenamento suportado por Hadoop (HDFS, Hive, HBase, Cassandra, S3, SequenceFiles) poderá ser utilizado como fonte de dados para o Spark.

As primeiras aplicações práticas para o Spark foram no sentido de estender o modelo MapReduce para um melhor suporte a aplicações analíticas como Algoritmos iterativos (Learning machines e grafos), bem como em ferramentas para mineração de dados interativas (R, Excel, Python).

Por que Spark?

A maioria da soluções envolvendo modelo de programação em cluster como por exemplo, o Hadoop, são baseados em um fluxo de dados acíclico onde os registros são carregados de um meio de armazenamento estável (sistema de arquivos distribuído, banco de dados, etc), submetidos a um DAG (Directed Acyclic Graph) de operadores deterministicos, e escritos de volta em um meio de armazenamento estável. Observe a imagem abaixo, que representa um DAG, onde as atividades estão interligadas por ciclos que não estão em uma sequência seguindo uma mesma direção.

Directed_acyclic_graph

A imagem abaixo exibe um fluxo de dados acíclico com um modelo tradicional MapReduce. Ela demonstra a leitura dos dados de um meio estável, o processamento utilizando MapReduce em paralelo e a escrita do resultado em um meio estável. Para aplicações que precisam ler conjuntos de dados repetidas vezes e utilizar funções de agregação (count, min, max, avg) esse modelo não é tão eficiente pois precisa ler os dados do disco a cada query, para quem esta acostumado a realizar análise de dados principalmente utilizando Hadoop provavelmente conhece o Apache Hive cuja a função é fornecer um sistema de Data Warehouse para Hadoop.

map-reduce-end

Nesse ponto o Spark desponta como uma solução mais viável pois uma vez os dados em memória a manipulação das informações se torna muito mais rápida, em alguns estudos Spark se mostra 30 vezes mais eficiente que Hive/Hadoop.

Como o Spark consegue isso?

Uma primeira vista é sobre o Spark Core, a engine que permite o processamento distribuído em grande escala. Sua responsábilidade é a gestão de memória, recuperação de falhas, distribuição e monitormanto dos jobs em um cluster e integração com os sistemas de armazenamento. Esse é o cara respnosável por orquestrar todo o desempenho que o Spark pode alcançar.

E qual o segredo de todo este desempenho? Está no chamado RDDs ou Resilient Distributed Datasets, que mantêm as características essenciais do MapReduce (Tolerância a falhas, transparência de localização de dados e escalabilidade).

Spark introduziu o conceito de RDD, que formalmente é uma coleção de objetos somente leitura, particionados em um conjunto de nodos do cluster, podendo somente  ser criado através de funções determinísticas (map, filter, join, groupBy) executadas em outros RDDs ou meios de armazenamentos estáveis como o Hadoop Filesystem. Basicamente RDDs suportam dois tipos de operações: Transformations (map, filter, join, union, etc) e Actions (reduce, count, first, etc).

RDDs são representados no Spark por objetos, transformações são executadas invocando métodos nesses objetos. Aplicações em Spark são conhecidas como Drivers e esses drivers implementam as operações que são executadas tanto no modo single- node cluster ou multi-node cluster. Um Driver pode executar dois tipos de operações em um conjunto de dados: Um ação e uma transformação. Um ação executa um processamento em um conjunto de dados e retorna um valor para o Driver, uma transformação cria um novo conjunto de dados a partir de um conjunto de dados existente.

 

Referências


Author's profile picture

Vitor is a computer scientist who is passionate about creating software that will positively change the world we live in.

MVP Azure - Cloud Architect - Data science enthusiast


4 minutes to read