Запуск пайплайна в Vanilla-операции

Это самый простой способ запустить Flow: отдельный долгоживущий деплой контроллеров и воркеров не нужен — они поднимаются внутри одной YTsaurus vanilla-операции. Чтобы включить такой запуск, достаточно дописать в pipeline.yson блок vanilla.

Что потребуется

Конфигурационный файл:

  • pipeline.yson — runner config со спекой пайплайна. Чтобы пайплайн запустился в vanilla-операции, в нём должен быть блок vanilla с enable = %true (см. Как включить). Отдельный config.yson не нужен — node config внутри джоб строится автоматически.

И бинари — их роли зависят от языка:

  • pipeline — ваш бинарь пайплайна. Он же является flow_server (через TSimpleRunnerProgram) и работает контроллером, воркером и раннером.
  • pipeline — лёгкий Python-бинарь: лаунчер + компаньон.
  • flow_server — серверный бинарь Flow (yt/yt/flow/bin/flow_server), работающий контроллером и воркером; путь к нему передаётся раннеру через --flow-bin или переменную окружения YT_FLOW_BIN. Компаньон доставляется в джобу автоматически. Не задавайте entrypoint в параметрах ресурса компаньона: заданный executable, отличный от ./py_companion, раннер сохраняет как есть и считает, что компаньон уже есть в окружении джобы.
  • run.sh — скрипт запуска Java jar и компаньона; первым аргументом принимает полное имя главного класса.
  • flow_server — серверный бинарь Flow (yt/yt/flow/bin/flow_server), работающий контроллером и воркером; путь к нему передаётся раннеру через --flow-bin или переменную окружения YT_FLOW_BIN. Компаньон доставляется в джобу автоматически. Не задавайте classpath в параметрах ресурса компаньона: заданный classpath раннер сохраняет как есть и считает, что jar-файлы уже есть в окружении джобы.
  • pipeline — Go-бинарь: лаунчер + компаньон.
  • flow_server — серверный бинарь Flow (yt/yt/flow/bin/flow_server), работающий контроллером и воркером; путь к нему передаётся раннеру через --flow-bin или переменную окружения YT_FLOW_BIN. Компаньон доставляется в джобу автоматически. Не задавайте entrypoint в параметрах ресурса компаньона: заданный executable, отличный от ./go_companion, раннер сохраняет как есть и считает, что компаньон уже есть в окружении джобы.

Как включить

Добавьте в конфиг пайплайна блок vanilla:

"vanilla" = {
    "enable" = %true;
    "pool" = "<ваш-пул>";
    "worker" = {"count" = 5};
};

Обязательные параметры — pool и worker.count. Остальные поля имеют разумные значения по умолчанию: контроллер — одна джоба, каждая джоба (и контроллера, и воркера) получает cpu_limit = 6 и memory_limit = 18 GiB. Порты джобы при запуске без сетевого проекта по умолчанию запрашиваются у YTsaurus — фиксированные порты соседних джоб на хосте с общей сетью конфликтовали бы; в сетевом проекте у каждой джобы свой IP, и фиксированные порты rpc_port = 10080, monitoring_port = 10081 и companion.port = 10082 используются, если раннер не запрашивает порты для джобы. Подробнее — в Дополнительных параметрах.

При необходимости ресурсы переопределяются явно:

"vanilla" = {
    "enable" = %true;
    "pool" = "<ваш-пул>";
    "controller" = {"count" = 1; "cpu_limit" = 2; "memory_limit" = "8g"};
    "worker" = {"count" = 5; "cpu_limit" = 8; "memory_limit" = "32g"};
};

Полный список полей — в TVanillaConfig и TVanillaTaskConfig.

При запуске flow_server сам валидирует спеку, создаёт vanilla-операцию с двумя задачами (controller и worker), устанавливает спеку пайплайна и стартует его.

Дополнительные параметры

Реже используемые поля блока vanilla:

Параметр

Описание

runtime_proxy_role

RPC-роль прокси для runtime_cluster (роль кластера пайплайна на нём может не существовать). Учитывается, только когда runtime_cluster отличается от кластера пайплайна; на кластере пайплайна используется его proxy_role

cache_path

Файловый кеш YTsaurus, в который загружаются файлы джоб (общий для всех flow-операций кластера). Непустой, по умолчанию //tmp/yt_wrapper/file_storage/new_cache

И поля задач (controller/worker):

Параметр

Описание

layers

Cypress-пути porto-слоёв, монтируемых в корневую файловую систему задачи. Непустой список хотя бы у одной задачи включает porto-джобы для всей операции

system_layer_path

Базовый OS-слой задачи; переопределяет системный слой по умолчанию

set_container_cpu_limit

Запрашивает ограничение CPU контейнера значением cpu_limit, если среда исполнения поддерживает его. По умолчанию %false: раннер не задаёт это поле в спеке операции.

port_count

Сколько портов задача запрашивает у YTsaurus вместо фиксированных. Без сетевого проекта — по умолчанию 2 у контроллера и 3 у воркера; 0 оставляет фиксированные порты, если компаньонский раннер не увеличивает worker.port_count

На хосте с общей сетью фиксированные порты соседних джоб столкнулись бы — там порты нужно запросить у YTsaurus полем port_count задачи. Именно поэтому при запуске без сетевого проекта поле заполняется автоматически: port_count = 2 у контроллера и port_count = 3 у воркера; явное значение 0 возвращает фиксированные порты, если компаньонский раннер не увеличивает worker.port_count. Выданные порты приходят в переменных окружения YT_PORT_<i> и имеют приоритет над конфигом: YT_PORT_0 — rpc_port (и bus_server.port), YT_PORT_1 — monitoring_port, YT_PORT_2 — companion.port. Контроллеру и воркеру без компаньона достаточно двух портов, воркеру с компаньоном нужны три; при меньшем значении часть портов останется фиксированной и снова может конфликтовать.

Компаньонские раннеры на Go и Python устанавливают worker.port_count не меньше 3, когда Vanilla включена, даже если поле не задано или явно равно 0. Порты этих воркеров выделяются и при наличии сетевого проекта; для контроллера действуют правила выше.

Запуск пайплайна

./pipeline --config pipeline.yson
./pipeline --config pipeline.yson --flow-bin flow_server
./run.sh com.example.pipeline.PipelineMain --config pipeline.yson --flow-bin flow_server
./pipeline --config pipeline.yson --flow-bin flow_server

После старта раннер по умолчанию (YT_FLOW_WAIT=1) ждёт, пока пайплайн не перейдёт в состояние completed, и всё это время печатает новые записи публичного лога контроллера — те, что появились с момента начала ожидания; более ранние не выводятся. Раннер можно прервать — на запущенную операцию это не повлияет. С YT_FLOW_WAIT=0 раннер завершается сразу после запуска.

Только валидация спеки

Раннеры C++ и Java поддерживают --validate-only: они локально разбирают и проверяют статическую и динамическую спеки, не отправляя их контроллеру. Если спека невалидна, раннер завершится с ошибкой; иначе — успешно. Раннеры Python и Go не передают этот флаг в flow_server, поэтому вместо проверки могут запустить или обновить пайплайн. Ниже приведена команда для C++-раннера.

./pipeline --config pipeline.yson --validate-only

См. также