Palabras clave: Apache NiFi, ETL, Flujos de datos, Integración de sistemas, Automatización de datos, Big Data, Data Pipeline, Low-code
Hoy en día, el manejo de grandes cantidades de datos provenientes de diversas fuentes es un desafío complejo, especialmente al intentar conectar estas fuentes y escalar los sistemas de ETL (Extracción, Transformación y Carga). La necesidad de gestionar flujos de datos en tiempo real, asegurar la integridad y seguridad de los datos, y facilitar la integración entre sistemas heterogéneos ha impulsado el desarrollo de soluciones avanzadas para la automatización de flujos de datos.
En este contexto, Apache NiFi emerge como una herramienta poderosa que simplifica y optimiza el flujo de datos, permitiendo a las organizaciones centralizar la administración de datos, reducir tiempos de procesamiento y adaptarse rápidamente a cambios en la infraestructura.
¿Qué es Apache NiFi?
Apache NiFi es un software low-code, de código abierto mantenido actualmente por la Apache Software Foundation, diseñado para automatizar el intercambio de datos entre sistemas.
Su arquitectura se basa en el concepto de flujos de datos (dataflows), que consisten en una serie de procesos conectados para capturar, procesar y entregar datos de manera eficiente y segura. Estos flujos se configuran a través de una interfaz gráfica intuitiva, lo que reduce la necesidad de escribir código personalizado y acelera el desarrollo de soluciones.
Principales Características
- Gestión de flujo: NiFi garantiza la entrega de datos a gran escala mediante almacenamiento persistente, distribución eficiente de carga y escritura anticipada. Soporta almacenamiento en búfer con contrapresión, priorización de colas y ajustes de QoS para manejar latencia, rendimiento y tolerancia a pérdidas según las necesidades del flujo.
- Facilidad de Uso: NiFi ofrece una interfaz web intuitiva y de bajo código (low-code) que facilita la creación y gestión de flujos de datos sin necesidad de programar. A través de esta interfaz, los usuarios pueden conectar nodos visualmente, configurar componentes y diseñar flujos de manera sencilla mediante arrastrar y soltar.
- Escalabilidad: NiFi está diseñado para crecer de manera flexible, permitiendo aumentar la cantidad de tareas en paralelo. Además, permite escalar dinámicamente mediante la configuración de la pestaña Scheduling en cada procesador. También permite clusterizar múltiples instancias de NiFi mediante Zookeeper.
- Extensibilidad: NiFi está diseñado para ser altamente extensible, permitiendo la creación de componentes personalizados como procesadores y servicios de controlador. Utiliza un modelo de cargador de clases aislado, asegurando que las extensiones no entren en conflicto. Además, su protocolo de comunicación S2S permite transferir datos de manera eficiente y segura entre instancias de NiFi.
Arquitectura
NiFi puede operar de forma clusterizada a partir de la versión 1.0, utilizando el paradigma de agrupación Zero-Leader. En este modelo, cada nodo realiza las mismas tareas con la información ingresada, pero repartida en diferentes nodos.
Cada nodo de nifi corre sobre una JVM en el sistema anfitrión. Y se componen por: –
Web Server: Expone el api http de NIFI y la interfaz de usuario para gestionar los flujos de datos.
Flow Controller: Coordina el procesamiento y distribución de los flujos, tanto los procesadores como las extensiones.
Extensiones: Son los componentes que amplían las funcionalidades de NiFi, como los Procesadores, Controladores de servicios, y otros módulos.
Repositorio de Flowfile: Rastrea el estado de los FlowFiles, y su ubicación en el flujo de la aplicación.
Repositorio de Contenido: Guarda la información real del contenido de los FlowFiles.
Repositorio de Procedencia: Guarda los eventos de procedencia, permitiendo la trazabilidad y auditoría de los datos.
¿Por qué usar NIFI?
Nifi es una herramienta muy potente y altamente escalable a la hora de conectar diferentes fuentes de datos, transformarlos y entregarlos a destinos variados. Su capacidad para manejar flujos de datos en tiempo real, junto con una administración visual simplificada, lo convierte en una opción ideal para empresas que buscan automatizar procesos complejos y reducir la intervención manual. Algunas de sus ventajas clave son:
- NiFi ofrece integración con una variedad de orígenes y destinos, como Kafka, RabbitMQ, HTTP, WebSockets, y bases de datos SQL y NoSQL, entre otros. Además, es extensible mediante complementos personalizados.
- Su Repositorio de Procedencia permite visualizar y rastrear el flujo de los datos desde su origen hasta el destino, facilitando auditorías, diagnósticos y cumplimiento normativo.
- NiFi permite conectar múltiples nodos, con la capacidad de escalar horizontalmente para manejar grandes volúmenes de datos. Asimismo, permite ajustar dinámicamente la carga por flujo y proceso, garantizando un procesamiento eficiente y continuo incluso bajo alta demanda.
Casos de Uso
NiFi es ampliamente utilizado en diferentes industrias y empresas como:
- Micron: Utilizan NiFi para extraer información de todas sus fábricas alrededor del mundo, con el objetivo de realizar análisis de datos e integrarlos de manera centralizada para optimizar el análisis de negocio.
- Datavolo: Utiliza NiFi para mejorar la gestión y el procesamiento de datos dentro de su plataforma, especialmente para flujos de trabajo de datos complejos.
Usemos Nifi
Existen varias formas de instalar NiFi, pero en este caso optamos por usar Docker Compose para simplificar el proceso y facilitar la visualización de la información.
services:
nifi:
image: apache/nifi:2.0.0-M4
environment:
– SINGLE_USER_CREDENTIALS_PASSWORD=supersecretPasssword1234#
– SINGLE_USER_CREDENTIALS_USERNAME=admin
ports:
– 8443:8443
– 8081:8081
Una vez que tengas el docker-compose.yaml, en tu terminal de preferencia ejecuta:
docker compose up
NiFi estará disponible en la ruta localhost:8443, con el usuario admin y la contraseña supersecretPasssword1234#.
Al acceder a NiFi por primera vez, verás un lienzo vacío. Este es el espacio donde podrás crear y gestionar los flujos de trabajo de NiFi. A continuación, te explico los elementos clave que encontrarás en la interfaz:
- Lienzo Este es el área principal donde arrastrarás y conectarás los distintos procesadores para formar tu flujo de datos.
- En la parte superior se encuentran las herramientas para agregar diferentes componentes a tu flujo, tales como:
- Procesadores: Los componentes que realizan las tareas de procesamiento de datos (por ejemplo, leer, transformar o escribir datos).
- Input y Output Ports: Puertos que permiten la entrada y salida de datos, conectando procesadores con otros flujos o sistemas externos.
- Agrupación de procesadores: Puedes agrupar varios procesadores para mejorar la visualización y organización del flujo de trabajo. Esto ayuda a mantener un diseño limpio y facilita la gestión de flujos complejos.
- Funnel: Un componente útil para conectar múltiples colas de datos, permitiendo que los flujos de datos se unan de manera ordenada y eficiente antes de ser procesados por otros componentes.
- Label: Un campo que puedes usar para documentar o etiquetar partes de tu flujo de trabajo, mejorando la claridad y comprensión del diseño.
- Importación de grupos de procesos: Desde el panel de herramientas, tienes la opción de importar grupos de procesos completos desde un repositorio, lo que permite reutilizar flujos de trabajo ya definidos por otros usuarios o comunidades.
Vamos a realizar nuestro primer flujo, el cual generará Flowfiles. Cada cierto tiempo y deberá hacer log de Hello World – ${Hora-De-Envío}. Para ello en la parte superior arrastraremos el icono del procesador hasta el lienzo y buscaremos GenerateFlwfile, al seleccionarlo aparecerá en el Lienzo.
Hacemos doble Clic en el procesador, veremos un panel como este en donde podemos visualizar las pestañas:
- Setting: Configura nombre, frecuencia de ejecución (Run Schedule), y relaciones auto-terminadas.
- Scheduling: Controla cuándo y cómo se ejecuta el procesador, como intervalo (Run Schedule) y concurrencia.
- Properties: Define propiedades específicas del procesador, como el contenido de los FlowFiles.
- Relationships: Gestiona conexiones entre procesadores según el resultado (éxito o fallo).
Ahora modificaremos las siguientes propiedades:
- Custom Text (Properties): Cambia a: Hello World – ${now():format(‘yyyy-MM-dd HH:mm:ss’)}.
- Run Schedule (Scheduling): Configura para ejecutarse cada 5 segundos.
A continuación, buscamos y arrastramos el procesador ExtractText al lienzo, colocándolo cerca de GenerateFlowFile. Para conectar ambos procesadores: pasa el ratón sobre GenerateFlowFile, haz clic en la flecha que aparece, arrastrala hasta ExtractText y confirma con Aceptar. El resultado debería lucir así:
Configuramos ExtractText de la siguiente manera:
- Unmatched (Relationships): Debe estar seleccionado terminate
- Content (Properties): Debemos crear esa propiedad en el símbolo + en la esquina superior derecha, PropertyName debe ser content y Value debe ser (?s)(.*).
Por último, buscamos y arrastramos el procesador LogMessage al lienzo y conectamos ExtractText a este mediante la relación matched. Modificamos las siguientes propiedades en el procesador LogMessage:
- Relationships: Configura success como terminate.
- Properties: Establece Log Message con el valor: ${content}.
Finalmente, hacemos clic derecho en el lienzo y presionamos Start, esto hará que todos los procesadores comiencen a trabajar, el resultado debería ser algo como:
Ahora podremos visualizar los logs del contenedor y veremos algo como lo siguiente cada segundo:
nifi-1 | 2024-11-20 14:10:30,182 INFO [Timer-Driven Process Thread-2] o.a.nifi.processors.standard.LogMessage LogMessage[id=49d3f62f-0193-1000-d4c9-cea3860724f4] Hello World – – 2024-11-20 14:10:30
nifi-1 | 2024-11-20 14:10:31,188 INFO [Timer-Driven Process Thread-5] o.a.nifi.processors.standard.LogMessage LogMessage[id=49d3f62f-0193-1000-d4c9-cea3860724f4] Hello World – – 2024-11-20 14:10:31
nifi-1 | 2024-11-20 14:10:32,184 INFO [Timer-Driven Process Thread-8] o.a.nifi.processors.standard.LogMessage LogMessage[id=49d3f62f-0193-1000-d4c9-cea3860724f4] Hello World – – 2024-11-20 14:10:32
nifi-1 | 2024-11-20 14:10:33,189 INFO [Timer-Driven Process Thread-2] o.a.nifi.processors.standard.LogMessage LogMessage[id=49d3f62f-0193-1000-d4c9-cea3860724f4] Hello World – – 2024-11-20 14:10:33
Ver más: https://nifi.apache.org/
En conclusión, Apache NiFi se presenta como una solución clave para las empresas que necesitan gestionar grandes volúmenes de datos de manera eficiente y en tiempo real. Su capacidad de integración con diversas fuentes y destinos, junto con su arquitectura flexible y escalable, lo convierte en una herramienta poderosa para automatizar flujos de datos y mejorar la eficiencia operativa.