Apache Flink

La versión actual de la página aún no ha sido revisada por colaboradores experimentados y puede diferir significativamente de la versión revisada el 12 de octubre de 2020; las comprobaciones requieren 13 ediciones .
Apache Flink
Desarrollador Fundación de software Apache
Escrito en Java [2] [1] y Scala [1]
Primera edición 6 de enero de 2015 [1]
plataforma de hardware máquina virtual de Java
ultima versión
Licencia Licencia Apache 2.0
Sitio web flink.apache.org
 Archivos multimedia en Wikimedia Commons

Apache Flink  es un marco de procesamiento de secuencias de código abierto desarrollado por Apache Software Foundation .

El marco se basa en un motor de procesamiento de procesos escrito en Java y Scala [4] [5] . Flink admite la programación de flujo de datos tanto en modo paralelo como en modo tubería (pipeline) [6] . En modo pipeline (pipeline) Flink te permite implementar una secuencia de trabajos (batch) y un flujo de trabajos (stream) [7] [8] . Flink también admite algoritmos iterativos de forma natural [9] .

Flink tiene un alto rendimiento y una baja latencia [10] , los subprocesos pueden ser activados por eventos y mantener el estado. Las tareas en el sistema Flink son tolerantes a fallas y usan estrictamente la misma semántica [11] . Los programas para el marco se pueden escribir en Java , Scala [12] , Python [13] y SQL [14] , los trabajos se compilan y optimizan automáticamente [15] , trabajando tanto en clústeres como en un servidor en la nube [16] .

Flink no cuenta con un sistema de almacenamiento propio, sino que utiliza fuentes de datos y conectores como Amazon Kinesis , Apache Kafka , Alluxio , HDFS , Apache Cassandra y ElasticSearch [17] .

Desarrollo

Apache Flink fue desarrollado bajo la licencia Apache 2.0 [18] por la comunidad Apache Flink dentro de Apache Software Foundation . El proyecto fue dirigido por 25 desarrolladores principales y más de 340 programadores colaboradores.

Los desarrolladores originales de Apache Flink fundaron Data Artisans, una empresa de 12 desarrolladores principales [19] [20] .

Resumen

La programación de flujo de datos en Apache Flink se basa en el manejo de eventos tanto para conjuntos de datos de tiempo limitado como para flujos continuos sin límites de tiempo. En el nivel inferior, los programas del sistema Flink se dividen en flujos (stream) y transformaciones (transformación). Una secuencia es conceptualmente una cola de registros que nunca puede terminar. Una transformación es una operación que recibe uno o más flujos como entrada y luego transforma los datos también en uno o más flujos [21] .

Apache Flink utiliza dos API principales: la API DataStream para transmisiones limitadas o ilimitadas y la API DataSet para conjuntos de datos limitados. Flink también es compatible con Table API para tablas, utilizando un lenguaje como SQL tanto para transmisiones como para trabajos. En el nivel más alto, Flink es compatible con el lenguaje SQL, que está semánticamente cerca de Table API y realiza consultas a través de SQL.

Modelo de programación y ejecución distribuida de tareas

En tiempo de ejecución, los programas de Flink se asignan a la transmisión [21] . Cada subproceso recibe información de una o más fuentes (por ejemplo, entrada, cola o archivo) y termina enviando datos a una o más secuencias de salida (cola de mensajes, archivos, base de datos). La corriente sufre una cantidad arbitraria de transformación. Los subprocesos forman un gráfico sin bucles, lo que permite que una aplicación se bifurque en muchos subprocesos y fusione subprocesos.

Flink sugiere conectar los flujos de entrada y salida a los almacenamientos de Alluxio , Apache Kafka , Amazon Kinesis, HDFS , Apache Cassandra , etc. [17] .

En los sistemas distribuidos, los programas de Flink pueden ejecutarse en clústeres o ser independientes, utilizando también YARN, Mesos o Docker para configurar y asignar recursos [22] .

Estados: puntos de control, puntos de guardado, conmutación por error

Apache Flink incluye un mecanismo ligero de conmutación por error que utiliza puntos de control distribuidos [11] . Un punto de control es un guardado asíncrono automático (instantánea) del estado de la aplicación en el subproceso original. En caso de falla, un programa en un entorno Flink con la opción de punto de interrupción recuperará el proceso desde el último guardado, asumiendo que Flink opera con una sola semántica de estado de aplicación. El mecanismo de punto de control utiliza ganchos en el código de la aplicación para que los sistemas externos puedan habilitar el ahorro de estado en los puntos de control (similar a las transacciones cuando se trabaja con bases de datos).

Flink también incluye un mecanismo de "savepoints", que se activan manualmente [23] . El usuario puede crear un punto de guardado, detener el programa en el entorno Flink y luego reiniciarlo desde la misma posición. Los puntos de guardado también le permiten realizar cambios en el programa sin perder el estado de la aplicación. A partir de la versión de Flink 1.2, los puntos de guardado le permiten reiniciar la aplicación en una situación de procesamiento paralelo de datos

