Instalación de Apache NiFi para Gestión de Flujos de Datos

Apache NiFi es una plataforma de integración de datos con interfaz visual que permite diseñar, ejecutar y monitorizar flujos de datos complejos entre sistemas heterogéneos. Con más de 300 procesadores disponibles, NiFi facilita la ingesta, transformación y enrutamiento de datos desde bases de datos, APIs, ficheros, Kafka y decenas de otras fuentes hacia cualquier destino. Esta guía cubre la instalación en Linux, configuración básica, diseño de flujos ETL y seguridad para entornos de producción.

Requisitos Previos

  • Ubuntu 20.04/22.04 o CentOS 8+/Rocky Linux 8+
  • Java 11 o Java 17 (NiFi 2.x requiere Java 21)
  • 4 GB de RAM mínimo (8-16 GB para producción)
  • 4 vCPUs recomendado
  • 20 GB de espacio en disco para datos y provenance
  • Puerto 8443 disponible (HTTPS por defecto)

Instalación de Apache NiFi

# Instalar Java 17
sudo apt update
sudo apt install -y openjdk-17-jdk  # Ubuntu/Debian
sudo dnf install -y java-17-openjdk  # CentOS/Rocky

# Verificar versión de Java
java -version

# Crear usuario dedicado para NiFi
sudo useradd -r -s /bin/false nifi
sudo mkdir -p /opt/nifi

# Descargar la última versión estable (verificar en https://nifi.apache.org/download.html)
NIFI_VERSION=1.25.0
wget https://downloads.apache.org/nifi/${NIFI_VERSION}/nifi-${NIFI_VERSION}-bin.tar.gz -P /tmp

# Verificar suma de comprobación
wget https://downloads.apache.org/nifi/${NIFI_VERSION}/nifi-${NIFI_VERSION}-bin.tar.gz.sha256 -P /tmp
sha256sum -c /tmp/nifi-${NIFI_VERSION}-bin.tar.gz.sha256

# Extraer en el directorio de instalación
sudo tar xzf /tmp/nifi-${NIFI_VERSION}-bin.tar.gz -C /opt/nifi --strip-components=1

# Asignar propiedad al usuario nifi
sudo chown -R nifi:nifi /opt/nifi

Configuración Inicial

El archivo de configuración principal es /opt/nifi/conf/nifi.properties:

sudo -u nifi nano /opt/nifi/conf/nifi.properties

Parámetros importantes a configurar:

# Dirección web donde escucha NiFi
nifi.web.https.host=0.0.0.0
nifi.web.https.port=8443

# Directorio de datos y logs
nifi.flow.configuration.file=./conf/flow.xml.gz
nifi.database.directory=./database_repository
nifi.flowfile.repository.directory=./flowfile_repository
nifi.content.repository.directory.default=./content_repository
nifi.provenance.repository.directory.default=./provenance_repository

# Memoria para provenance (historial de datos)
nifi.provenance.repository.max.storage.size=10 GB
nifi.provenance.repository.max.storage.time=30 days

# Configuración de JVM
nifi.jvm.heap.init=1g
nifi.jvm.heap.max=4g

# Cluster (dejar vacío para instalación standalone)
nifi.cluster.is.node=false

Configurar el servicio systemd

sudo tee /etc/systemd/system/nifi.service > /dev/null <<EOF
[Unit]
Description=Apache NiFi
After=network.target

[Service]
Type=forking
User=nifi
Group=nifi
Environment="JAVA_HOME=/usr/lib/jvm/java-17-openjdk-amd64"
ExecStart=/opt/nifi/bin/nifi.sh start
ExecStop=/opt/nifi/bin/nifi.sh stop
ExecReload=/opt/nifi/bin/nifi.sh restart
PIDFile=/opt/nifi/run/nifi.pid
Restart=on-failure
LimitNOFILE=50000

[Install]
WantedBy=multi-user.target
EOF

sudo systemctl daemon-reload
sudo systemctl enable nifi
sudo systemctl start nifi

# Ver logs de inicio (puede tardar 1-2 minutos)
sudo tail -f /opt/nifi/logs/nifi-app.log

Acceso a la Interfaz Web

NiFi usa autenticación con certificados TLS por defecto. Para obtener las credenciales iniciales:

# Obtener usuario y contraseña generados automáticamente
grep -i "Generated Username" /opt/nifi/logs/nifi-app.log
grep -i "Generated Password" /opt/nifi/logs/nifi-app.log

Accede a https://tu-ip:8443/nifi en el navegador. Acepta el certificado autofirmado y usa las credenciales encontradas en los logs.

Para cambiar a autenticación con usuario/contraseña estándar:

# Usar el script de autorización incluido en NiFi
/opt/nifi/bin/nifi.sh set-single-user-credentials admin TuContraseñaSegura123!

# Reiniciar NiFi para aplicar los cambios
sudo systemctl restart nifi

Diseño de Flujos de Datos

La interfaz de NiFi tiene una zona de trabajo (canvas) donde se arrastran y conectan procesadores:

Elementos básicos:

  • Procesadores: unidades de trabajo (leer archivo, parsear JSON, enviar a BD...)
  • Conexiones: tuberías que unen procesadores con cola de mensajes integrada
  • Grupos de procesos: agrupación lógica de procesadores para organizar flujos complejos
  • Puertos: puntos de entrada/salida entre grupos de procesos

