Как выполнить пакетную потоковую вставку в BigQuery из задания Beam

#google-bigquery #apache-beam #apache-beam-io

#google-bigquery #apache-beam #apache-beam-io

Вопрос:

Я пишу в BigQuery в задании beam из неограниченного источника. Я использую ПОТОКОВЫЕ ВСТАВКИ в качестве метода. Я рассматривал, как ограничить количество строк в BigQuery на основе рекомендаций в

https://cloud.google.com/bigquery/quotas#streaming_inserts

BigQueryIO.Write API не предоставляет способа настройки микропакетов.

Я рассматривал возможность использования триггеров, но не уверен, группирует ли BigQuery все на панели в запрос. Я настроил триггер, как показано ниже

     Window.<Long>into(new GlobalWindows())
    .triggering(
        Repeatedly.forever(
            AfterFirst.of(
                AfterPane.elementCountAtLeast(5),
                AfterProcessingTime.pastFirstElementInPane().plusDelayOf(Duration.standardMinutes(2)))
            ))
    .discardingFiredPanes());
  

Q1. Поддерживает ли Beam микропакеты или создает один запрос для каждого элемента в PCollection?

Q2. Имеет ли смысл приведенный выше триггер? Даже если я установлю окно / триггер, это может быть отправка одного запроса для каждого элемента.

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

1. это потоковые вставки dos, почему бы не использовать ЗАГРУЗКУ ФАЙЛОВ?

2. Моим намерением было иметь не менее 500 строк (как предложено в документации) или дождаться предопределенного времени для отправки запроса на вставку, чтобы он мог сбалансировать задержку и пропускную способность. Мой вариант использования — обрабатывать данные в максимально возможном режиме реального времени

3. После просмотра исходного кода я понял, что Beam bigquery действительно создает небольшие пакеты. github.com/apache/beam/blob/master/sdks/java/io / … показывает, что в методе finishBundle он пытается отправить несколько строк в запросе. Но этот класс помечен как внутренний (уровень пакета). Невозможно увидеть, сколько ит-пакетов или как они регулируются при различной скорости ввода. Было бы идеально увидеть некоторое объяснение того, как это ведет себя

4. Звучит неплохо. Попытаюсь что-нибудь получить.

5. Возможно, это отвлекает источник github.com/apache/beam/blob/master/sdks/java/io / … показывает, что метод writeAndGetErrors показывает, что он применяет глобальное окно к коллекции, аналогичное тому, что я опубликовал в вопросе. Таким образом, это переопределило бы любой WindowFn, который был применен перед записью в BigQuery. Что из этого следует?

Ответ №1:

Я не знаю, что вы подразумеваете под микропакетом. На мой взгляд, BigQuery поддерживает загрузку данных либо в виде пакетов, либо в потоковом режиме.

В принципе, на пакетные загрузки распространяются квоты, а потоковая загрузка немного дороже.

Как только вы установите метод вставки для своего BigQueryIO , в документации говорится :

Note: If you use batch loads in a streaming pipeline, you must use withTriggeringFrequency to specify a triggering frequency.

Никогда не пробовал, но withTriggeringFrequency кажется, это то, что вам здесь нужно.

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

1. Под микропакетами я подразумеваю небольшие пакеты или строки, которые упаковываются в запрос к BigQuery. Ссылка на квоты в исходном вопросе гласит: «Мы рекомендуем не более 500 строк. Пакетное использование может в определенной степени повысить производительность и пропускную способность». Итак, я бы интерпретировал это так, что даже в случае потоковых вставок это может создавать эти небольшие пакеты для увеличения пропускной способности по сравнению с 1 строкой за раз