3
votes

Erreur dans Nifi: impossible d'écrire dans StandardFlowfileRecord

J'ai récemment créé une image docker Nifi pour pouvoir exécuter un docker nifi avec ma configuration et mon statut personnalisés.

Tout a bien fonctionné, mais après un certain temps, j'ai reçu l'erreur suivante:

2019-04-08 10:42:26,107 ERROR [Timer-Driven Process Thread-10] o.a.n.c.r.StandardProcessSession Failed to commit session java.lang.IllegalStateException: Cannot update journal file ./flowfile_repository/journals/449486.journal because no header has been written yet.. Will roll back.
2019-04-08 10:42:26,108 ERROR [Timer-Driven Process Thread-10] d.f.fit.processors.opcua.GetOPCData GetOPCData[id=e8affa98-0169-1000-1717-d9e8f54293ea] GetOPCData[id=e8affa98-0169-1000-1717-d9e8f54293ea] failed to process session due to java.lang.IllegalStateException: Cannot update journal file ./flowfile_repository/journals/449486.journal because no header has been written yet.; Processor Administratively Yielded for 1 sec: 
 java.lang.IllegalStateException: Cannot update journal file ./flowfile_repository/journals/449486.journal because no header has been written yet.
    at org.apache.nifi.wali.LengthDelimitedJournal.update(LengthDelimitedJournal.java:230)
    at org.apache.nifi.wali.SequentialAccessWriteAheadLog.update(SequentialAccessWriteAheadLog.java:123)
    at org.apache.nifi.controller.repository.WriteAheadFlowFileRepository.updateRepository(WriteAheadFlowFileRepository.java:309)
    at org.apache.nifi.controller.repository.WriteAheadFlowFileRepository.updateRepository(WriteAheadFlowFileRepository.java:259)
    at org.apache.nifi.controller.repository.StandardProcessSession.commit(StandardProcessSession.java:368)
    at org.apache.nifi.controller.repository.StandardProcessSession.commit(StandardProcessSession.java:343)
    at org.apache.nifi.processor.AbstractProcessor.onTrigger(AbstractProcessor.java:28)
    at org.apache.nifi.controller.StandardProcessorNode.onTrigger(StandardProcessorNode.java:1162)
    at org.apache.nifi.controller.tasks.ConnectableTask.invoke(ConnectableTask.java:205)
    at org.apache.nifi.controller.scheduling.TimerDrivenSchedulingAgent$1.run(TimerDrivenSchedulingAgent.java:117)
    at java.util.concurrent.Executors$RunnableAdapter.call(Executors.java:511)
    at java.util.concurrent.FutureTask.runAndReset(FutureTask.java:308)
    at java.util.concurrent.ScheduledThreadPoolExecutor$ScheduledFutureTask.access$301(ScheduledThreadPoolExecutor.java:180)
    at java.util.concurrent.ScheduledThreadPoolExecutor$ScheduledFutureTask.run(ScheduledThreadPoolExecutor.java:294)
    at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1149)
    at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:624)
    at java.lang.Thread.run(Thread.java:748)
    Suppressed: java.lang.IllegalStateException: Cannot update journal file ./flowfile_repository/journals/449486.journal because no header has been written yet.
            at org.apache.nifi.wali.LengthDelimitedJournal.update(LengthDelimitedJournal.java:230)
            at org.apache.nifi.wali.SequentialAccessWriteAheadLog.update(SequentialAccessWriteAheadLog.java:123)
            at org.apache.nifi.controller.repository.WriteAheadFlowFileRepository.updateRepository(WriteAheadFlowFileRepository.java:309)
            at org.apache.nifi.controller.repository.WriteAheadFlowFileRepository.updateRepository(WriteAheadFlowFileRepository.java:259)
            at org.apache.nifi.controller.repository.StandardProcessSession.rollback(StandardProcessSession.java:1060)
            at org.apache.nifi.controller.repository.StandardProcessSession.commit(StandardProcessSession.java:501)
            ... 12 common frames omitted

Est-ce quelque chose à voir avec le tas Java ou la mémoire? Comment puis-je corriger cette erreur?


0 commentaires

3 Réponses :


1
votes

Si vous ne vous souciez pas des données de votre flux, vous pouvez arrêter et supprimer tous les répertoires "référentiel", ils sont créés par défaut dans le répertoire personnel de NiFi.

Cela n'explique pas ce qui a causé cela en premier lieu, mais cela devrait vous ramener à un état de fonctionnement.


4 commentaires

Le problème est que toutes les 2 heures, cette erreur se produit, il n'est donc pas judicieux de redémarrer le docker chaque fois qu'elle se produit.


est-ce que vous manquez d'espace disque lorsque cela se produit?


