Spark no Kubernetes do Jeito Simples! :)
Execute seu Job PySpark no k8s!
Esse texto tem como objetivo resumir oque é, para que server e como utilizar com algumas dicas sobre o Spark no Kubernetes.
Apache Spark?
O Apache Spark é um motor de processamento distribuído que permite processar grandes conjuntos de dados em um cluster de computadores. Ele foi desenvolvido na Universidade da Califórnia, em Berkeley, em 2009, e posteriormente foi doado para a Apache Software Foundation, tornando-se um projeto de código aberto.
Algumas de suas principais características incluem:
- Suporte a diferentes fontes de dados, como HDFS, HBase, Cassandra, S3, entre outros.
- Capacidade de processar dados em tempo real e em lotes.
- Suporte a diferentes linguagens de programação, como Java, Scala, Python e R.
- Capacidade de processar dados em memória, o que pode acelerar consideravelmente o processamento de grandes volumes de dados.
- API extensível, permitindo a adição de novos módulos e funcionalidades.
O Apache Spark faz tanto sucesso na área de dados por causa de suas várias vantagens em relação a outras ferramentas de processamento de dados em larga escala. Algumas das razões pelas quais o Spark é tão popular incluem:
- Velocidade: O Spark foi projetado para ser rápido, especialmente para processamento de dados em larga escala. Ele usa técnicas como processamento em memória e execução distribuída para acelerar o processamento de grandes volumes de dados.
- Escalabilidade: O Spark é altamente escalável e pode ser executado em um cluster de computadores, permitindo que ele processe grandes volumes de dados de forma eficiente.
- Flexibilidade: O Spark é flexível e pode processar uma ampla variedade de dados, incluindo dados estruturados e não estruturados, além de suportar várias fontes de dados.
- Facilidade de uso: O Spark é fácil de usar e oferece APIs em várias linguagens de programação, como Java, Scala, Python e R. Além disso, ele tem uma ampla variedade de bibliotecas e ferramentas que simplificam o processamento de dados.
- Ecossistema: O Spark tem um amplo ecossistema de ferramentas e bibliotecas, o que facilita o processamento de dados em diferentes cenários.
- Suporte à análise de dados em tempo real: O Spark tem suporte nativo à análise de dados em tempo real, permitindo que ele processe e analise dados em tempo real em um cluster distribuído.
- Custo-benefício: O Spark é uma ferramenta de código aberto, o que significa que é gratuito para uso e oferece uma alternativa de baixo custo para outras ferramentas de processamento de dados em larga escala.
- Compatibilidade: O Spark é compatível com vários sistemas de armazenamento de dados, incluindo Hadoop Distributed File System (HDFS), Cassandra e Amazon S3, o que facilita a integração com outras ferramentas de análise de dados.
O Spark é popular porque é uma ferramenta poderosa, rápida, escalável, flexível e fácil de usar para processamento de dados em larga escala. Ele tem um ecossistema vasto de ferramentas e bibliotecas e é uma alternativa acessível a outras ferramentas de processamento de dados em larga escala.
Kubernetes?
Kubernetes é uma plataforma de orquestração de contêineres de código aberto que foi desenvolvida pela Google e doada para a Cloud Native Computing Foundation (CNCF) em 2015. O Kubernetes permite gerenciar, escalar e automatizar a implantação de aplicativos em contêineres em um ambiente de nuvem.
Entre as principais características do Kubernetes, podemos destacar:
- Capacidade de gerenciar a infraestrutura em contêineres de forma distribuída.
- Escalabilidade horizontal e vertical dos aplicativos em contêineres.
- Capacidade de automatizar a implantação, atualização e monitoramento de aplicativos em contêineres.
- Flexibilidade para executar aplicativos em contêineres em diferentes ambientes de nuvem, como AWS, GCP e Azure, entre outros.
O Kubernetes tem sido amplamente utilizado por empresas e organizações que desejam automatizar a implantação e o gerenciamento de aplicativos em contêineres. Isso porque o Kubernetes oferece uma maneira eficiente e escalável de implantar e gerenciar aplicativos em contêineres em ambientes de nuvem.
Como o Spark recebeu suporte para ser utilizado no kubernetes?
A história do suporte do Apache Spark para o Kubernetes remonta a 2015, quando o Google doou o projeto Kubernetes para a Cloud Native Computing Foundation (CNCF). O Kubernetes é um projeto de código aberto que fornece um ambiente para o gerenciamento de contêineres em escala de produção. Como o Spark é uma das principais ferramentas para o processamento de dados em larga escala, houve interesse em executar o Spark em um ambiente de contêiner.
Em 2016, o Google e a empresa de tecnologia chinesa Huawei anunciaram um projeto conjunto para executar o Spark no Kubernetes. O projeto visava tornar mais fácil para os usuários executar o Spark em um ambiente de contêiner e para tornar o Kubernetes uma plataforma mais robusta para o processamento de dados em larga escala.
Desde então, houve muitos desenvolvimentos no suporte do Spark para o Kubernetes. Em 2018, a empresa de tecnologia americana Databricks anunciou o suporte do Spark para o Kubernetes em sua plataforma de análise de dados na nuvem. Em 2019, o suporte do Spark para o Kubernetes foi incluído no Apache Spark 2.4, tornando-se oficialmente um recurso do Spark.
Atualmente, o Spark no Kubernetes é amplamente utilizado por empresas e organizações que desejam executar aplicativos Spark em contêineres em ambientes de nuvem. O Spark no Kubernetes oferece várias vantagens, incluindo escalabilidade, elasticidade, flexibilidade, isolamento de aplicativos e baixo custo.
Por quer utilizar o Spark no Kubernetes?
Existe várias razões para utilizar o Apache Spark no Kubernetes. Algumas delas são:
- Escalabilidade: O Kubernetes fornece recursos de dimensionamento automático para os Jobs Spark(fluxo de dados), permitindo que eles cresçam ou encolham de acordo com a demanda.
- Elasticidade: O Kubernetes pode provisionar e desprovisionar recursos automaticamente de acordo com a necessidade do cluster Spark.
- Flexibilidade: O Kubernetes permite que o Spark seja executado em qualquer infraestrutura, incluindo nuvens públicas, privadas e híbridas.
- Eficiência: O Spark pode ser executado como um serviço no Kubernetes, economizando tempo e recursos na implantação e gerenciamento.
- Isolamento: O Kubernetes fornece um ambiente isolado para o Spark, garantindo que ele não afete outros aplicativos em execução no cluster.
- Facilidade de gerenciamento: O Kubernetes facilita o gerenciamento do ciclo de vida do Spark, incluindo o provisionamento, a atualização e a desativação.
- Compatibilidade: O Kubernetes é compatível com as principais distribuições do Spark, como Apache Spark, Databricks e Cloudera.
- Integração: O Kubernetes pode ser integrado com outras ferramentas do ecossistema do Spark, como o Hadoop Distributed File System (HDFS), o Apache Kafka e o Apache Hive.
- Baixo custo: O Kubernetes pode ajudar a reduzir os custos de infraestrutura, permitindo que os aplicativos Spark sejam executados em uma nuvem pública mais barata como na AWS utilizando instâncias Spot no EKS.
- Agilidade: O Kubernetes permite que o Spark seja implantado e gerenciado rapidamente, permitindo que as equipes de desenvolvimento e análise de dados sejam mais ágeis e produtivas.
Empresa que utilizam o Spark no Kubernetes
- Caicloud
- Microsoft(MileIQ)
- Lightbend
- StackTome
- Salesforce
- Bringg
- Siigo
- CERN
- Lyft
- MapR Technologies
- Uber
- HashmapInc
- Tencent
- Exacaster
- Riskified
- CloudZone
- Cyren
- Shell (Agile Hub)
- Nielsen Identity
- Engine
- Data Mechanics
- PUBG
- Beeline
- Stitch Fix
- Typeform
- incrmntal(https://incrmntal.com/)
- CloudPhysics
- MongoDB
- MavenCode
- Gojek
- Fossil
- Carrefour
- Scaling Smart
- Tongdun
- Totvs Labs
- DiDi
- Deep
- Cure
- C2FO
Para saber mais:
Como utilizar o Spark no Kubernetes?
Agora que entendemos oque é o Spark e o Kubernetes, como o Spark recebeu suporte e quais empresas estão utilizando, vamos a pratica e para isso temos duas formas:
- Cluster Spark
Criar um cluster Spark a partir de imagens Docker disponibilizadas pela Apache e utilizando de operações de “SUBMIT” executar nossos fluxos de dados.
Essa é uma possibilidade extremamente problemática, aonde se perde a possibilidade de utilizar os recursos de elasticidade do kubernetes e torna o Spark sujeito a muitos cenários de falhas e reprocessamento de dados.
- Spark Operator
Utilizar um controlador específico para aplicações Saprk que amplia as funcionalidades do Spark no Kubernetes, ou seja, fazer uso de um “Operator” que a partir de um arquivo( YAML) de configuração conseguir provisionar o cluster spark para executar nosso fluxo de dados a partir de uma imagem Docker customizada.
Essa é forma mais eficiente em uso dos recursos do kubernetes pelo Spark como a possibilidade de escalar de forma horizontal o processamento de dados e criar pontos de “checkpoint” em casos de falha.
Existem muitos Operators, nesse exemplo, vamos utilizar o que foi criado pelo Google e tem sido mantido por uma grande comunidade de contribuidores e muitas empresas de diferentes setores:
Instalação:
Com o Helm instalado, execute os seguintes comando abaixo no seu terminal:
helm repo add spark-operator https://googlecloudplatform.github.io/spark-on-k8s-operator helm install my-release spark-operator/spark-operator --namespace spark-operator --create-namespace
Para saber mais:
Utilização:
O Operator espera um arquivo de configuração, esse é um exemplo para um JOB PySpark que fara o calculo do PI:
apiVersion: "sparkoperator.k8s.io/v1beta2"
kind: SparkApplication
metadata:
name: pyspark-pi
namespace: default
spec:
type: Python
pythonVersion: "3"
mode: cluster
image: "gcr.io/spark-operator/spark-py:v3.1.1"
imagePullPolicy: Always
mainApplicationFile: local:///opt/spark/examples/src/main/python/pi.py
sparkVersion: "3.1.1"
restartPolicy:
type: OnFailure
onFailureRetries: 3
onFailureRetryInterval: 10
onSubmissionFailureRetries: 5
onSubmissionFailureRetryInterval: 20
driver:
cores: 1
coreLimit: "1200m"
memory: "512m"
labels:
version: 3.1.1
serviceAccount: spark
executor:
cores: 1
instances: 1
memory: "512m"
labels:
version: 3.1.1Para fazer o Operator executar essas configurações utilize o comando abaixo:
kubectl apply -f file.yaml
Caso você não queira calcular o PI e sim executar sua pipeline, basta criar uma imagem a partir da imagem do Google e alterar o arquivo YAML de configurações para utilizar sua imagem Docker:
Exemplo de Dockerfile:
FROM gcr.io/spark-operator/spark-py:v3.1.1
# caso vc utilize alguma lib python além do spark
RUN pip install -r requirements.txt
# Copie seu job para dentro da imagem docker
COPY project_python_folder FOLDER/project_python_folder
# Sem esse linha vc vai tomra error de permissão na hr de executar
USER 1001OBS: não esqueça de mudar o arquivo YAML para executar o sua imagem Docker customizada.
Além disso, existem outras imagens básicas que contem versões anteriores do Spark e suporte para outras linguagens como Java, R e Scala:
Se ainda não ficou claro, abaixo temos uma live em português com tutorial de como implementar o Spark no kubernetes:






