Apache NiFi: Introducción

Última actualización:

En esta entrada repasamos los aspectos clave de la herramienta de ETL para Big Data Apache NiFi.

Qué es Apache NiFi

¿Qué es Apache NiFi? Aspectos clave

Apache NiFi es un sistema distribuido dedicado a extraer, transformar y cargar datos (ETL). Es Open Source y está desarrollado y mantenido por la Apache Software Foundation.

En la web del proyecto podemos encontrar la siguiente definición:

An easy to use, powerful, and reliable system to process and distribute data.

NiFi (o Ni-Fi) ha sido diseñado para poder automatizar de una manera eficiente y visual los flujos de datos entre distintos sistemas: ingesta, enrutado y gestión. Para ello, cuenta con más de 300 conectores externos ya implementados y además es posible añadir conectores a medida.

Uno de los puntos fuertes de NiFi es la capacidad para programar flujos de datos arrastrando y conectando los componentes necesarios sobre los canvas de la web de administración. No es necesario por tanto tener conocimientos de programación específicos, sino entender y configurar correctamente cada uno de los componentes que se quieren usar.

Aunque se pueda considerar una herramienta ETL, NiFi no está realmente optimizado para realizar transformaciones de datos complejas o pesadas. Es posible realizar transformaciones de datos ligeras pero no es un motor de transformaciones batch completo. Aún así es común su uso integrado en sistemas Big Data, ya que ofrece muchas ventajas como herramienta de automatización de ingestas de datos y para realizar transformaciones y limpiezas sencillas.

Componentes principales de Apache NiFi

Flow: El workflow o topología es la definición del flujo de datos que se implementa en NiFi e indica la forma en la que se deben gestionar los datos.

Flowfile: Es el paquete de datos que viaja por el flow entre los procesadores. Está compuesto por un puntero al propio dato útil o contenido (un array de bytes) y metadatos asociados llamados atributos. Los atributos pares clave-valor editables y NiFi los usa para enriquecer la información de provenance. Los metadatos más importantes son el identificador (uuid), el nombre del fichero (filename) y el path.

Para acelerar el rendimiento del sistema, el flowfile no contiene el propio dato, sino que apunta al dato en el almacenamiento local. Muchas de las operaciones que se realizan en NiFi no alteran el propio dato ni necesitan cargarlo en memoria. En concreto, el dato se encuentra en el llamado repositorio de contenido (Content Repository)

Flowfile de Apache NiFi
Flowfile de Apache NiFi

Processor: Los procesadores son los componentes principales de NiFi. Se encargan de ejecutar el proceso de extracción, transformación o carga de datos. NiFi permite realizar operaciones diversas en los processors, así como distribuir y programar su ejecución. Estos componentes también proporcionan una interfaz para acceder a los flowfiles y sus propiedades. Se pueden implementar nuevos processors personalizados mediante una api de programación en Java o bien usar los más de 280 processors existentes.

Los processors permiten abstraer la complejidad de la programación concurrente y pueden ejecutar en varios nodos de forma simultánea o bien en el nodo primario del clúster. Además, es posible programar su ejecución mediante cron, tiempo predefinido o mediante eventos de entrada. Los processors también tienen relaciones de salida (connections) en función de su comportamiento, por ejemplo éxito (success), fallo (failure) o reintento (retry). Llevan incorporado un validador de configuración y gráficas con las estadísticas de uso e indicadores de trazabilidad.

Connection: Son las tuberías de conexión entre dos Processors que les permiten interactuar. Es la encargada de transmitir los flowfiles entre los componentes y de gestionar las colas y su capacidad. Las conexiones actúan como un buffer para los flowfiles, y tienen un sistema de backpressure en función del número de eventos o del tamaño en disco. También es posible establecer la caducidad para los flowfiles o su prioridad. Mediante los funnels, NiFi permite agrupar varias conexiones en una.

Process Group: Agrupación de processors y connections para tratarlos como una unidad lógica independiente dentro del flujo de procesamiento. Para interactuar con el resto de componentes tienen puertos de entrada y de salida que gestionan el envío de flowfiles.

NiFi también incorpora los llamados Remote Process Groups (RPGs). Permiten tratar otra instancia o clúster externo de NiFi como un Process Group con el que interactuar. En vez de mover flowfiles entre diferentes process groups, se mueven entre distintos clústers. Los puertos de entrada y de salida actúan como puertas de entrada para los flowfiles.

Controller Service: Los controller service o controladores se utilizan para compartir un recurso entre distintos processors. Por ejemplo puede ser una conexión a una base de datos, a S3 o a un contenedor de Azure.

Apache NiFi también nos permite crear plantillas (templates) con un flow almacenado. Las plantillas resultan muy útiles para añadir de forma rápida un nuevo conjunto de componentes estándar o mover sub-flujos entre distintos entornos de trabajo.

Arquitectura de Apache NiFi

Apache NiFi es una aplicación Java que ejecuta en la JVM. En la imagen a continuación podemos ver los componentes más importantes de su arquitectura.

Arquitectura Apache NiFi
Arquitectura de Apache NiFi

El Flowfile Repository o repositorio de flowfiles almacena los atributos y del estado de cada flujo del sistema, junto a las referencias al contenido. También almacena la cola en la que se encuentra en ese momento. Mantiene solamente el estado más actualizado del sistema mediante el Write-Ahead Log, lo que garantiza recuperar el estado más actualizado frente a una caía del sistema.