API de transmisión de datos

La API de DataStream en el sistema Flink realiza transformaciones, como filtrado, agregación, muestreo, en flujos de datos limitados o ilimitados. La API de DataStream incluye más de 20 tipos diferentes de transformaciones que se pueden usar en Java y Scala [24] .

Aquí hay un ejemplo de un procesamiento de flujo simple para un recuento de palabras en un flujo de entrada continuo en intervalos de tiempo de cinco segundos:

importar organización . apache _ pestañear _ transmisión _ API _ escala _ _ importar org . apache _ pestañear _ transmisión _ API _ ventanas _ tiempo _ Tiempo case class WordCount ( palabra : String , cuenta : Int ) object WindowWordCount { def main ( argumentos : Array [ String ]) { val env = StreamExecutionEnvironment . getExecutionEnvironment val text = env . socketTextStream ( "host local" , 9999 ) val cuenta = texto . planoMapa { _ . a Minúsculas . división ( "\\W+" ) filtro { _ . no vacío } } . mapa { Contador de palabras ( _ , 1 ) } . keyBy ( "palabra" ) . timeWindow ( Tiempo . segundos ( 5 )) . suma ( "contar" ) cuenta _ impresión env . ejecutar ( "Contador de palabras de flujo de ventana" ) } }

En este flujo, el texto de entrada se divide en palabras mediante la operación flatMap, cada palabra se convierte en una estructura WordCount con un contador igual a uno, el flujo de objetos WordCount se agrupa por palabras e intervalos de tiempo de 5 segundos, y luego se resume por contadores, de modo que el flujo final contenga contadores de palabras para intervalos de cinco segundos.

Apache Beam - Intérprete de Flink

Apache Beam ofrece un modelo de programación unificado que permite al desarrollador crear trabajos en modo canalizado y de transmisión, y luego ejecutar los trabajos creados en el entorno Flink [25] . El Flink Executor basado en Apache Beam contiene un amplio conjunto de funciones [26] .

El ejecutor Flink está siendo desarrollado por Data Artisans [27] .

API de conjunto de datos

La API de DataSet en el sistema Flink admite operaciones de transformación de datos (como filtrado, agrupación, mapeo, unión) con conjuntos de datos de tiempo limitado. La API de DataSet ofrece alrededor de 20 tipos de transformaciones [28] . Esta API es compatible con Java y Scala, y también hay una API experimental para Python. El concepto de la API DataSet es similar al de la API DataStream.

Tabla API y SQL

Table API es un lenguaje de expresión de tipo SQL para manejar flujos y trabajos relacionales, Table API es parte de las API DataSet y DataStream para Java y Scala. Table API y la interfaz SQL correspondiente funcionan con una representación abstracta de tablas relacionales. Las tablas abstractas se pueden crear a partir de datos externos o de flujos de datos y conjuntos de datos existentes. Table API admite operaciones relacionales: selección, agregación, conexión.

Las tablas también se pueden consultar utilizando el lenguaje SQL estándar. Table API y SQL ofrecen la misma funcionalidad y se pueden combinar en el mismo programa. Las tablas se pueden volver a convertir en conjuntos de datos o flujos de datos, las operaciones lógicas se optimizan con Apache Calcite y se convierten en programas de interfaz DataSet o DataStream [29] .

