Machine Learning em Larga Escala: Funcionamento do Spark

Rodrigo Lampier
9 min readFeb 22, 2021

Spark é um projeto open source no universo do Big Data, construído para análises sofisticadas, velocidade de processamento e facilidade de uso. Ele unifica capacidades críticas de análise de dados, como SQL, análise avançada em machine learning e streaming de dados, tudo isso em uma única estrutura. Faz isso usando hardware de baixo custo e promove o processamento paralelo do Big Data.

Características do Spark

O Spark tem muitas vantagens se comparado as outras tecnologias de Big Data e do paradigma MapReduce, como o Hadoop MapReduce e o Storm. Inicialmente, o Spark oferece um framework unificado e de fácil compreensão para gerenciar e processar Big Data com uma variedade de conjuntos de dados de diversas naturezas (por exemplo: texto, grafos, etc), bem como de diferentes origens (carga de dados em batch ou streaming de dados em tempo real).

Permite o desenvolvimento rápido de aplicações em Java, Scala ou Python, além de linguagem R. Além disso, vem com um conjunto integrado de mais de 80 operadores de alto nível e pode ser usado de forma interativa para consultar dados diretamente do console. Além das operações de Map e Reduce, suporta consultas SQL, streaming de dados, aprendizado de máquina e processamento de grafos.

O Spark foi concebido principalmente para trabalhos iterativos, mas também pode ser utilizado para realizar trabalhos em lotes. Isso ocorre porque as arquiteturas para análise de Big Data são compostas por várias etapas que trabalham em conjunto sobre os mesmos dados, e que normalmente encontram-se armazenados no Hadoop HDFS.

Executa processamento em memória, sem utilização de escrita e leitura em disco rígido, com o objetivo de ser superior aos engines baseados em disco como o Hadoop MapReduce. Assim ele detém os resultados intermediários na memória, o que é muito útil quando precisamos processar os mesmos conjuntos de dados muitas vezes.

Seu projeto teve por objetivo torná-lo um mecanismo de execução que funciona tanto na memória como em disco e, por isso, o Spark executa operações em disco quando os dados não cabem mais na memória. Assim, é possível usá-lo para o processamento de conjuntos de dados maiores que a memória agregada em um cluster Spark. O Spark armazenará a maior quantidade possível de dados na memória e, em seguida, irá persisti-los em disco.

O uso do Spark traz vantagens consideráveis sobre o Hadoop MapReduce, como:

  • Spark suporta mais do que apenas as funções de Map e Reduce;
  • É muito fácil de usar, com interfaces para interação com o cluster com linguagens Java, Python, Scala e R;
  • Veloz, ideal para processamento de algoritmos complexos e iterativos, típicos de machine learning;
  • Spark pode utilizar o Hadoop HDFS como uma de suas fontes de dados para processamento;
  • Engine de uso geral, onde podemos usar queries SQL, processamento de texto, machine learning, batch, etc.

Arquitetura do Spark

Um framework é conjunto de softwares que realizam operações e manipulam os itens mais básicos da computação, como interação com o hardware. Isso permite o usuário se concentrar em itens de mais alto nível, ganhando produtividade.

Spark é um framework de computação em cluster, para processamento e análise de big data. Ele prove uma interface simples de programação, que habilita as aplicações a usarem facilmente CPU, memória e recursos de armazenamento de vários computadores (clusters) para processar grandes volumes de dados (big data). Ele possui os seguintes componentes que ajudam os usuários no processamento do big data.

Fonte: http://malsolo.com/blog4java/?p=679

Standalone Scheduler: É o cluster manager, do próprio Spark.

YARN e Mesos: Responsáveis por gerenciar os vários computadores do cluster.

Spark Core: Contém as funcionalidades básicas do Spark, incluindo componente de agendamento de tarefas, gerenciamento de memória, recuperação a falhas, interação com sistemas de storage, entre outras funções. É onde fica também a API RDD, que são as camadas principais de abstração da programação.

Spark SQL: Pacote Spark para trabalhar com dados estruturados, permite a utilização de linguagem SQL, bem como do Hive SQL. Também suporta diferentes fontes de dados, como tabelas do Hive, do Hadoop e arquivos JSON. Permite ainda utilizar SQL em conjunto com aplicações Python, Java, Scala e R, permitindo construir aplicações analíticas complexas.

