GCP Dataflow выполняет потоковые вставки в BigQuery: GC Thrashing - PullRequest
0 голосов
/ 30 июня 2019

Я использую Apache Beam 2.13.0 с GCP Data Runner.

У меня проблема с потоковой передачей в BigQuery из пакетного конвейера:

PCollection<BigQueryInsertError> stageOneErrors =
  destinationTableSelected
    .apply("Write BQ Attempt 1",
      BigQueryIO.<KV<TableDestination, TableRow>>write()
                .withMethod(STREAMING_INSERTS)
                .to(new KVTableDestination())
                .withFormatFunction(new KVTableRow())
                .withExtendedErrorInfo()
                .withFailedInsertRetryPolicy(InsertRetryPolicy.neverRetry())
                .withCreateDisposition(CreateDisposition.CREATE_NEVER)
                .withWriteDisposition(WriteDisposition.WRITE_APPEND))
                .getFailedInsertsWithErr();

Ошибка:

 Shutting down JVM after 8 consecutive periods of measured GC thrashing. 
 Memory is used/total/max = 15914/18766/18766 MB, 
 GC last/max = 99.17/99.17 %, #pushbacks=0, gc thrashing=true. 
 Heap dump not written.

Тот же код работает правильно в режиме потоковой передачи (если опущен параметр с явным методом).

Код работает с достаточно маленькими наборами данных (менее 2 миллионов записей). Сбой на 2,5 миллиона плюс.

На первый взгляд, это похоже на проблему, описанную здесь: Отключение JVM после 8 последовательных периодов измерения ГХ-обмолота

Создание отдельного вопроса для добавления дополнительных деталей.

Могу ли я что-нибудь сделать, чтобы это исправить? Похоже, проблема в самом компоненте BigQueryIO - ключ GroupBy не работает.

1 Ответ

1 голос
/ 06 июля 2019

Проблема с преобразованиями, которые содержат GroupByKey, состоит в том, что он будет ждать, пока все данные для текущего окна не будут получены, прежде чем сгруппироваться.

В потоковом режиме это обычно нормально, поскольку входящие элементы помещаются в отдельные окна, поэтому GroupByKey работает только с небольшим (ish) фрагментом данных.

Однако в пакетном режиметекущее окно - это глобальное окно, означающее, что GroupByKey будет ожидать считывания и приема всего входного набора данных, прежде чем начнется группировка.Если входной набор данных большой, то у вашего работника не хватит памяти, что объясняет то, что вы видите здесь.

Это поднимает вопрос: почему вы используете вставку BigQuery Streaming при обработке пакетных данных?Потоковые вставки стоят относительно дорого (по сравнению с массовой, которая бесплатна!), А имеют меньшую квоту / лимиты , чем групповой импорт: даже если вы решаете проблемы, с которыми вы сталкиваетесь, могут возникнутьв самой Bigquery еще предстоит обнаружить больше проблем.

...