Apache Flink vs. Apache Spark

Si se observa esta imagen con una lista de herramientas de big data, puede parecer que todos los nichos posibles en este campo ya están ocupados. Con tanta competencia, debe ser muy difícil llegar a una tecnología innovadora.

Los creadores de Apache Flink tienen un pensamiento diferente sobre esto. Comenzó como un proyecto de investigación llamado Stratosphere. Stratosphere se bifurcó, y esta bifurcación se convirtió en lo que conocemos como Apache Flink. En 2014, fue aceptado como un proyecto de la Incubadora de Apache, y apenas unos meses después, se convirtió en un proyecto de alto nivel de Apache. En el momento de escribir este artículo, el proyecto cuenta con casi doce mil commits y más de 300 colaboradores.

¿Por qué hay tanta atención? Esto se debe a que Apache Flink fue llamado un marco de procesamiento de big data de nueva generación y tiene suficientes innovaciones en su haber para reemplazar a Apache Spark y convertirse en la nueva herramienta de facto para el procesamiento de lotes y flujos.

¿Deberías cambiar a Apache Flink? ¿Deberías quedarte con Apache Spark por un tiempo? ¿O es Apache Flink sólo un nuevo truco? Este artículo intentará darte respuestas a estas y otras preguntas.

A menos que hayas estado viviendo bajo una roca durante el último par de años, habrás oído hablar de Apache Spark. Parece que cada sistema moderno que hace cualquier tipo de procesamiento de datos está utilizando Apache Spark de una manera u otra.

Durante mucho tiempo, Spark fue la última y mejor herramienta en esta área. Ofreció algunas características impresionantes en comparación con sus predecesores como:

  • Velocidad impresionante: Es diez veces más rápido que Hadoop si los datos se procesan en un disco y hasta 100 veces más rápido si los datos se procesan en la memoria.
  • Modelo de grafos acíclicos dirigidos más simple: En lugar de definir sus trabajos de procesamiento de datos utilizando el marco rígido de MapReduce, Spark permite definir un grafo de tareas que puede implementar complejos algoritmos de procesamiento de datos
  • Procesamiento en flujo: Con la llegada de nuevas tecnologías como el Internet de las Cosas, no basta con procesar una enorme cantidad de datos. Ahora, necesitamos procesar una gran cantidad de datos a medida que llegan en tiempo real. Por eso Apache Spark ha introducido el procesamiento de flujos que permite procesar un flujo de datos potencialmente infinito.
  • Rico conjunto de bibliotecas: Además de sus características principales, Apache Spark proporciona potentes bibliotecas para el aprendizaje automático, el procesamiento de gráficos y la realización de consultas SQL.

Para tener una mejor idea de cómo se escriben las aplicaciones con Apache Spark, echemos un vistazo a cómo se puede implementar una sencilla aplicación de recuento de palabras que contaría cuántas veces se utilizó cada palabra en un documento de 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(_ + _)

Si conoces Scala, este código debería parecer sencillo y es similar a trabajar con colecciones regulares. En primer lugar, leemos una lista de líneas de un archivo ubicado en archivo/ruta». Este archivo puede ser un archivo local o un archivo en HDFS o S3.

Entonces, cada línea se divide en una lista de palabras utilizando el método flatMap que simplemente divide una cadena por el símbolo de espacio. Luego, para implementar el conteo de palabras, utilizamos el método map para convertir cada palabra en un par donde el primer elemento del par es una palabra del texto de entrada y el segundo elemento es simplemente un número uno.

El último paso simplemente cuenta cuántas veces se utilizó cada palabra sumando los números de todos los pares para la misma palabra.

Apache Spark parece una herramienta genial y versátil. Pero, ¿qué aporta Apache Flink?

A primera vista, no parece haber muchas diferencias. El diagrama de arquitectura parece muy similar:

Si echamos un vistazo al ejemplo de código de la aplicación de recuento de palabras para Apache Flink, veremos que casi no hay diferencias:

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

Las pocas diferencias notables, es que en este caso necesitamos usar el método readTextFile en lugar del método textFile y que necesitamos usar un par de métodos: groupBy y sum en lugar de reduceByKey.