Spark Streaming: Esse componente permite o processamento on-line de streaming de dados, como arquivos de logs, filas de mensagens, cliques em websites, etc. Permite manipular streaming em memória, em disco ou que cheguem em tempo real. Foi concebido para ser tolerante a falhas.

MLib: Biblioteca com funcionalidades de Machine Learning. Essa biblioteca permite utilizarmos diversos tipos de algoritmos de ML, como classificação, regressão, clusterização e filtros colaborativos, assim como modelos de avaliação e importação de dados. Tudo isso usando clusters de computadores.

GraphX: Biblioteca para manipulação de gráficos e processamento paralelo.

Execução de uma aplicação no Spark

O Spark driver é responsável pelo Spark Context para cada aplicação Spark. O Spark driver é responsável por diversas tarefas, tais como cache manager, security manager, memory manager, et. Um Spark Driver nada mais é que um aplicativo (escrito em Java, Scala, Python ou R) que usa o Spark como uma biblioteca. Ele fornece o código de processamento de dados que o Spark executa em cada node do cluster. Um Spark Driver pode iniciar um ou mais trabalho em um cluster de Spark (que são os jobs). O Spark Driver inicia um job, que será executado nos workers e gerenciado pelo cluster manager, que controla e coordena todas as operações paralelas no cluster. Portanto, Cada execução do Spark driver é um job.

Cada aplicação Spark inicia uma instância de um Spark Context. Sem um Spark Context, nada pode ser feito no Spark. Cada aplicação Spark é uma instância de um Spark Context. O Spark context é basicamente uma espécie de cliente que estabelece a conexão com o ambiente de execução do cluster Spark, fornece acesso as funcionalidades do Spark. Com o Spark Context criado, podemos então definir os nossos RDD’s ou Dataframes, que são os objetos que vão armazenar os dados para processamento. O Spark Context é a ligação entre o Driver Program (a aplicação que você escreveu em alguma linguagem de programação) e o cluster Spark.

O Spark utiliza uma arquitetura de nós Master/Worker. Existe o “Driver Program” que coordena o que chamamos de nó master. O Master é o chefe do cluster, e gerencia os workers (os nós trabalhadores) e cada worker possui um executor.

Um executor é um processo JVM (Java Virtual Machine) que o Spark cria em cada worker para execução de uma aplicação Spark. Ele executa o código do aplicativo simultaneamente em vários segmentos, de forma paralela. Ele também pode armazenar os dados em cache na memória ou disco. Um executor tem o mesmo tempo de vida que a aplicação para o qual foi criado (ou seja, ele nada mais é do que um processo criado para execução do job. Quando o job termina, o processo também termina).

Cada Worker é um computador/nó de um cluster Spark. Esse tipo de node possui um processo chamado de “Executor”, que executa as tasks/tarefas enviadas pelo Master. É o Worker que fornece CPU, memória e recursos de armazenamento para uma aplicação Spark. Os workers executam as aplicações Spark.

Uma task/tarefa é a menor unidade de trabalho que o Spark envia para um executor. Cada tarefa executa alguns cálculos, quer retornam um resultado para um Spark Driver. O Spark cria uma tarefa para cada partição de dados (um RDD pode ser particionado para execução em paralelo). Um processo executor pode executar uma ou mais tasks/tarefas simultaneamente. A quantidade de paralelismo é determinada pelo número de partições. Mais partições significam mais dados de processamento de tarefas em paralelo.

Tudo isso é gerenciado pelo nó Master ou pelo Cluster Manager. O Spark utiliza um gerenciador de clusters para adquirir recursos de cluster para a execução de um job. Um cluster manager, como o nome indica, gerencia recursos de computação em um cluster de diversos nodes. Ele fornece a programação de baixo nível de recursos de cluster em todos os aplicativos. Ele permite que vários aplicativos possam compartilhar recursos do cluster. O cluster manager também é chamado de resource manager.

Fonte: https://spark.apache.org/docs/latest/cluster-overview.html

Em resumo, você define um Spark driver, que usa um Spark Context para conectar aos serviços do cluster. O Spark driver envia jobs que são trabalhos de análise de dados por exemplo, que serão processados nos workers. Cada worker possui um serviço executor, que pode processar uma ou mais tarefas em paralelo. A gestão do cluster e da comunicação entre os nodes é feita pelo cluster manager. Ao fim da execução das tarefas, os workers comunicam o Spark Context que então apresenta o resultado ao Spark driver. Esse é o resultado que por exemplo você vê quando executa um comando no console do Spark ou do PySpark.

