Lineage в YTsaurus Flow

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

Зачем нужен lineage

Lineage используется фреймворком в двух целях:

  1. Вычисление метаполей. На основе родительских сообщений Flow автоматически заполняет метаполя выходных сообщений: EventTimestamp, AlignmentTimestamp и другие. Для Swift-компьютейшенов и passthrough AlignmentTimestamp наследуется от родителей без изменений — это гарантирует корректную приоритизацию сообщений в downstream-компьютейшенах.

  2. Гарантии порядка производных сообщений. Если у двух сообщений совпадают ключи группировки по всей цепочке lineage от источника до текущего компьютейшена, то их относительный порядок обработки сохраняется. Подробнее — в разделе Порядок обработки сообщений.

Поведение по умолчанию

В большинстве случаев явно управлять lineage не нужно — фреймворк устанавливает родителей автоматически:

Тип функции Родитель выходного сообщения
IProcessFunction::ProcessMessage / RowFunction текущее входное сообщение
IBatchProcessFunction::Process / BatchFunction все сообщения текущего батча
Обработчик таймера текущий таймер

Когда задавать lineage явно

По умолчанию родителем выходного сообщения считается весь текущий батч. Явный lineage позволяет сузить это множество до конкретного подмножества входных объектов, что делает вычисление EventTimestamp и AlignmentTimestamp более точным.

В Swift-компьютейшене сужение обязательно: у каждого выходного сообщения должен быть ровно один родитель (несколько — только при allow_batching_with_relaxed_guarantees). При обработке по одному сообщению фреймворк назначает родителя автоматически; в batch-обработке его задаёт пользовательский код. В Transform-компьютейшене явный lineage необязателен.

API

Lineage устанавливается через метод SetParents / set_parent_ids / setParentIds / WithParentIDs на объекте OutputCollector. Метод возвращает новый коллектор с привязанным контекстом lineage — все вызовы AddMessage / add_message / addMessage на нём будут нести этот lineage.

Подробнее об использовании в каждом языке:

Статистика преобразования

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

См. также

Предыдущая