Lineage в YTsaurus Flow
Lineage (с англ. родословная) — это информация о том, из каких входных сообщений и таймеров был получен конкретный выходной результат компьютейшена. Эта информация используется фреймворком в момент обработки для вычисления метаданных и обеспечения гарантий порядка, но не сохраняется в самом выходном сообщении.
Зачем нужен lineage
Lineage используется фреймворком в двух целях:
-
Вычисление метаполей. На основе родительских сообщений Flow автоматически заполняет метаполя выходных сообщений:
EventTimestamp,AlignmentTimestampи другие. Для Swift-компьютейшенов и passthroughAlignmentTimestampнаследуется от родителей без изменений — это гарантирует корректную приоритизацию сообщений в downstream-компьютейшенах. -
Гарантии порядка производных сообщений. Если у двух сообщений совпадают ключи группировки по всей цепочке 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 оценивает отношение выхода ко входу для каждой пары потоков, отдельно по количеству сообщений и размеру в байтах. Статистика учитывает обработанные сообщения, а не гарантированно доставленные.