Modos de implementação do cluster Spark

Temos dois modos de operação para a implementação do Spark em um ambiente produtivo.

Standalone: é um cluster de uma máquina só;

Cluster: é um cluster com diversas máquinas, um cluster real.

Quando trabalhamos com o modo de operação cluster, temos quatro formas de gerenciar o cluster Spark.

  • Standalone: nesse modo executamos um programa direto no shell do Spark, indicando quem é a máquina master do cluster Spark. O master por sua vez vai direcionar a carga de trabalho para as máquinas workes e depois retornar o resultado para o shell. Aqui não há gestão propriamente dita do cluster. O master requisita todos os workes e esses executam até seu limite de capacidade.
  • Apache Mesos: é um software para a gestão de cluster de propósito geral. Seu objetivo é gerenciar clusters. Nesse modo submetemos um programa via “Spark Submit” e informamos que estamos em modo cluster. O Mesos que vai fazer a interface com o cluster Spark. É a melhor opção no momento para gestão de cluster grandes.
  • Apache YARN: é um dos componentes do Apache Hadoop (os outros dois são o HDFS e o MapReduce). É um pouco inferior ao Mesos.
  • Kubernetes: é um modo mais recente e avançado que visa a utilização dos contêineres como nós de um cluster Spark.

Modos de execução do Spark

O Spark pode executar os programas em três modos.

Batch: um programa é agendado para executar em intervalos específicos (através do scheduler);

Interativo: utiliza o shell para executar comando individuais ou em cluster. O shell age como um “driver program” e provê um “SparkContext”;

Streaming: um programa que executa continuamente para processar os dados à medida que eles chegam, em tempo quase real.

RDDs, DataFrames e Datasets

Fonte: https://www.analyticsvidhya.com/blog/2020/11/what-is-the-difference-between-rdds-dataframes-and-datasets/

O que são RDDs?

RDDs ou “conjuntos de dados distribuídos resilientes” são a estrutura de dados fundamental do Spark. É a coleção de objetos que é capaz de armazenar os dados particionados entre os vários nós do cluster e também permite que eles façam o processamento em paralelo. É tolerante a falhas caso algum nó do cluster falhe durante o processamento.

Podemos usar RDDs quando queremos fazer transformações de baixo nível no conjunto de dados. Ele não infere automaticamente o esquema dos dados ingeridos, precisamos especificar o esquema de cada conjunto de dados quando criamos um RDD.

O que são Dataframes?

Foi introduzido para superar as limitações do RDD. Os Dataframes são a coleção distribuída de pontos de dados, mas aqui, os dados são organizados em colunas nomeadas. Também permitem que os desenvolvedores depurem o código durante o tempo de execução, o que não era permitido com os RDDs.

Podem ler e gravar os dados em vários formatos, como tabelas CSV, JSON, AVRO, HDFS e HIVE. Já está otimizado para processar grandes conjuntos de dados para a maioria das tarefas de pré-processamento, de modo que não precisamos escrever funções complexas por conta própria.

O que são Datasets?

Os Datasets são uma extensão dos Dataframes. É rápido e fornece uma interface segura de tipo. Segurança de tipo significa que o compilador irá validar os tipos de dados de todas as colunas no Dataset durante a compilação e lançará um erro se houver qualquer incompatibilidade nos tipos de dados. São mais rápidos que os RDDs, e um pouco mais lento do que os Dataframes.

Conclusão

Neste artigo entendemos um pouco mais sobre o funcionamento do Spark, explorando suas características, arquitetura, execução de programas, modos de implementação e principais estruturas de dados. Ter a visão desses itens nos permite utilizar melhor as possibilidades que o Spark nos oferece. No próximo artigo vamos implementar um projeto de ciência de dados utilizando o Spark como ferramenta de processamento.

Volte sempre!

Gostou do que viu? Deixe seus aplausos (eles vão de 1 a 50). Caso tenha alguma dúvida ou sugestão, deixe aqui nos comentários ou me chama no Linkedin ou me envia um e-mail . Te vejo no futuro!

--

--

Rodrigo Lampier

Entusiasta da computação e investimentos, sou formado em Ciência da Computação e pós-graduado em Big Data e Ciência de Dados.