Apache Flink vs. Apache Spark

Se olhar para esta imagem com uma lista de grandes ferramentas de dados, pode parecer que todos os nichos possíveis neste campo já estão ocupados. Com tanta competição, deve ser muito difícil criar uma tecnologia inovadora.

Apache Flink os criadores têm um pensamento diferente sobre isto. Começou como um projeto de pesquisa chamado Stratosphere. Stratosphere foi bifurcado, e este garfo tornou-se o que conhecemos como Apache Flink. Em 2014, ele foi aceito como um projeto Apache Incubator, e poucos meses depois, tornou-se um projeto Apache de alto nível. Na época deste escrito, o projeto tem quase doze mil commits e mais de 300 colaboradores.

Por que há tanta atenção? Isto porque o Apache Flink foi chamado de uma nova geração de grande estrutura de processamento de dados e tem inovações suficientes para substituir o Apache Spark e se tornar a nova ferramenta de fato para processamento em lote e stream.

Pode mudar para o Apache Flink? Você deve ficar com o Apache Spark por um tempo? Ou o Apache Flink é apenas um novo gimmick? Este artigo irá tentar dar-lhe respostas a estas e outras questões.

Sem você ter vivido debaixo de uma pedra nos últimos dois anos, você já ouviu falar do Apache Flink. Parece que todo sistema moderno que faz qualquer tipo de processamento de dados está usando Apache Spark de uma maneira ou de outra.

Por muito tempo, Spark foi a última e maior ferramenta nesta área. Ele forneceu algumas características impressionantes em comparação com seus predecessores como:

  • Velocidade impressionante: É dez vezes mais rápido que o Hadoop se os dados forem processados em um disco e até 100 vezes mais rápido se os dados forem processados na memória.
  • Modelo gráfico acíclico mais simples dirigido: Em vez de definir seus trabalhos de processamento de dados usando a estrutura rígida MapReduce Spark permite definir um gráfico de tarefas que pode implementar algoritmos complexos de processamento de dados
  • Stream processing: Com o advento de novas tecnologias como a Internet das Coisas, não é suficiente simplesmente processar uma enorme quantidade de dados. Agora, precisamos de processar uma enorme quantidade de dados à medida que eles chegam em tempo real. É por isso que o Apache Spark introduziu o processamento de fluxo que permite processar um fluxo de dados potencialmente infinito.
  • Conjunto rico de bibliotecas: Além de seus recursos principais, o Apache Spark fornece bibliotecas poderosas para aprendizado de máquina, processamento gráfico e execução de consultas SQL.

Para ter uma idéia melhor de como você escreve aplicações com o Apache Spark, vamos dar uma olhada em como você pode implementar uma aplicação simples de contagem de palavras que contaria quantas vezes cada palavra foi usada em um documento texto:

// Read fileval file = sc.textFile("file/path")val wordCount = file // Extract words from every line .flatMap(line => line.split(" ")) // Convert words to pairs .map(word => (word, 1)) // Count how many times each word was used .reduceByKey(_ + _)

Se você conhece Scala, este código deve parecer simples e é similar a trabalhar com coleções regulares. Primeiro, nós lemos uma lista de linhas de um arquivo localizado em arquivo/caminho”. Este arquivo pode ser um arquivo local ou um arquivo em HDFS ou S3.

Então, cada linha é dividida em uma lista de palavras usando o método flatMap que simplesmente divide uma string pelo símbolo de espaço. Depois, para implementar a contagem de palavras, usamos o método map para converter cada palavra num par onde o primeiro elemento do par é uma palavra do texto de entrada e o segundo elemento é simplesmente um número um.

O último passo conta simplesmente quantas vezes cada palavra foi usada, somando números para todos os pares da mesma palavra.

Apache Spark parece ser uma grande e versátil ferramenta. Mas o que o Apache Flink traz para a tabela?

À primeira vista, não parece haver muitas diferenças. O diagrama de arquitetura parece muito similar:

Se você der uma olhada no exemplo do código da aplicação de contagem de palavras para o Apache Flink, você verá que quase não há diferença:

val file = env.readTextFile("file/path")val counts = file .flatMap(line => line.split(" ")) .map(word => (word, 1)) .groupBy(0) .sum(1)

Poucas diferenças notáveis, é que neste caso precisamos usar o método readTextFile em vez do método textFile e que precisamos usar um par de métodos: groupBy e sum em vez de reduceByKey.

Então porquê tanto alarido? O Apache Flink pode não ter nenhuma diferença visível no exterior, mas definitivamente tem inovações suficientes, para se tornar a ferramenta de processamento de dados da próxima geração. Aqui estão apenas algumas delas:

  • Implementa o processamento de streaming real: Quando você processa um fluxo no Apache Spark, ele o trata como muitos pequenos problemas de lote, fazendo do processamento de fluxo um caso especial. Apache Flink, em contraste, trata o processamento em lote como especial e não usa micro batch.
  • Melhor suporte para o processamento cíclico e iterativo: Flink fornece algumas operações adicionais que permitem implementar ciclos em sua aplicação de streaming e algoritmos que precisam executar várias iterações em dados de lote.
  • Gerenciamento de memória personalizado: Apache Flink é uma aplicação Java, mas não depende inteiramente de um coletor de lixo JVM. Ele implementa um gerenciador de memória personalizado que armazena dados para processar em arrays de bytes. Isto permite reduzir a carga em um coletor de lixo e aumentar a performance. Você pode ler sobre isso neste blog post.
  • Menor latência e maior rendimento: Vários testes feitos por terceiros sugerem que o Apache Flink tem menor latência e maior rendimento do que seus concorrentes.
  • Poderosos operadores de janelas: Quando você precisa processar um fluxo de dados na maioria dos casos, você precisa aplicar uma função a um grupo finito de elementos em um fluxo. Por exemplo, você pode precisar contar quantos cliques sua aplicação recebeu em cada intervalo de cinco minutos, ou você pode querer saber qual foi o tweet mais popular no Twitter em cada intervalo de dez minutos. Enquanto Spark suporta alguns desses casos de uso, o Apache Flink fornece um conjunto muito mais poderoso de operadores para o processamento de stream.
  • Implementa snapshots leves distribuídos: Isto permite que o Apache Flink forneça baixa sobrecarga e apenas uma garantia de processamento no processamento de stream, sem usar micro batch como o Spark faz.

Então, você está trabalhando em um novo projeto, e você precisa escolher um software para ele. O que deve usar o ypi? Spark? Flink?

Obviamente, não há resposta certa ou errada aqui. Se você precisa fazer processamento complexo de fluxo, então eu recomendaria usar o Apache Flink. Ele tem melhor suporte para processamento de stream e algumas melhorias significativas.

Se você não precisa de recursos de processamento de stream e quer ficar do lado seguro, talvez seja melhor ficar com o Apache Spark. É um projeto mais maduro, tem uma base de usuários maior, mais materiais de treinamento, e mais bibliotecas de terceiros. Mas tenha em mente que o Apache Flink está fechando essa lacuna a cada minuto. Mais e mais projetos estão escolhendo o Apache Flink à medida que ele se torna um projeto mais maduro.

Se por outro lado, você gosta de experimentar com a mais recente tecnologia, você definitivamente precisa dar uma chance ao Apache Flink.

Tudo isso significa que o Apache Flink está obsoleto e em alguns anos todos nós vamos usar o Apache Flink? A resposta pode surpreendê-lo. Enquanto Flink tem algumas características impressionantes, Spark não está ficando na mesma. Por exemplo, o Apache Spark introduziu o gerenciamento de memória personalizado em 2015 com o lançamento do projeto Tungsten, e desde então, ele vem adicionando funcionalidades que foram introduzidas pela primeira vez pelo Apache Flink. O vencedor ainda não está decidido.

Nos próximos posts no blog eu vou escrever mais sobre como você pode usar o Apache Flink para processamento batch e stream, então fique ligado!

Se você quiser saber mais sobre o Apache Flink, você pode dar uma olhada no meu curso Pluralsight onde eu cubro o Apache Flink em mais detalhes. Aqui está uma pequena amostra deste curso.

Deixe um comentário