Ошибка в Nifi: не удалось выполнить запись в StandardFlowfileRecord

#docker #dockerfile #apache-nifi

#docker #dockerfile #apache-nifi

Вопрос:

Недавно я создал образ Nifi docker, чтобы иметь возможность запускать nifi docker с моей пользовательской конфигурацией и статусом.

Все работало нормально, но через некоторое время я получил следующую ошибку:

 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
  

Это как-то связано с кучей Java или памятью? Как я могу исправить эту ошибку?

Ответ №1:

В моем случае у меня заканчивались дескрипторы открытых файлов, и, к сожалению, ошибка не указывает на это. Как я понял, это было:

Запросите диагностику NiFi. пример: curl http://localhost:8080/nifi-api/system-diagnostics

Проверьте все «свободные» поля (например, «provenanceRepositoryStorageUsage.FreeSpace») и убедитесь, что у вас достаточно ресурсов.

Для меня это возвращало такие значения, как:

flowFileRepositoryStorageUsage.totalSpaceBytes=-1

-1 сообщается, когда NiFi не удается определить эти значения. Правильное сообщение об ошибке будет зарегистрировано как часть диагностики. Возможно, вам потребуется быстро проверить журналы. В моем случае у меня была настройка скользящих журналов, поэтому сообщение журнала быстро исчезло (так много процессоров регистрировали сбои и заполняли журналы). Ошибка выглядела так:

 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.u003cinitu003e(FileOutputStream.java:213)
    at java.io.FileOutputStream.u003cinitu003e(FileOtutputStream.java:162)ntat 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)
  

Важная часть здесь — «Слишком много открытых файлов».

Чтобы получить текущие ограничения с помощью Linux: ulimit -x -n

Чтобы получить количество открытых файлов с помощью linux: sudo ls /proc/$NIFI_PID/fd | wc -l

Я использую docker, поэтому я увеличил лимит с помощью команды docker run: docker run --ulimit nofile=1048576:1048576 ...

Другими решениями были бы: увеличить ограничения на хост-машине, определить, какие процессоры используют дескрипторы, и переработать их (не так просто).

Ответ №2:

Если вам не нужны какие-либо данные в вашем потоке, вы можете завершить работу и удалить все каталоги «репозитория», они по умолчанию создаются в домашнем каталоге NiFi.

Это не объясняет, что вызвало это в первую очередь, но это должно вернуть вас в рабочее состояние.

Комментарии:

1. Проблема в том, что каждые 2 часа возникает эта ошибка, поэтому не рекомендуется перезапускать docker каждый раз, когда это происходит.

2. есть ли вероятность, что у вас заканчивается место на диске, когда это произойдет?

3. Может быть. Но я не нахожу никаких очередей на своем процессоре. Как я могу проверить, какой процессор или задача заполнены в моей системе?

4. Я и сейчас получаю это все время, но только при работе с docker в AWS. свободные индексы, дисковое пространство, разрешения, …, не выглядят как проблема. Единственное, что я заметил подозрительным, это диагностика NiFi. (curl http:// $(hostname -i):8281/nifi-api/system-diagnostics). Я вижу: flowFileRepositoryStorageUsage.totalSpaceBytes=-1 Перезапустите процесс внутри контейнера, и он исчезнет, но это не долгосрочное решение.

Ответ №3:

Запустите Nifi docker с ограничениями журналов:

  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