Pourrait être. Mais je ne trouve aucune file d'attente sur mon processeur. Comment puis-je vérifier quel processeur ou quelle tâche est plein sur mon système?


Je reçois également cela tout le temps maintenant, mais uniquement lorsque j'exécute avec docker dans AWS. inodes libres, espace disque, permissions, ..., ne semblent pas être un problème. La seule chose que j'ai vue suspecte, ce sont les diagnostics NiFi. (curl http: // $ (nom d'hôte -i): 8281 / nifi-api / system-diagnostics). Je vois: flowFileRepositoryStorageUsage.totalSpaceBytes = -1 Redémarrez le processus dans le conteneur et il disparaît, mais ce n'est pas une solution à long terme.



0
votes

Exécutez le docker Nifi avec des limites de journaux:

 docker run --name nifi -p 8080:8080 --log-driver json-file --log-opt max-size=5m --log-opt max-file=4  --restart always -d nifi


0 commentaires

2
votes

Dans mon cas, je manquais de descripteurs de fichiers ouverts, et malheureusement l'erreur ne donne aucune indication à ce sujet. Comment j'ai pensé que c'était pour:

Interroger les diagnostics NiFi. ex: curl http: // localhost: 8080 / nifi-api / system-diagnostics

Vérifiez tous les champs 'libres' (ex. "provenanceRepositoryStorageUsage.freeSpace") et assurez-vous d'avoir assez de ressources.

Pour moi, cela a renvoyé des valeurs telles que:

flowFileRepositoryStorageUsage.totalSpaceBytes = -1

-1 est signalé lorsque NiFi ne parvient pas à déterminer ces valeurs. Un message d'erreur approprié sera enregistré dans le cadre des diagnostics. Vous devrez peut-être vérifier rapidement les journaux. Dans mon cas, j'avais configuré les journaux de roulement, de sorte que le message de journal a rapidement disparu (tant de processeurs enregistraient les échecs et remplissaient les journaux). L'erreur ressemblait à:

2019-06-03 18:48:59,619 ERROR [pool-10-thread-1] org.apache.nifi.controller.repository.WriteAheadFlowFileRepository Unable to checkpoint FlowFile Repository due to java.io.FileNotFoundException: ./flowfile_repository/journals/8243.journal (Too many open files)
java.io.FileNotFoundException: ./flowfile_repository/journals/8243.journal (Too many open files)
    at java.io.FileOutputStream.open0(Native Method)
    at java.io.FileOutputStream.open(FileOutputStream.java:270)
    at java.io.FileOutputStream.\u003cinit\u003e(FileOutputStream.java:213)
    at java.io.FileOutputStream.\u003cinit\u003e(FileOtutputStream.java:162)\n\tat org.apache.nifi.wali.LengthDelimitedJournal.getOutputStream(LengthDelimitedJournal.java:136)
    at org.apache.nifi.wali.LengthDelimitedJournal.writeHeader(LengthDelimitedJournal.java:151)
    at org.apache.nifi.wali.SequentialAccessWriteAheadLog.checkpoint(SequentialAccessWriteAheadLog.java:306)
    at org.apache.nifi.wali.SequentialAccessWriteAheadLog.checkpoint(SequentialAccessWriteAheadLog.java:251)
    at org.apache.nifi.controller.repository.WriteAheadFlowFileRepository.checkpoint(WriteAheadFlowFileRepository.java:735)
    at org.apache.nifi.controller.repository.WriteAheadFlowFileRepository$1.run(WriteAheadFlowFileRepository.java:693)
    at java.util.concurrent.Executors$RunnableAdapter.call(Executors.java:511)
    at java.util.concurrent.FutureTask.runAndReset(FutureTask.java:308)
    at java.util.concurrent.ScheduledThreadPoolExecutor$ScheduledFutureTask.access$301(ScheduledThreadPoolExecutor.java:180)
    at java.util.concurrent.ScheduledThreadPoolExecutor$ScheduledFutureTask.run(ScheduledThreadPoolExecutor.java:294)
    at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1149)
    at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:624)
    at java.lang.Thread.run(Thread.java:748)

La partie importante ici est «Trop de fichiers ouverts».

Pour obtenir les limites actuelles en utilisant Linux: ulimit -x -n

Pour obtenir le nombre de fichiers ouverts sous Linux: sudo ls / proc / $ NIFI_PID / fd | wc -l

J'utilise docker donc j'ai augmenté la limite avec la commande docker run: docker run --ulimit nofile = 1048576: 1048576 ...

D'autres solutions seraient: augmenter les limites de la machine hôte, déterminer quels processeurs prennent les poignées et les retravailler (pas si facile).


0 commentaires