04-07-2019
Apache Spark: como criar um processamento distribuído eficiente?
No dia 30 de maio a XTech Community promoveu uma sessão hands-on para explicar à comunidade como criar um processamento distribuído eficiente com Apache Spark, demonstrando as suas vantagens em relação a Hadoop MapReduce.
Mas antes de mais, o que é Spark? É uma framework de processamento paralelo e distribuído, que nos últimos anos tem sido um dos projetos mais ativos na área de Big Data, tanto na utilização como contribuição pela comunidade open source.
As Funcionalidades de Apache Spark
Como principais vantagens em relação ao Hadoop MapReduce foram apresentadas a facilidade da escrita de jobs compostos por múltiplos passos, através da API de Spark baseada em programação funcional bem como a capacidade de guardar os dados intermédios em memória.
As funcionalidades oferecidas pelo Apache Spark foram introduzidas através das suas bibliotecas embutidas, implementadas por cima do Spark Core Engine, e pela possibilidade de usar bibliotecas externas disponíveis no repositório de Spark Packages.
Conceitos de Spark Core
Após à introdução, o foco da apresentação passou para os conceitos importantes de Spark Core, tendo-se explicado:
- em que consiste o programa Driver escrito pelos developers,
- a abstração de RDD que permite paralelizar a execução de operações sobre datasets distribuídos
- os tipos de operações aplicáveis sobre os RDDs: actions e transformations.
Através de um exemplo de word count em Spark, demonstrou-se a facilidade da escrita de um primeiro job e quais os componentes envolvidos.
Foi também apresentado o resultado da execução do word count na Spark UI – interface web disponibilizada para monitorizar a execução de aplicações Spark, que permitiu explicar o significado das unidades de execução física em quais uma aplicação de Spark se divide: Job, Stage e Task.
Particionamento
O seguinte tópico abordado no meetup Spark Intro and Beyond foi o particionamento do Apache Spark. O número de partições de um RDD depende diretamente do particionamento dos dados na origem e de algumas possíveis parametrizações.
É importante perceber como funciona o particionamento uma vez que o número de partições de um RDD determina o paralelismo da execução das operações distribuídas e o seu controlo permite escrever aplicações mais eficientes, utilizando da melhor forma maneira os recursos do cluster.
Abordámos quatro técnicas para aumentar o paralelismo da execução:
- Através do 2º parâmetro da função sc.textFile(“hdfs://…”, 120)
- Aumentando o número de partições do tópico de Kafka lido
- Através do 2º parâmetro das wide transformations, e.g rdd.reduceByKey(_ + _, 100)
- Através da função rdd.repartition(120)
Redução do Shuffle Data
Por fim, mostrámos 3 técnicas que minimizam a quantidade de dados que são enviados entre dois Stages de um Job, que se designa por shuffle data, e permite aumentar a desempenho da aplicação.
Shuffles em Spark são muito pesados porque os dados são enviados em rede entre os Executors de Spark que residem em diferentes nós do cluster, e escritos para e lidos de disco pelos Executors do mesmo nó.
As técnicas apresentadas para reduzir shuffle data foram:
- Uso de operações com pré-agregação, e.g reduceByKey vs groupByKey
- Aplicar operações sobre RDDs previamente particionados e cached
- Broadcast Joins
Conclusões sobre Apache Spark
No final, para além de serem esclarecidas algumas dúvidas sobre a apresentação, foram também discutidos vários pontos relevantes como:
- Data locality e a integração do Spark em clusters Hadoop
- Cenários nos quais faz sentido aplicar processamento em Spark
- Possíveis razões de um Spark job ter um elevado tempo de execução e como diagnosticar através da Spark UI
Mais informações sobre o meetups da Xtech Community.
Leave a comment
Comments are closed.