Как я могу отладить, почему мое задание 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. Если ни один из других советов не помог, откройте заявку в службу поддержки.