Introducción a Apache Flink — AprenderBigData.com

Oscar Fmdc
5 min readApr 2, 2019

--

En esta entrada realizamos una introducción a apache Flink repasando sus aspectos clave. En qué consiste esta herramienta de procesamiento en streaming Big Data y su arquitectura.

Apache Flink es un framework de código abierto orientado al procesamiento de flujos de datos en streaming de forma distribuida y con alta disponibilidad. Las características más importantes de Apache Flink son las siguientes:

  • Procesamiento de flujos de datos: resultados en tiempo real a partir de flujos de datos
  • Procesamiento Batch: Procesamiento de datos históricos y estáticos
  • Aplicaciones orientadas a eventos: Acciones y servicios a partir de datos en tiempo real

Una Tupla en terminología de streaming consiste en un conjunto de elementos o de tipos de datos simples guardados de forma consecutiva. De esta forma se define un Flujo de datos como una secuencia infinita de tuplas.

Sobre un flujo de datos se pueden realizar dos tipos de operaciones:

Operaciones sin estado (stateless)

Obtienen una tupla como resultado de procesar una única tupla de entrada. Los operadores sin estado más comunes son los siguientes:

  • Map: Transforma el esquema de la tupla en un nuevo esquema.
  • Filter: Descarga o enruta las tuplas dependiendo de las condiciones.
  • Union: Combina varias secuencias de tuplas que comparten esquema.

Operadores con estado (stateful)

Son capaces de operar sobre N tuplas de entrada para generar una tupla de salida. Los operadores con estado más comunes son los siguientes:

  • Agregación: Funciones de agregación.
  • Equijoin: Empareja tuplas de dos secuencias con el mismo criterio.

Características de Apache Flink

  • Es capaz de procesar datos de entrada fuera de orden o que llegan con retraso (tardíos)
  • Mantiene el estado de la aplicación (agregación y resumen de datos)
  • Es tolerante a fallos (para ello usa puntos de control y reproceso de datos)
  • La garantía de entrega es exactamente una vez (exactly once)
  • Es Escalable y soporta miles de nodos manteniendo una latencia baja
  • Puede ejecutar sobre YARN, Mesos, Kubernetes, Docker o standalone
  • Flink es independiente de Hadoop pero:
  • Se integra bien con HDFS, YARN o HBase
  • Flink puede usar HDFS para leer datos o escribir resultados y checkpoints/snapshots
  • Se puede desplegar con YARN
  • Se integra con los módulos de seguridad de Kerberos de YARN y HDFS
  • Tiene autoscaling y cambia dinámicamente el paralelismo de operadores
  • Permite el escalado y las actualizaciones sin downtime, lo que incluye cambios en código, cambios de paralelismo y actualizaciones de framework
Arquitectura de Apache Flink

Requisitos de Flink

  • Java 8
  • La API para Scala es opcional y depende de Scala 2.11
  • Para tener alta disponibilidad (HA) sin un único punto de fallo depende de Apache Zookeeper
  • Para configurar la recuperación ante fallos, Flink necesita alguna forma de almacenamiento distribuido para los checkpoints (HDFS / S3 / NFS / SAN / GFS / Kosmos / Ceph / …)

Librerías y componentes de Flink

  • DataStream API: Permite procesar conjuntos infinitos de datos (en modo Streaming)
  • DataSet API: Permite procesar conjuntos finitos de datos (en modo Batch)
  • Contiene una librería CEP (Complex Event Processing)
  • El lenguaje SQL opera sobre unas abstracciones llamadas tablas
  • FlinkML es una librería para implementar algoritmos de Machine Learning
  • FlinkSpector permite definir pruebas unitarias sobre flujos de datos y operadores. Para ello ejecuta flujos de datos localmente y se encarga de verificar los resultados con las expectativas definidas

Control temporal de eventos en Flink

Existen tres controles temporales importantes en Flink:

  • Event Time: Momento en el que se creó un evento. Por lo general, se describe mediante una marca de tiempo generada por el sensor o el productor del dato.
  • Ingestion Time: Momento en el que un evento ingresa en el flujo de datos de Flink en el origen.
  • Processing Time: Tiempo local de cada operador que realiza una operación basada en tiempo

Las ventanas temporales permiten tratar las secuencias infinitas con unos recursos limitados (memoria) dividiendo los datos de entrada en partes finitas. Se basan en la idea de que sólo los datos más recientes son relevantes.

Pueden estar basadas en tiempo o en el número de elementos y desplazarse por bloques de elementos o de la forma FIFO. El procesamiento en ventanas permite tener varios niveles de paralelismo: Paralelismo entre consultas (escalable por consultas) y paralelismo dentro de consultas (escalable por volumen de eventos).

Las ventanas se crean cuando el primer evento que pertenece a la ventana llega al sistema. La ventana vence cuando el tiempo (de evento o de procesamiento) termina y además pasa el tiempo de retraso máximo definido por el usuario.

Cada ventana tiene un Trigger que especifica las condiciones para que se aplique la función de procesamiento. Los Evictors permiten controlar el borrado de elementos de la ventana después del trigger.

Tipos de ventanas

  • Tumbling Windows: Ventanas de tamaño fijo en el tiempo. No existe solapamiento entre ventanas de este tipo.
  • Sliding Windows: Asignan elementos a ventanas de un tamaño fijo, determinado por el valor Window Size. Se define la frecuencia con la que se añade una nueva ventana deslizante (Window Slide). Estas ventanas pueden solaparse si el deslizamiento es menor al tamaño de la ventana: en este caso los elementos pueden pertenecer a más de una ventana.
  • Session Windows: Permiten agrupar los elementos recibidos por claves o sesiones de actividad (user). Cada ventana vence cuando no recibe eventos que pertenezcan a ella durante un período de tiempo fijo llamado Session Gap (período de inactividad). No existe solapamiento ni un tiempo de inicio y de finalización predefinidos.
  • Global Windows: Asigna todos los elementos con la misma clave a la misma ventana. Esta ventana sólo es útil si se especifica un trigger: si no se especifica un trigger no se procesará nada, ya que no tiene fin.

Para procesar eventos que llegan al sistema con retraso, es posible extender las ventanas un tiempo establecido (de espera). De esta forma la ventana no vence hasta que no se termina este tiempo de espera.

Echa un ojo a mi lista de reproducción Introducción al Big Data

Originally published at https://aprenderbigdata.com on April 2, 2019.

--

--

No responses yet