Как я могу отладить, почему мое задание Dataflow зависает?

У меня есть задание Dataflow, которое не выполняется или выполняется очень медленно, и я не знаю почему. Как мне начать разбираться, почему работа тормозит / зависает?

1 ответ

Решение

Первый ресурс, который вы должны проверить, - это документация Dataflow. Было бы полезно проверить это:

Если эти ресурсы не помогут, я попытаюсь обобщить некоторые причины, по которым ваша работа может зависнуть, и как вы можете отладить ее. Я разделю эти проблемы в зависимости от того, какая часть системы вызывает проблемы. Ваша работа может быть:


Работа зависла при запуске

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

  • Вы добавили кастомный setup.py файл?
  • Есть ли у вас зависимости, требующие специальной настройки при запуске воркера?
  • Вы манипулируете рабочим контейнером?

Чтобы решить эту проблему, я обычно открываю журнал StackDriver и ищуworker-startupжурналы (см. следующий рисунок). Эти журналы записываются рабочим, когда он запускает контейнер докеров с вашим кодом и вашими зависимостями. Если вы видите здесь какую-либо проблему, это будет означать проблему с вашимsetup.py, ваше задание, постановочные артефакты и т. д.

Еще вы можете сделать ту же настройку и запустить очень маленький конвейер, который все этапирует:

with beam.Pipeline(...) as p:
  (p 
   | beam.Create(['test element']) 
   | beam.Map(lambda x: logging.info(x)))

Если вы не видите свои журналы в StackDriver, вы можете продолжить отладку своей настройки. Если вы видите журнал в StackDriver, возможно, ваша работа застряла в другом месте.


Работа кажется застрял в коде пользователя

Что-то еще может случиться, если ваша работа выполняет некоторую операцию в пользовательском коде, которая зависает или работает медленно. Вот некоторые факторы риска:

  • Ваша работа выполняет операции, требующие от вас их ожидания? (например, загрузка данных во внешнюю службу, ожидание обещаний / фьючерсов)
    • Обратите внимание, что некоторые из встроенных преобразований Beam делают именно это (например, Beam IO, такие как BigQueryIO, FileIO и т. Д.).
  • Ваша работа загружает в память очень большие побочные данные? Это может произойти, если вы используетеView.AsList для бокового входа.
  • Ваша работа загружает очень большие итерации после GroupByKey операции?

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

Processing stuck in step <STEP_NAME>/<...>/<...> for at least <TIME> without outputting or completing in state <STATE>
    .... <a stacktrace> ....

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

Несколько советов:

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

  • Возможны асинхронные запросы к внешним сервисам, но я рекомендую вам зафиксировать / завершить работу над startBundle а также finishBundle звонки.

  • Если пропускная способность вашего конвейера не соответствует вашим ожиданиям, возможно, это связано с тем, что вам не хватает параллелизма. Это можно исправить с помощьюReshuffleили сегментируя существующие ключи на подключи (Beam часто обрабатывает каждый ключ, поэтому, если у вас слишком мало ключей, ваш параллелизм будет низким) - или используя Combiner вместо того GroupByKey + ParDo.

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

В общем, нет серебряной пули для повышения пропускной способности вашего конвейера, и вам нужно будет поэкспериментировать.


Актуальность данных или системное отставание увеличиваются

Прежде всего, я рекомендую вам ознакомиться с этой презентацией о водяных знаках.

Для потоковой передачи продвижение водяных знаков - это то, что заставляет конвейер двигаться вперед, поэтому важно следить за тем, что может привести к задержке водяного знака и остановке вашего конвейера ниже по потоку. Некоторые причины, по которым водяной знак может застрять:

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

  • У вас может быть ошибка при связывании временных меток с вашими данными. Убедитесь, что разрешение ваших данных временной метки правильное!
  • Хотя это маловероятно, возможно, вы столкнулись с ошибкой в ​​Dataflow. Если ни один из других советов не помог, откройте заявку в службу поддержки.
Другие вопросы по тегам