Notas

  1. 1 2 3 https://projects.apache.org/json/projects/flink.json
  2. The flink Open Source Project en Open Hub: Página de idiomas - 2006.
  3. https://flink.apache.org/news/2022/10/28/1.16-announcement.html
  4. Apache Flink: Procesamiento escalable de datos por lotes y secuencias . apache.org . Consultado el 7 de febrero de 2020. Archivado desde el original el 26 de diciembre de 2018.
  5. apache/flink . GitHub . Consultado el 7 de febrero de 2020. Archivado desde el original el 28 de enero de 2019.
  6. Alexander Alexandrov, Rico Bergmann, Stephan Ewen, Johann-Christoph Freytag, Fabian Hueske, Arvid Heise, Odej Kao, Marcus Leich, Ulf Leser, Volker Markl, Felix Naumann, Mathias Peters, Astrid Rheinländer, Matthias J. Sax, Sebastian Schelter, Mareike Höger, Kostas Tzoumas y Daniel Warneke. 2014. La plataforma Stratosphere para análisis de big data . The VLDB Journal 23, 6 (diciembre de 2014), 939-964. DOI
  7. Ian Pointer. Apache Flink: el nuevo contendiente de Hadoop se enfrenta a Spark . InfoMundo (7 de mayo de 2015). Consultado el 7 de febrero de 2020. Archivado desde el original el 23 de octubre de 2018.
  8. Apache Flink. Entrevista con Volker Markl. . www.odbms.org . Consultado el 7 de febrero de 2020. Archivado desde el original el 23 de octubre de 2018.
  9. Stephan Ewen, Kostas Tzoumas, Moritz Kaufmann y Volker Markl. 2012. Flujos rápidos de datos iterativos . proc. Dotación VLDB. 5, 11 (julio de 2012), 1268-1279. DOI
  10. Comparación de motores de computación de transmisión en Yahoo! . Archivado desde el original el 1 de mayo de 2017. Consultado el 7 de febrero de 2020.
  11. ↑ 1 2 Carbone, París; Fora, Gyula; Ewen, Stephan; Haridi, Seif y Tzoumas, Kostas (2015-06-29), Instantáneas asíncronas ligeras para flujos de datos distribuidos, archivo : 1506.08603 [cs.DC]. 
  12. ↑ Documentación de Apache Flink 1.2.0 : Guía de programación de la API de Flink DataStream  . ci.apache.org . Consultado el 23 de febrero de 2017. Archivado desde el original el 21 de enero de 2019.
  13. Documentación de Apache Flink 1.2.0:  Guía de programación de Python . ci.apache.org . Consultado el 23 de febrero de 2017. Archivado desde el original el 21 de febrero de 2017.
  14. Documentación de Apache Flink 1.2.0: Tabla y  SQL . ci.apache.org . Consultado el 23 de febrero de 2017. Archivado desde el original el 18 de mayo de 2019.
  15. Fabian Hueske, Mathias Peters, Matthias J. Sax, Astrid Rheinländer, Rico Bergmann, Aljoscha Krettek y Kostas Tzoumas. 2012. Abriendo las cajas negras en la optimización del flujo de datos . proc. Dotación VLDB. 5, 11 (julio de 2012), 1256-1267. DOI
  16. Daniel Warneke y Odej Kao. 2009. Nephele: procesamiento de datos paralelo eficiente en la nube . En Actas del segundo taller sobre computación de muchas tareas en redes y supercomputadoras (MTAGS '09). ACM, Nueva York, NY, EE. UU., Artículo 8, 10 páginas. DOI
  17. ↑ 1 2 Documentación de Apache Flink 1.2.0:  Conectores de transmisión . ci.apache.org . Consultado el 23 de febrero de 2017. Archivado desde el original el 21 de febrero de 2017.
  18. ASF Git Repos - flink.git/blob - LICENCIA (enlace descendente ) . apache.org . Consultado el 12 de abril de 2015. Archivado desde el original el 23 de octubre de 2017. 
  19. Team - data Artisans  (inglés)  (enlace inaccesible) . data-artisans.com . Consultado el 23 de febrero de 2017. Archivado desde el original el 23 de febrero de 2017.
  20. Apache Flink:  Información de la comunidad y del proyecto . flink.apache.org . Consultado el 23 de febrero de 2017. Archivado desde el original el 21 de febrero de 2017.
  21. ↑ 1 2 Documentación de Apache Flink 1.2.0 : modelo de programación de flujo de datos  . ci.apache.org . Consultado el 23 de febrero de 2017. Archivado desde el original el 21 de febrero de 2017.
  22. ↑ Documentación de Apache Flink 1.2.0 : entorno de tiempo de ejecución distribuido  . ci.apache.org . Fecha de acceso: 24 de febrero de 2017. Archivado desde el original el 21 de febrero de 2017.
  23. Documentación de Apache Flink 1.2.0: Distributed Runtime Environment -  Savepoints . ci.apache.org . Fecha de acceso: 24 de febrero de 2017. Archivado desde el original el 21 de febrero de 2017.
  24. ↑ Documentación de Apache Flink 1.2.0 : Guía de programación de la API de Flink DataStream  . ci.apache.org . Consultado el 24 de febrero de 2017. Archivado desde el original el 21 de enero de 2019.
  25. Haz Apache  . haz.apache.org . Fecha de acceso: 24 de febrero de 2017. Archivado desde el original el 25 de febrero de 2017.
  26. Matriz  de capacidad de Apache Beam . haz.apache.org . Fecha de acceso: 24 de febrero de 2017. Archivado desde el original el 25 de febrero de 2017.
  27. ¿Por qué Apache Beam? Una perspectiva de Google | Blog de Big Data y aprendizaje automático de Google Cloud |  Plataforma en la nube de Google . Plataforma en la nube de Google . Fecha de acceso: 24 de febrero de 2017. Archivado desde el original el 25 de febrero de 2017.
  28. ↑ Documentación de Apache Flink 1.2.0 : Guía de programación de la API de Flink DataSet  . ci.apache.org . Consultado el 24 de febrero de 2017. Archivado desde el original el 21 de enero de 2019.
  29. Procesamiento de transmisiones para todos con SQL y Apache  Flink . flink.apache.org . Consultado el 8 de enero de 2020. Archivado desde el original el 3 de julio de 2019.

Enlaces