Los flowfiles se almacenan en un Hashmap en memoria. Cuando el número de flowfiles en esta estructura excede el establecido en la propiedad nifi.queue.swap.threshold, NiFi los escribe a un fichero swap en disco según su prioridad.

El Content Repository mantiene todo el contenido de los flowfiles. Cada vez que un dato se modifica se realiza una copia para no perder el original (copy on write). Pueden existir varios content repositories en un sistema, cada uno de ellos llamado contenedor y a su vez dividido en secciones.

Por último el Provenance Repository se encarga de almacenar la información de la procedencia y el origen de cada flowfile mediante snapshots a partir de los que se podría restaurar el ciclo de vida de cada uno. Este repositorio añade la dimensión del tiempo.

En los sistemas en los que NiFi tiene un volumen de datos muy alto, es posible que el content repository llene el disco, y en el caso de que el flowfile repository se encuentre en el mismo disco, podría corromper su contenido, por lo que es algo a tener en cuenta al diseñar la solución.

NiFi Registry

Apache NiFi Registry es un subproyecto de Apache NiFi complementario enfocado en el almacenamiento de recursos compartidos en una localización centralizada. Su utilidad principal es el uso como repositorio de configuraciones.

Uno de los usos más comunes de NiFi Registry es almacenar y gestionar las versiones de los flujos en los llamados buckets, así como definir usuarios y permisos de acceso a estas configuraciones. De esta forma podremos tener mucho más control sobre los cambios que se producen en los flujos e incluso restaurar versiones anteriores con facilidad.

MiNiFi

Con la cantidad de dispositivos nuevos IoT y su crecimiento, existe la necesidad de recoger y trasladar los datos que generan a la nube para su explotación. Ingestar y validar estos datos supone un gran desafío en el que NiFi puede jugar un papel fundamental.

MiNiFi es el proyecto de NiFi para dispositivos de este tipo. Actúa como agente ligero que puede enviar datos a un sistema NiFi y realizar operaciones sencillas en el lugar en el que se generan los datos. Realiza una tarea complementaria con un consumo mínimo de recursos. Existen agentes en C++ y Java. El agente en C++ es más ligero en uso de memoria y disco pero no contiene todos los processors disponibles en la versión Java. Estos agentes garantizan la entrega de datos y la gestión de colas, buffers y backpressure.

Ejemplo de flujo en NiFi

En la imagen a continuación podemos ver un ejemplo de un flujo en Apache NiFi. Este flujo se compone de tres processors: GenerateFlowFile, PutFTP y PutFile.

Ejemplo de Flujo en Apache NiFi
Ejemplo de Flujo en Apache NiFi

También existen 3 conexiones, cada una de ellas se corresponde un un evento particular generado por el processor del que parte. Actúan de cola para los flowfiles generados.

El propósito del flujo es generar flowfiles aleatorios en el primer processor, escribirlos en un servidor FTP en el segundo processor, y en el caso de que esta escritura falle o sea rechazada, escribir los datos en el disco local mediante el processor PutFile. Esta última operación se reintentará en el caso de fallo de la escritura.

Ventajas

  • Facilidad de uso mediante UI
  • Escalable horizontalmente
  • Gran cantidad de componentes out-of-the-box (processors y conectores)
  • Es posible implementar nuevos componentes y procesadores (programando con la API de Java)
  • Se encuentra en constante evolución y con una gran comunidad
  • Incorpora auditoría del dato
  • Tiene integrada la validación de configuraciones
  • Política de Usuarios (LDAP)
  • Software multiplataforma
  • Linaje de datos integrada, de cara a cumplir regulaciones.
  • Uso para enrutar mensajes a microservicios

Inconvenientes

  • Las versiones por debajo de 1.x no disponen de HA
  • Consumo de recursos de hardware muy elevado en función de la carga de procesamiento
  • Apache Flume es más ligero y adecuado para realizar transformaciones de datos simples
  • Apache Storm hace mejor uso de recursos en caso de transformaciones complejas

Alternativas a Apache NiFi

Existen alternativas a Apache NiFi como soluciones para gestionar dataflows, cada una con sus particularidades:

  • Streamsets
  • Azure Data Factory
  • AWS Data Pipeline

Preguntas Frecuentes de Apache NiFi – FAQ

¿Para qué se usa Apache NiFi?

Apache NiFi es una herramienta open source para integrar y automatizar flujos de datos. Permite realizar operaciones de transformación, extracción y carga sobre grandes cantidades de datos con gran flexibilidad y de una manera visual.

¿Es Apache NiFi una herramienta ETL?

Apache NiFi se puede considerar una herramienta de ETL o formar parte de un sistema más complejo. Sin embargo, NiFi no está optimizado para realizar transformaciones de datos muy complejas y pesadas de tipo batch.

¿Qué es un flow file en Apache NiFi?

Un flow file en NiFi es un contenedor de datos que viaja por el flujo. Se compone de la carga útil (dato) y los metadatos asociados llamados atributos editables que soportan las operaciones de NiFi.

¿Qué es un procesador en Apache NiFi?

Un procesador o processor de NiFi es el componente encargado de ejecutar alguna acción sobre los datos o el flujo. Proporcionan la interfaz para acceder a los flow files y sus contenidos.


A continuación el vídeo-resumen en español. ¡No te lo pierdas!


¡Echa un ojo a mi lista de reproducción de Big Data en Youtube!

Si te ayuda el contenido del blog, por favor considera unirte a la lista de correo para reconocer el trabajo!

Deja una respuesta