"Превышен лимит накладных расходов GC" для долго выполняющегося задания потоковой передачи данных
Выполнение задания потокового потока данных в течение более длительного периода времени приводит к ошибке "GC overhead limit over Превышен", которая останавливает работу. Как я могу лучше всего приступить к отладке этого?
java.lang.OutOfMemoryError: GC overhead limit exceeded
at com.google.cloud.dataflow.worker.repackaged.com.google.common.collect.HashBasedTable.create (HashBasedTable.java:76)
at com.google.cloud.dataflow.worker.WindmillTimerInternals.<init> (WindmillTimerInternals.java:53)
at com.google.cloud.dataflow.worker.StreamingModeExecutionContext$StepContext.start (StreamingModeExecutionContext.java:490)
at com.google.cloud.dataflow.worker.StreamingModeExecutionContext.start (StreamingModeExecutionContext.java:221)
at com.google.cloud.dataflow.worker.StreamingDataflowWorker.process (StreamingDataflowWorker.java:1058)
at com.google.cloud.dataflow.worker.StreamingDataflowWorker.access$1000 (StreamingDataflowWorker.java:133)
at com.google.cloud.dataflow.worker.StreamingDataflowWorker$8.run (StreamingDataflowWorker.java:841)
at java.util.concurrent.ThreadPoolExecutor.runWorker (ThreadPoolExecutor.java:1142)
at java.util.concurrent.ThreadPoolExecutor$Worker.run (ThreadPoolExecutor.java:617)
at java.lang.Thread.run (Thread.java:745)
- Кодвакансии: 2018-02-06_00_54_50-15974506330123401176
- SDK: Apache Beam SDK для Java 2.2.0
- Версия Scio: 0.4.7
1 ответ
Я сталкивался с этой проблемой несколько раз. Мой подход обычно начинается с попытки изолировать шаг преобразования, который вызывает ошибку памяти в потоке данных. Это более длительный процесс, но вы обычно можете сделать обоснованное предположение о том, что является проблематичным преобразованием. Удалите преобразование, выполните конвейер и проверьте, сохраняется ли ошибка.
Определив проблемное преобразование, я начинаю смотреть на реализацию на предмет неэффективности памяти. Обычно это связано с инициализацией объектов (выделением памяти) или дизайном, где преобразование имеет очень большое разветвление; создавая кучу выходных. Но это может быть что-то тривиальное, как манипулирование строками.
Отсюда, это просто вопрос дальнейшей изоляции проблемы. Поток данных имеет ограничения памяти. Вы могли бы потенциально увеличить аппаратное обеспечение экземпляров Compute Engine, поддерживая рабочих. Однако это не масштабируемое решение.
Вы также должны рассмотреть реализацию конвейера с использованием ТОЛЬКО Apache Beam Java. Это исключит Scio как проблему. Это обычно не тот случай, хотя.