Краткое описание методов генерации фиксированных идентификаторов с использованием операторов Flink SQL
Краткое описание методов генерации фиксированных идентификаторов с использованием операторов Flink SQL

Базовые знания

Топология операторов задания Flink описывается бегущим графом, состоящим из ряда операторов, как показано на следующем рисунке:

Содержит графики работы нескольких операторов Flink.
Содержит графики работы нескольких операторов Flink.

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

Если пользователь явно не указывает оператор ID,Flink будет использовать топологию,Автоматически генерировать свой собственный идентификатор

Описание проблемы

Когда мы пишем задания Flink через SQL или API таблиц, пользовательской стороне сложно напрямую участвовать в логике генерации оператора бюджета, поскольку для получения окончательного оператора Flink его необходимо транслировать и оптимизировать с помощью Calcite.

Например, если пользователь слегка модифицирует код SQL или обновляет версию Flink, это может привести к изменению рабочего графика, и автоматически сгенерированный идентификатор оператора больше не будет соответствовать предыдущему, что приведет к невозможности восстановления моментального снимка.

Тогда возникает вопрос:как можнозафиксированныйоператориз ID,То есть, какие бы последующие модификации ни вносились,,Пока этот оператор остается самим собой,тогда это из ID Неужели это никогда не изменится?

Принцип введения

существовать DataStream API В режиме программирования Flink предоставляет фиксированные операторы ID путь: мы можем пройти uid() Метод явно устанавливает строку для оператора идентификатор, за которым следует Flink поставлю это uid руководить hash обработка и, наконец, сопоставление с уникальным оператором ID。

Например, мы можемсуществовать Flink Следующий пример находится в тестовом коде:

код Язык:javascript
копировать
env.addSource(new StatefulSource(false, finalCheckpointLatch))
        .uid(SOURCE_UID)
        .setParallelism(NUM_SOURCES)
        .sinkTo(sink)
        .setParallelism(NUM_SINKS)
        .uid(SINK_UID);

существоватьэтот В примере,Пользователь для Source и Sink Оператор явно объявлен жидкость. Таким образом, независимо от того, сколько других операторов будет добавлено в середине, это не повлияет. Source и Sink статус совпадает.

этот uid() Нижний уровень метода — вызов Transformation#setUid() метод установки uid , поэтому прорыв здесь: как найти Flink SQL созданный Объект трансформации,идляэтонастраиватьтолькоиз uid。

Мы уже можем узнать из многих статей Flink из SQL код преобразован в Transformation изшаг,НапримерЭта статья,Поэтому в этой статье не буду повторять подробности.

Короче говоря, Флинк из SQL домашнее задание, которое нужно выполнить SQL код → SqlNode AST синтаксическое дерево → Operation слой абстракции → RelNode логическое дерево → RelNode физическое дерево → ExecNodeGraph Схема выполнения → Transformations → StreamGraph → JobGraph → ExecutionGraph наконец-то может быть отправлен на выполнение.

Исправлен первый метод UID: отслеживание ссылок.

Поскольку мы знаем, что пока мы даем Transformation настраивать uid Вы можете гарантировать последующее сопровождение со стороны оператора ID фиксированный, вы можете думать об этом наоборот: до тех пор, пока он существует из предшественника ExecNode Сохранить в uid,Таксуществовать ExecNodeBase#translateToPlanInternal В этом методе мы можем сохранить согласно этому uid Приходитьнастраивать Transformation из uid。

Например, создадим новый StreamExecCalc из подкатегории, названной для EnhancedStreamExecCalc, переопределить translateToPlanInternal метод:

код Язык:javascript
копировать
@Override
protected Transformation<RowData> translateToPlanInternal(PlannerBase planner) {
    Transformation<RowData> transformation = super.translateToPlanInternal(planner);
    transformation.setUid(uid);
    return transformation;
}

Это расслабляет Transformation проведет нас до конца uid Передайте это дальше.

Следуй идее этого,Продолжим обратный путь,существовать ExecNode из предшественника, то есть StreamPhysicalRel в, тоже присоединяйся uid поле. Вот так это созданный ExecNode Вы можете взять его с собой uid информация.

Например, мы можем продолжить создание нового StreamPhysicalCalc из подкласса, переопределить translateToExecNode Метод, существующий здесь, только что упомянутый там uid из EnhancedStreamExecCalc объект.

Позже мы добавили Planner Правило: напишите правила сопоставления на основе характеристик оператора (таких как имя, параметры) и RelNode Замените его на нашу расширенную версию.

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

Исправлен второй метод UID: официальное улучшение

Из-за недостаточной универсальности упомянутого выше «одноточечного» метода улучшения Flink Сообществосуществовать FLIP-190: Support Version Upgrades for Table API & SQL Programs В предложении по таким причинам ID Существует систематическое решение проблем несовместимости, вызванных изменениями (оно еще не доработано).

Основные технические моменты этого предложения по-прежнему формируются в соответствии с определенными правилами. Transformation из uid, таким образом гарантируя, что оператор графа будет запущен ID иззафиксированный. Здесь добавлен новый TransformationMetadata Класс существования, только что упомянутый, из translateToPlanInternal Метод записывает определенное имя оператора, uid, запись и другие метаданные.

