Привет :) У меня есть вопросы по поводу поведения блокировки или мьютекса.

Сценарии :

Предположим следующие сценарии:

  1. Конвейер работает с некоторыми локальными файлами. Эти файлы были размещены заданиями CI-CD. После обработки я хочу удалить файлы. Это может привести к состоянию гонки, если задание занимает больше времени, чем интервал расписания.
  2. два конвейера очень требовательны к ресурсам и поэтому не могут работать параллельно.

возможные решения

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

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

Благодарность

0
Thobial 17 Ноя 2020 в 17:39

3 ответа

Лучший ответ

Спасибо, что поделились своим вариантом использования. Я не думаю, что Dagster в настоящее время поддерживает эти функции изначально. Однако выпуск 0.10.0 (выйдет через несколько месяцев) будет включать организацию очередей на уровне выполнения, что позволит вам установить ограничения на одновременные запуски конвейера. В настоящее время он поддерживает только глобальное ограничение на запуски, но скоро будет поддерживать добавление правил на основе тегов конвейера (например, конвейеры с тегом «ресурсоемкие» могут быть ограничены до 3 одновременных запусков). Кажется, это подходит для этого варианта использования?

Руководство по предварительному просмотру текущей системы очередей находится здесь . Также не стесняйтесь обращаться ко мне по поводу Dagster Slack на @johann!

1
Johann Miller 17 Ноя 2020 в 17:40

Я не знаком с dagster, но механизм, который я успешно использовал в других контекстах, заключается в использовании того факта, что в Unix-подобных системах rename или mv является атомарной операцией. Для вашего первого требования к очистке после прогона:

  1. Новые файлы помещаются во входной каталог. Набор входных файлов может быть выделен в отдельный каталог.

  2. Когда процесс конвейера запускается, его первая операция - выбрать файл (или каталог) из входного каталога и перенести его в рабочий каталог, принадлежащий экземпляру конвейера. Если во входном каталоге нет доступных файлов, процесс корректно завершает свою работу.

  3. Если mv был успешным, процесс продолжает делать свою работу с файлом (каталогом), который он только что переместил в свой рабочий каталог. Когда он завершается, он очищается после себя, возможно, путем рекурсивного удаления своего рабочего каталога.

  4. Если mv не работает, это означает, что другой процесс захватил новый файл из-под этого. Проигрышный процесс изящно завершается.

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

try:
    open('sentinel', 'x').close()
except FileExistsError:
    exit("someone else already has sentinel")

do_stuff()

os.remove('sentinel')

Конечно, если ваш процесс выйдет из строя где-то в do_stuff (), вам придется вручную очистить файл дозорного, или вы можете использовать обработчик atexit, чтобы гарантировать, что дозорный удален даже в случае сбоя в do_stuff ( ).

1
Tom Barron 17 Ноя 2020 в 15:22

Для сценария № 2 (обработка конвейеров, которые очень ресурсоемки и которые нельзя запускать параллельно) можно было бы использовать dagster Celery, например celery_executor, celery_docker_executor или celery_k8s_job_executor (если вы используете kubernetes).

Принцип их работы заключается в том, что координатор запуска конвейера Dagster добавляет каждую твердую задачу выполнения в очередь Celery, а Celery позволяет ограничить количество активных задач в каждой очереди. Это обычно используется, например, для того, чтобы гарантировать, что только X твердых тел подключены к Redshift в данный момент времени.

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

Что касается сценария №1, я не уверен, какие у вас ограничения дизайна. Одна из идей состоит в том, чтобы использовать схему тегов для тегов конвейера, чтобы отслеживать, какой участок конвейера соответствует какому файлу; затем для каждого файла процесс, выполняющий очистку файла, сначала проверяет, существует ли успешный запуск конвейера перед удалением (путем запроса выполнения db).

0
Catherine Wu 18 Ноя 2020 в 01:26