Как убить параллельное выполнение записных книжек Databricks?
В настоящее время я использую Python Threading
для распараллеливания выполнения нескольких записных книжек Databricks. Это долговечные записные книжки, и мне нужно добавить некоторую логику для отключения потоков в случае, когда я хочу перезапустить выполнение с новыми изменениями. При повторном запуске главной записной книжки без остановки потоков кластер быстро заполняется вычислительно тяжелыми, долгоживущими потоками, оставляя мало места для фактически необходимых вычислений.
Я безуспешно пробовал эти предложения. Кроме того, я попытался получить runId изdbutils.notebook.run()
и убивая поток с помощью dbutils.notebook.exit(runId)
, но так как звонок dbutils.notebook.run()
синхронно, я не могу получить runId до выполнения записной книжки.
Буду признателен за любые предложения по решению этой проблемы!
1 ответ
Привет, @sondrelv, и спасибо за вопрос. Хочу уточнить, чтоdbutils.notebook.exit(value)
не используется для уничтожения других потоков с помощью runId. dbutils.notebook.exit(value)
используется, чтобы заставить текущий (этот) поток выйти и вернуть значение. Я вижу сложность управления без доступного прерывания внутри кода ноутбука. Учитывая это ограничение, я попытался найти другие способы отменить потоки.
Один из способов - использовать другие утилиты для остановки потока / выполнения.
Частично сложность решения этой проблемы заключается в том, что потоки / запуски, созданные dbutils.notebook.run()
эфемерные пробеги. Интерфейс командной строки Databricksdatabricks runs get --run-id <ephemeral_run_id>
может получить информацию об эфемерном пробеге. Если данные можно получить, отмена также должна работать (databricks runs cancel ...
).
Оставшаяся трудность - получить идентификаторы прогона. Эфемерные запуски исключаются из операции списка запусков CLIdatabricks runs list
.
Как вы отметили,dbutils.notebook.run()
является синхронным и не возвращает значение коду до его завершения. Однако в пользовательском интерфейсе notbook идентификатор запуска и ссылка печатаются при запуске. Должен быть способ их запечатлеть. Пока не нашел как.
Другим возможным решением было бы создать некоторую конечную точку или ресурсы для дочерних записных книжек, чтобы проверить, следует ли им продолжать выполнение или выйти раньше, используя dbutils.notebooks.exit()
. Выполнение этой проверки между каждыми несколькими ячейками было бы похоже на подходы в статье, которую вы связали, только применительно к записной книжке, а не к потоку.