Зачем переходить на Apache NiFi 1.23.2: критичная ошибка и ее устранение

Apache NiFi дата-инженерия администрирование примеры курсы обучение, Apache NiFi курсы примеры обучение, курсы дата-инженеров, обучение инженеров данных, обучение большим данным, Школа Больших Данных Учебный Центр Коммерсант

Недавно мы писали про Apache NiFi 1.23.1, выпущенный 18.08.2023. Однако, использовать его не следует, также как и предыдущий релиз этой линейки. Разбираемся, почему тем, кто перешел на NiFi 1.23, нужно срочно обновиться до версии 1.23.2 от 22 августа 2023 года.

Что не так с Apache NiFi 1.23 и как это исправить

В Apache NiFi 1.23.0 и 1.23.1 был нарушен один из сценариев ProcessSession::write. Поэтому использовать эти выпуски не рекомендуется. Исправление выпущено в релизе NiFi 1.23.2 от 22 августа 2023 года.

Проблема была связано с классом StandardContentClaimWriteCache.java в методе write(final ContentClaim), который возвращает выходной поток OutputStream, используемый в интерфейсе OutputStreamCallback. Это позволяет процессорам NiFi записывать содержимое FlowFile через метод write() класса ProcessSession.

Напомним, чтобы отслеживать содержимое потокового файла, у FlowFile есть объект Content Claim, который содержит ссылку на утверждение ресурса с контентом, его смещение в файле и длину. Чтобы получить доступ к контенту, репозиторий контента детализирует конкретный файл на диске, используя свойство Content Claim, а затем ищет смещение, указанное в этой заявке, перед потоковой передачей контента из файла.

Этот уровень абстракции (Resource Claim) обеспечивает агрегацию содержимого нескольких FlowFile в один физический файл на жестком диске. Поскольку содержимое FlowFile никогда не изменяется после его записи благодаря копированию для внесении изменений, из-за изменения содержимого FlowFile не происходит фрагментации памяти или перемещения данных. Используя один файл на диске для хранения содержимого множества FlowFiles, NiFi обеспечивает высокую пропускную способность на уровне максимальной скорости передачи данных, обеспечиваемой жесткими дисками.

Возвращаясь к ошибке в NiFi 1.23.0 и 1.23.1, отметим, что из-за рефакторинга кода, если процессор вызывал метод session.write(), не записывая никаких данных в выходной поток, то ни один из методов записи в OutputStream не вызывался. Поэтому длина Content Claim не пересчитывалась и имела значение по умолчанию -1. А при создании нового Content Claim при каждом вызове ProcessSession::write, новое смещение рассчитывалось неверно:

@Override
public synchronized ContentClaim newContentClaim() throws IOException {
scc = new StandardContentClaim(scc.getResourceClaim(), scc.getOffset() + scc.getLength());
initialLength = 0;
bytesWritten = 0L;
incrementClaimaintCount(scc);
return scc;
}

Например, если предыдущее смещение было 1000 и в поток ничего не записывалось (длина равна -1), то 1000 + (-1) даст 999. Это означает, что смещение сдвинуто назад на единицу, следовательно, следующий контент будет иметь в начале дополнительный символ из предыдущего содержимого и потеряет последний символ в конце, а все остальные потоковые файлы будут повреждены этим дефектом до перезапуска экземпляра NiFi.

Таким образом, NiFi 1.23.0 и 1.23.1 вообще нельзя использовать, поскольку любые другие процессоры приведут к повреждению содержимого FlowFile во всем экземпляре NiFi из-за некорректного смещения. В релизе 1.23.2 эта проблема устранена. Поэтому тем пользователям NiFi, кто успел обновить эту платформу до 1.23.0 или 1.23.1, следует выполнить еще одно обновление.

Узнайте больше про администрирование и использование Apache NiFi для построения эффективных ETL-конвейеров потоковой аналитики больших данных на специализированных курсах в нашем лицензированном учебном центре обучения и повышения квалификации для разработчиков, менеджеров, архитекторов, инженеров, администраторов, Data Scientist’ов и аналитиков Big Data в Москве:

Я даю свое согласие на обработку персональных данных и соглашаюсь с политикой конфиденциальности.

Источники

  1. https://cwiki.apache.org/confluence/display/NIFI/Release+Notes#ReleaseNotes-Version1.23.2
  2. https://issues.apache.org/jira/browse/NIFI-11971
  3. https://nifi.apache.org/docs/nifi-docs/html/nifi-in-depth.html#deeper-view-content-claim
Поиск по сайту