Flujo ETL típico (base de datos → JSON → S3):

  1. QueryDatabaseTableRecord: consulta una tabla de forma incremental
  2. ConvertRecord: convierte los registros de Avro a JSON
  3. SplitJson: divide el JSON en registros individuales
  4. PutS3Object: envía cada registro a un bucket S3

Procesadores Esenciales

ProcesadorUso
GetFile / ListFileLeer archivos de un directorio
QueryDatabaseTableRecordConsulta incremental a base de datos
ConsumeKafkaRecordConsumir mensajes de Kafka
InvokeHTTPLlamadas a APIs REST
JoltTransformJSONTransformar JSON con especificación Jolt
ReplaceTextModificar contenido de FlowFiles
RouteOnAttributeEnrutar basado en atributos/condiciones
PutDatabaseRecordInsertar registros en base de datos
PublishKafkaRecordPublicar en Kafka
PutS3ObjectEnviar a Amazon S3
ExecuteScriptEjecutar scripts Groovy o Python

Configurar un procesador de base de datos

# Primero, añadir el driver JDBC a NiFi
# Descargar el JAR del driver PostgreSQL
wget https://jdbc.postgresql.org/download/postgresql-42.7.0.jar -P /opt/nifi/lib/

# Reiniciar NiFi para que detecte el nuevo driver
sudo systemctl restart nifi

En la interfaz, al configurar QueryDatabaseTableRecord:

  • Database Connection Pooling Service: crear un DBCPConnectionPool
  • Database Driver Class Name: org.postgresql.Driver
  • Database Connection URL: jdbc:postgresql://host:5432/nombre_db
  • Database Table Name: nombre_tabla
  • Maximum-value Columns: columna para tracking incremental (ej: updated_at)

Seguridad y Autenticación

Configurar LDAP

sudo nano /opt/nifi/conf/login-identity-providers.xml
<!-- Proveedor de autenticación LDAP -->
<provider>
    <identifier>ldap-provider</identifier>
    <class>org.apache.nifi.ldap.LdapProvider</class>
    <property name="Authentication Strategy">SIMPLE</property>
    <property name="Manager DN">cn=admin,dc=empresa,dc=com</property>
    <property name="Manager Password">contraseña_ldap</property>
    <property name="TLS - Client Auth">NONE</property>
    <property name="Url">ldap://ldap-server:389</property>
    <property name="User Search Base">ou=users,dc=empresa,dc=com</property>
    <property name="User Search Filter">uid={0}</property>
    <property name="Identity Strategy">USE_DN</property>
    <property name="Authentication Expiration">12 hours</property>
</provider>

Políticas de acceso

NiFi usa un sistema de políticas de acceso por componente:

  • Desde la interfaz: clic derecho en un procesador → Manage Access Policies
  • Los usuarios y grupos se gestionan en Hamburger menu → Users

Clustering

Para alta disponibilidad con múltiples nodos:

# En nifi.properties de cada nodo del cluster
nifi.cluster.is.node=true
nifi.cluster.node.address=ip-del-nodo
nifi.cluster.node.protocol.port=11443
nifi.zookeeper.connect.string=zk1:2181,zk2:2181,zk3:2181

# Nodo coordinador del cluster
nifi.cluster.flow.election.max.wait.time=5 mins
nifi.cluster.flow.election.max.candidates=2
# ZooKeeper es necesario para el cluster
# Instalar ZooKeeper o usar el embebido en NiFi
/opt/nifi/bin/nifi.sh start-zookeeper

Solución de Problemas

NiFi no arranca:

# Revisar logs de inicio
tail -100 /opt/nifi/logs/nifi-app.log | grep -i "error\|exception"

# Verificar que el puerto no está ocupado
sudo ss -tlnp | grep 8443

# Verificar permisos de los directorios de datos
ls -la /opt/nifi/flowfile_repository /opt/nifi/content_repository

Procesador en estado de error:

# Los errores se ven en el canvas: el procesador muestra un icono rojo
# Clic derecho → Ver estado → Ver boletines para ver el error detallado
# También en:
tail -f /opt/nifi/logs/nifi-app.log | grep ERROR

Memoria insuficiente:

# Editar jvm.options para aumentar heap
sudo nano /opt/nifi/conf/jvm.options
# Cambiar:
-Xms2g
-Xmx8g
sudo systemctl restart nifi

Colas muy grandes (backpressure):

# Las conexiones con demasiados mensajes se marcan en rojo
# Opciones:
# 1. Aumentar el límite de backpressure en la conexión (clic derecho → Configure)
# 2. Purgar la cola si los datos no son críticos (clic derecho → Empty queue)
# 3. Escalar el procesador de destino (aumentar concurrent tasks)

Error de certificado en la interfaz web:

# Usar el script de NiFi para generar un certificado válido
/opt/nifi/bin/tls-toolkit.sh standalone \
  -n localhost \
  -C "CN=admin, OU=NIFI" \
  -o /opt/nifi/conf/

Conclusión

Apache NiFi es una solución potente para la integración de datos que destaca por su interfaz visual de arrastrar y soltar, su sistema de control de flujo con back-pressure automático y la trazabilidad completa de datos mediante el repositorio de provenance. Aunque su consumo de recursos es elevado comparado con herramientas más ligeras, las capacidades de orquestación, la garantía de entrega de datos y la facilidad para construir pipelines ETL complejos lo convierten en una elección sólida para entornos empresariales. Configura siempre la autenticación y los permisos desde el inicio en entornos de producción.