Introduction
Exécuter Apache NiFi en production, c'est viser la fiabilité, la sécurité et la rapidité de changement. Cette NiFi checklist transforme des NiFi best practices en actions concrètes autour de la configuration, du durcissement, de la supervision, de la NiFi maintenance, des sauvegardes, des mises à niveau et des pièges courants. Chaque point est accompagné d'exemples et de réglages prêts à l'emploi pour passer de l'intention à l'exécution.
Vue d'ensemble du workflow
Un flux clair et reproductible de l'idée à la prod réduit le risque et les retours arrière douloureux.
- Planifier : définir sources, cibles, SLA et modes de panne.
- Construire localement : implémenter un flux minimal avec Parameter Contexts et Controller Services.
- Versionner : utiliser NiFi Registry pour tracer les versions des flux.
- Tester : valider les chemins fonctionnels, le backpressure et la gestion d'erreur.
- Stager : déployer sur un cluster non‑prod qui reflète les limites de prod.
- Publier : promouvoir en prod avec notes de changement et étapes de rollback.
- Opérer : surveiller santé, débit, latence et erreurs.
- Améliorer : collecter des métriques, ajuster les seuils et retirer les composants inutilisés.
Configuration et durcissement
Durcir la plateforme tout en la dimensionnant correctement.
Sécurité
- Activez HTTPS dans nifi.properties et imposez un TLS robuste :
nifi.web.https.host=0.0.0.0
nifi.web.https.port=8443
nifi.security.keystore=./conf/keystore.jks
nifi.security.keystoreType=JKS
nifi.security.keystorePasswd=changeit
nifi.security.truststore=./conf/truststore.jks
nifi.security.truststoreType=JKS
nifi.security.truststorePasswd=changeit
- Créez des utilisateurs et groupes, et appliquez des politiques de moindre privilège.
- Stockez les secrets dans des Parameter Contexts ; évitez tout identifiant en dur dans les processeurs.
Dépôts et rétention
- Placez flowfile_repository, content_repository et provenance_repository sur des disques rapides et distincts.
- Ajustez la rétention de provenance pour équilibrer audit et disque :
nifi.provenance.repository.max.storage.time=24 hours
nifi.provenance.repository.max.storage.size=50 GB
- Gardez une marge sur le dépôt de contenu (objectif : <70 % d'utilisation en pic).
Performance et sûreté des flux
- Appliquez un backpressure sur chaque connexion (par ex. 20 000 objets ou 5 GB).
- Réglez la pénalisation et le yield pour protéger les sources quand l'aval ralentit.
- Préférez des schémas stateless quand possible ; limitez la taille des files.
Planification et ressources
- Dans bootstrap.conf, dimensionnez la JVM de manière prévisible :
java.arg.2=-Xms8g
java.arg.3=-Xmx8g
- Ajustez les tâches concurrentes par processeur selon CPU et IO.
- Utilisez Run Schedule et Run Duration pour éviter le thrash CPU sur des processeurs légers.
Controller Services
- Centralisez les configurations partagées (DBCPConnectionPool, SSLContextService, etc.).
- Validez d'abord les services, puis activez les processeurs pour éviter des démarrages partiels.
Supervision et alerting
Ce qu'il faut observer et comment le connecter.
Indicateurs de santé clés
- Santé des nœuds : CPU, heap, GC, utilisation disque par dépôt.
- Santé des flux : taille/comptage en file vs seuils, fréquence des bulletins, routes d'erreur.
- Indicateurs SLA : latence de bout en bout, débit par chemin, ratio succès/échec.
Outils natifs NiFi
- Status History : suivre l'évolution des métriques au niveau composant.
- Bulletins : remonter vite les avertissements/erreurs des processeurs.
- ReportingTasks : émettre métriques et bulletins vers votre stack de monitoring.
- MonitorActivity : détecter les blocages en amont et alerter.
Règles d'alerte (exemples)
- Taux de croissance de file > X % pendant Y minutes sur les chemins critiques.
- Bulletin ERROR répété > N fois en 5 minutes.
- Trou de provenance indiquant des données manquantes pour une source.
- Disque du content/provenance repo > 80 %.
Runbooks
- Pour chaque alerte, documentez la triage : identifier les processeurs touchés, mettre en pause l'ingest, drainer ou rerouter, revenir à la dernière version saine, valider la reprise.
Maintenance
Garder le cluster sain par une routine légère mais régulière.
- Quotidien
- Revue des bulletins et routes d'erreur des groupes clés.
- Contrôle de l'usage disque des dépôts et des plus grosses files.
- Vérification des ReportingTasks.
- Hebdomadaire
- Ajustement des seuils de backpressure si tendance à saturer.
- Rotation/archivage des logs ; vérifier logback (taille/rétention).
- Validation et nettoyage des Controller Services inutilisés.
- Mensuel
- Revue de la rétention de provenance (taille/temps).
- Nettoyage des processeurs/connexions désactivés ou abandonnés.
- Exercice de restauration depuis sauvegarde en sandbox.
- Trimestriel
- Revue de capacité : CPU, heap, disques et tendances de croissance.
- Audit des dépendances : NARs custom, drivers, endpoints externes.
- Exercices de chaos : perte d'un nœud, saturation disque d'un dépôt.
Sauvegardes et reprise
Sauvegardez l'essentiel pour restaurer l'exploitation, pas les données transitoires.
À sauvegarder
- conf/ (nifi.properties, authorizers, users, logback...)
- flow.json.gz (flux en cours d'exécution)
- state/ (état local et cluster)
- NARs et drivers personnalisés (extensions dans lib/)
- Données de NiFi Registry (depuis son backend de stockage)
Processus recommandé (nœud unique)
- Arrêter NiFi proprement.
- Copier conf/, flow.json.gz, state/ vers un emplacement versionné hors hôte.
- Copier les NARs et drivers custom.
- Redémarrer et vérifier.
Processus recommandé (cluster)
- Offloader/drainer chaque nœud avant maintenance pour minimiser les données en vol.
- Sauvegarder chaque nœud comme ci‑dessus, plus les ressources partagées.
- Conserver les sauvegardes pour au moins un cycle de mise à niveau.
Reprise après sinistre
- Les dépôts (flowfile, content, provenance) sont volumineux ; privilégiez le redéploiement et la relecture depuis les sources (Kafka, etc.) plutôt que leur restauration.
- Gardez NiFi Registry comme source de vérité des versions pour accélérer le redéploiement.
- Documentez les étapes de cold‑start par flux : reprendre au dernier checkpoint/offset.
Mises à niveau et gestion du changement
Réduisez le risque par des changements étagés et réversibles.
Hygiène de changement
- Versionner chaque groupe de processus via NiFi Registry.
- Rédiger des notes de changement : but, risque, deltas de métriques attendus, rollback.
- Utiliser des Parameter Contexts pour isoler les différences d'environnement.
Mise à niveau nœud unique
- Sauvegarder : conf/, flow.json.gz, state/, NARs custom.
- Arrêter NiFi. Installer la nouvelle version en parallèle.
- Reporter les configs et extensions ; réconcilier nifi.properties et bootstrap.conf.
- Démarrer, vérifier logs et UI, exécuter un smoke test.
Rolling upgrade (cluster)
- Déconnecter et offloader un nœud pour le drainer.
- Mettre à niveau ce nœud, valider, puis le réintégrer.
- Répéter nœud par nœud pour maintenir le service.
Après mise à niveau
- Vérifier la compatibilité des Controller Services et dépréciations.
- Surveiller GC, débit et profils de files pendant 24-48 h.
- Garder la version précédente prête pour rollback jusqu'à stabilisation.
Pièges courants en production
- Absence de backpressure sur les connexions : pression mémoire et instabilité.
- Files surdimensionnées et durables : masquent les problèmes, ralentissent la reprise.
- Retries non bornés : boucles chaudes qui saturent les avals.
- Secrets dans les propriétés des processeurs : migrez vers des Parameter Contexts sécurisés.
- Concurrence minimale partout : sous‑utilisation ; dimensionnez par chemin.
- Rétention de provenance insuffisante : bloque l'analyse de cause racine.
- Saut du staging : changements directs en prod = pannes.
- IO disque ignorée : tous dépôts sur un même volume lent.
- Absence de runbooks : réponses ad hoc et lentes.
Exemples pratiques
Exemple 1 : Kafka → HDFS avec backpressure sûr
- Processeurs : ConsumeKafka, UpdateAttribute, PutHDFS, LogAttribute (chemin fail)
- Seuils de connexion : 20 000 objets ou 5 GB entre chaque étape
- Gestion des échecs : router failure vers un groupe DLQ avec PutFile, en capturant kafka.topic, partition, offset
- Réglages : tâches concurrentes de PutHDFS = nombre de cœurs client HDFS ; Run Schedule 0 s pour streaming, 1-2 s si petits fichiers créent du churn
- SLA : MonitorActivity sur ConsumeKafka et alerte de croissance de file après PutHDFS
Exemple 2 : Pull REST avec limites et retries
- Processeurs : GenerateTableFetch ou InvokeHTTP, EvaluateJsonPath, PutDatabaseRecord
- Limite de débit : ControlRate avant InvokeHTTP (p. ex. 100 req/min)
- Stratégie de retry : router 5xx vers file de retry avec pénalisation et backoff ; router 4xx vers DLQ avec attributs de contexte
- Observabilité : journaliser status.code et response.time ; alerte si ratio 5xx > 2 % sur 10 minutes
Exemple 3 : Batch fenêtré avec checkpointing
- Processeurs : ListFile → FetchFile → PutHDFS
- Idempotence : suivre les noms de fichiers vus dans DistributedMapCache pour éviter les doublons
- Fenêtrage : planifier ListFile toutes les 5 minutes ; aval en continu
- Reprise : en cas de crash, la reliste consulte le cache et ne récupère que l'inédit
Plan pilote local
Objectif
- Prouver le débit et la robustesse d'erreur sur un chemin unique imitant les IO de prod.
Périmètre
- Ingestion de fichiers locaux vers un répertoire local avec une transformation et un backpressure clair.
Étapes
- Créer un groupe : GenerateFlowFile → UpdateAttribute → PutFile.
- Ajouter un Parameter Context pour les chemins et toggles d'environnement.
- Régler le backpressure de connexion à 1 000 objets ou 500 MB.
- Ajouter MonitorActivity après GenerateFlowFile.
- Critères d'acceptation : 5 000 msgs/min sur 15 min, 0 erreur, file < 60 % du seuil.
- Exécuter localement, collecter Status History et logs.
- Si stable, porter en staging en changeant les Parameter Contexts ; garder les mêmes seuils.
Sortie
- Promouvoir le motif vers les chemins de production une fois les critères atteints.
Conclusion
La réussite de NiFi production tient à une checklist claire, une séparation disciplinée des étapes et des pilotes mesurables. Durez la plateforme, observez‑la sans relâche, entretenez‑la avec cadence, sauvegardez l'essentiel et changez en sécurité. Servez‑vous des exemples et réglages ici pour amorcer vos runbooks et standards, puis itérez à partir des métriques collectées. Intégrez ces pratiques à vos data pipelines et environnements connexes (Kafka, HDFS, Apache Spark, Apache Airflow) pour une exploitation homogène.