Основная идея – увеличить COMPILE PLAN высказывание, поставьте данное из SQL Логика запроса становится JSON описывать Plan документация (см. Образец файла),впоследствиипользовательможет пройти EXECUTE PLAN заявление, исполнениеэтот JSON Формат из Plan документ. если бы только Plan Формат файла совместим с из,оператор ID из Генерация правил фиксации может обеспечить логику конечной схемы работы оператора ID из Стабильности.

Пользователям нужно только существование Flink в параметрахнастраивать table.exec.uid.generation для PLAN_ONLY(значение по умолчанию),Эту функцию можно включить。для всех COMPILE PLAN В заявлении содержится логика, Флинк Будет для каждого оператора согласно правилам (по table.exec.uid.format Контроль параметров) генерировать уникальные из ID。

Подвести итог

Эта статья объясняет Flink оператор ID из использования, логики генерации и последствий несоответствия, и проанализировано, как явно указать SQL заявлениесозданный Различные структурынастраиватьзафиксированныйиз uid, позже также представленный Flink Мысли сообщества о том, как справиться с этой проблемой. Я надеюсь, что они вдохновят всех.

boy illustration
Неразрушающее увеличение изображений одним щелчком мыши, чтобы сделать их более четкими артефактами искусственного интеллекта, включая руководства по установке и использованию.
boy illustration
Копикодер: этот инструмент отлично работает с Cursor, Bolt и V0! Предоставьте более качественные подсказки для разработки интерфейса (создание навигационного веб-сайта с использованием искусственного интеллекта).
boy illustration
Новый бесплатный RooCline превосходит Cline v3.1? ! Быстрее, умнее и лучше вилка Cline! (Независимое программирование AI, порог 0)
boy illustration
Разработав более 10 проектов с помощью Cursor, я собрал 10 примеров и 60 подсказок.
boy illustration
Я потратил 72 часа на изучение курсорных агентов, и вот неоспоримые факты, которыми я должен поделиться!
boy illustration
Идеальная интеграция Cursor и DeepSeek API
boy illustration
DeepSeek V3 снижает затраты на обучение больших моделей
boy illustration
Артефакт, увеличивающий количество очков: на основе улучшения характеристик препятствия малым целям Yolov8 (SEAM, MultiSEAM).
boy illustration
DeepSeek V3 раскручивался уже три дня. Сегодня я попробовал самопровозглашенную модель «ChatGPT».
boy illustration
Open Devin — инженер-программист искусственного интеллекта с открытым исходным кодом, который меньше программирует и больше создает.
boy illustration
Эксклюзивное оригинальное улучшение YOLOv8: собственная разработка SPPF | SPPF сочетается с воспринимаемой большой сверткой ядра UniRepLK, а свертка с большим ядром + без расширения улучшает восприимчивое поле
boy illustration
Популярное и подробное объяснение DeepSeek-V3: от его появления до преимуществ и сравнения с GPT-4o.
boy illustration
9 основных словесных инструкций по доработке академических работ с помощью ChatGPT, эффективных и практичных, которые стоит собрать
boy illustration
Вызовите deepseek в vscode для реализации программирования с помощью искусственного интеллекта.
boy illustration
Познакомьтесь с принципами сверточных нейронных сетей (CNN) в одной статье (суперподробно)
boy illustration
50,3 тыс. звезд! Immich: автономное решение для резервного копирования фотографий и видео, которое экономит деньги и избавляет от беспокойства.
boy illustration
Cloud Native|Практика: установка Dashbaord для K8s, графика неплохая
boy illustration
Краткий обзор статьи — использование синтетических данных при обучении больших моделей и оптимизации производительности
boy illustration
MiniPerplx: новая поисковая система искусственного интеллекта с открытым исходным кодом, спонсируемая xAI и Vercel.
boy illustration
Конструкция сервиса Synology Drive сочетает проникновение в интрасеть и синхронизацию папок заметок Obsidian в облаке.
boy illustration
Центр конфигурации————Накос
boy illustration
Начинаем с нуля при разработке в облаке Copilot: начать разработку с минимальным использованием кода стало проще
boy illustration
[Серия Docker] Docker создает мультиплатформенные образы: практика архитектуры Arm64
boy illustration
Обновление новых возможностей coze | Я использовал coze для создания апплета помощника по исправлению домашних заданий по математике
boy illustration
Советы по развертыванию Nginx: практическое создание статических веб-сайтов на облачных серверах
boy illustration
Feiniu fnos использует Docker для развертывания личного блокнота Notepad
boy illustration
Сверточная нейронная сеть VGG реализует классификацию изображений Cifar10 — практический опыт Pytorch
boy illustration
Начало работы с EdgeonePages — новым недорогим решением для хостинга веб-сайтов
boy illustration
[Зона легкого облачного игрового сервера] Управление игровыми архивами
boy illustration
Развертывание SpringCloud-проекта на базе Docker и Docker-Compose