O Apache Spark tem uma arquitetura hierárquica primária/secundária. O Spark Driver é o nó primário que controla o gerenciador de cluster, que gerencia os nós secundários e fornece os resultados dos dados ao cliente da aplicação.
Com base no código da aplicação, o Spark Driver gera o SparkContext, que funciona com o gerente de cluster – o gerenciador de cluster autônomo do Spark ou outros gerenciadores de cluster, como o Hadoop YARN, o Kubernetes ou o Mesos – para distribuir e monitorar a execução em todos os nós. Ele também cria conjuntos de dados distribuídos resilientes (RDDs), que são a chave para a incrível velocidade de processamento do Spark.
Conjunto de dados distribuídos resilientes (RDD)
Os conjuntos de dados distribuídos resilientes (RDDs) são coleções de elementos tolerantes a falhas que podem ser distribuídos entre vários nós em um cluster e trabalhados em paralelo. Os RDDs são uma estrutura fundamental no Apache Spark.
O Spark carrega dados fazendo referência a uma fonte de dados ou paralelizando uma coleção existente com o método de paralelização SparkContext de armazenamento de dados em cache em um RDD para processamento. Depois que os dados são carregados em um RDD, o Spark realiza transformações e ações em RDDs na memória – a chave para a velocidade do Spark. O Spark também armazena os dados na memória, a menos que o sistema fique sem memória ou o usuário decida gravar os dados no disco para persistência.
Cada conjunto de dados em um RDD é dividido em partições lógicas, que podem ser calculadas em diferentes nós do cluster. E os usuários podem executar dois tipos de operações de RDD: transformações e ações. As transformações são operações realizadas para criar um novo RDD. As ações são usadas para instruir o Apache Spark a realizar cálculos e enviar o resultado de volta para o driver.
O Spark oferece suporte a uma variedade de ações e transformações nos RDDs. Essa distribuição é feita pelo Spark, para que os usuários não precisem se preocupar em calcular a distribuição correta.
Gráfico Acíclico Dirigido (DAG)
Ao contrário do processo de execução em duas etapas do MapReduce, o Spark cria um DAG (gráfico acíclico dirigido) para programar tarefas e a orquestração de nós de trabalho no cluster. Como o Spark atua e transforma os dados nos processos de execução de tarefas, o agendador DAG facilita a eficiência orquestrando os nós de trabalho em todo o cluster. Esse rastreamento de tarefas possibilita a tolerância a falhas, pois reaplica as operações registradas nos dados de um estado anterior.
DataFrames e conjuntos de dados
Além dos RDDs, o Spark lida com dois outros tipos de dados: DataFrames e conjuntos de dados.
DataFrames são as interfaces de programação de aplicações (APIs) estruturadas mais comuns e representam uma tabela de dados com linhas e colunas. Embora o RDD tenha sido um recurso crítico para o Spark, ele agora está no modo de manutenção. Devido à popularidade da Biblioteca de Aprendizado de Máquina (MLlib) do Spark, os DataFrames assumiram o papel de principal API para MLlib (um conjunto de algoritmos de aprendizado de máquina para escalabilidade, além de ferramentas para seleção de recursos e criação de pipelines de ML). É importante observar isso ao usar a API MLlib, pois os DataFrames fornecem uniformidade entre as diferentes linguagens, como Scala, Java, Python e R.
Os conjuntos de dados são uma extensão dos DataFrames que oferecem uma interface de programação orientada a objetos e com segurança de tipos. Os conjuntos de dados são, por padrão, uma coleção de objetos JVM com tipos definidos, diferente dos DataFrames.
O Spark SQL permite que os dados sejam consultados a partir de DataFrames e armazenamentos de dados SQL, como o Apache Hive. Quando executadas em outra linguagem, as consultas do Spark SQL retornam um DataFrame ou conjunto de dados.
Spark Core
Spark Core é a base para todo o processamento de dados paralelo e lida com agendamento, otimização, RDD e abstração de dados. O Spark Core fornece a base funcional para as bibliotecas Spark, Spark SQL, Spark Streaming, a biblioteca de aprendizado de máquina MLlib e o processamento de dados gráficos GraphX. O Spark Core e o gerenciador de cluster distribuem os dados pelo cluster do Spark e os abstraem. Essa distribuição e abstração tornam o manuseio de big data muito rápido e fácil de usar.
APIs do Spark
O Spark inclui uma variedade de interfaces de programação de aplicações (APIs) para tornar o poder do Spark acessível ao maior número de pessoas. O Spark SQL permite uma interação com os dados RDD de uma maneira relacional. O Spark também tem uma API bem documentada para Scala, Java, Python e R. A API de cada linguagem no Spark tem suas nuances específicas na forma como lida com os dados. Os RDDs, DataFrames e conjuntos de dados estão disponíveis na API de cada linguagem. Com APIs para uma variedade de linguagens, o Spark torna o processamento de big data acessível a grupos mais diversos de pessoas com experiência em desenvolvimento, ciência de dados, engenharia de dados e estatística.