Entonces, ¿a qué viene todo este lío? Puede que Apache Flink no tenga diferencias visibles por fuera, pero definitivamente tiene suficientes innovaciones, para convertirse en la herramienta de procesamiento de datos de la próxima generación. Aquí están algunas de ellas:

  • Implementa el procesamiento de streaming real: Cuando se procesa un flujo en Apache Spark, lo trata como muchos problemas de lotes pequeños, de ahí que el procesamiento de flujos sea un caso especial. Apache Flink, por el contrario, trata el procesamiento por lotes como algo especial y no utiliza el micro batching.
  • Mejor soporte para el procesamiento cíclico e iterativo: Flink proporciona algunas operaciones adicionales que permiten implementar ciclos en tu aplicación de streaming y algoritmos que necesitan realizar varias iteraciones sobre datos en lote.
  • Gestión de memoria personalizada: Apache Flink es una aplicación Java, pero no depende totalmente del recolector de basura de la JVM. Implementa un gestor de memoria personalizado que almacena los datos a procesar en matrices de bytes. Esto permite reducir la carga del recolector de basura y aumentar el rendimiento. Puedes leer sobre ello en esta entrada del blog.
  • Menor latencia y mayor rendimiento: Múltiples pruebas realizadas por terceros sugieren que Apache Flink tiene menor latencia y mayor rendimiento que sus competidores.
  • Potentes operadores de Windows: Cuando necesitas procesar un flujo de datos en la mayoría de los casos necesitas aplicar una función a un grupo finito de elementos en un flujo. Por ejemplo, puede necesitar contar cuántos clics ha recibido su aplicación en cada intervalo de cinco minutos, o puede querer saber cuál ha sido el tuit más popular en Twitter en cada intervalo de diez minutos. Aunque Spark soporta algunos de estos casos de uso, Apache Flink proporciona un conjunto mucho más potente de operadores para el procesamiento de flujos.
  • Implementa instantáneas distribuidas ligeras: Esto permite que Apache Flink proporcione una baja sobrecarga y garantías de procesamiento de una sola vez en el procesamiento de flujos, sin utilizar micro lotes como hace Spark.

Así que, estás trabajando en un nuevo proyecto, y necesitas elegir un software para él. ¿Qué debería usar ypi? ¿Spark? ¿Flink?

Por supuesto, no hay una respuesta correcta o incorrecta aquí. Si necesitas hacer un procesamiento de flujos complejo, entonces yo recomendaría usar Apache Flink. Tiene un mejor soporte para el procesamiento de flujos y algunas mejoras significativas.

Si no necesitas características de procesamiento de flujos de última generación y quieres permanecer en el lado seguro, puede ser mejor seguir con Apache Spark. Es un proyecto más maduro que tiene una mayor base de usuarios, más materiales de formación y más bibliotecas de terceros. Pero ten en cuenta que Apache Flink está cerrando esta brecha a cada minuto. Cada vez son más los proyectos que eligen Apache Flink a medida que se convierte en un proyecto más maduro.

Si por el contrario, te gusta experimentar con la última tecnología, definitivamente tienes que darle una oportunidad a Apache Flink.

¿Significa todo esto que Apache Spark está obsoleto y que en un par de años todos vamos a utilizar Apache Flink? La respuesta puede sorprenderte. Mientras que Flink tiene algunas características impresionantes, Spark no se queda igual. Por ejemplo, Apache Spark introdujo la gestión de memoria personalizada en 2015 con el lanzamiento del proyecto Tungsten, y desde entonces, ha ido añadiendo características que fueron introducidas por primera vez por Apache Flink. El ganador aún no está decidido.

En las próximas entradas del blog escribiré más sobre cómo puedes usar Apache Flink para el procesamiento de lotes y flujos, así que ¡estate atento!

Si quieres saber más sobre Apache Flink, puedes echar un vistazo a mi curso de Pluralsight donde cubro Apache Flink con más detalle. Aquí tienes un breve avance de este curso.

Deja un comentario