Flink использует Kafka для связывания вычислительных задач и использует Kafka ровно один раз для достижения потоковых вычислений без дублирования или потерь. Семантика Kafka Exactly Once совместно реализуется посредством его характеристик транзакционной и производственной идемпотентности.
Flink — это платформа потоковых вычислений в реальном времени, «в реальном времени». Одно означает, что данные генерируются в «реальном времени», а другое означает, что процесс статистического анализа выполняется в «реальном времени».
Независимо от того, используете ли вы Flink, Spark или другие платформы потоковых вычислений, задачу определения потоковых вычислений можно в основном разделить на три части: определение ввода, определение логики вычислений и определение вывода. С точки зрения непрофессионала, то есть: откуда поступают данные. Откуда посчитать и куда записать результаты - это три вещи.
Как выполняются вычислительные задачи во Flink? Общая картина следующая:
Эта картина немного сложна, поэтому давайте не будем обращать внимания на детали и посмотрим на общую картину. Кластер Flink похож на другие распределенные системы. Большинство узлов в кластере являются узлами TaskManager, и каждый узел представляет собой процесс Java, отвечающий за выполнение вычислительных задач. Другой тип узла — это узел JobManager, который отвечает за управление и координацию всех вычислительных узлов и вычислительных задач. В то же время клиент и веб-консоль также отправляют и управляют каждой вычислительной задачей через JobManager.
После того, как мы напишем код вычислительной задачи, упакуем его в JAR-файл, а затем отправим его в JobManager через клиент Flink. После того, как вычислительная задача будет проанализирована Flink, будет создан граф потока данных, также называемый JobGraph или сокращенно DAG. Это ориентированный ациклический граф (DAG).
Каждый узел в JobGraph — это задача, задача может выполняться параллельно, а каждый поток — это подзадача. Подзадача назначается TaskManager с помощью JobManager и выполняется в потоке процесса TaskManager.
Сама среда потоковых вычислений представляет собой распределенную систему, обычно состоящую из нескольких узлов, образующих кластер. Когда наши вычислительные задачи выполняются в вычислительном кластере, они будут разделены на несколько подзадач, и эти подзадачи также распределяются по нескольким вычислительным узлам в кластере.
Большинство платформ потоковых вычислений используют конструкцию разделения хранения и вычислений и сохраняют статус вычислительных задач в распределенных системах хранения, таких как HDFS. После того, как каждая подзадача разделяет состояние, он становится узлом без состояния. Если вычислительный узел выходит из строя, любой узел в кластере можно использовать для замены вышедшего из строя узла.
Однако для потоковых вычислений все еще существует нерешенная проблема: данные, текущие в кластере, не сохраняются, поэтому они могут быть потеряны из-за сбоя узла. Как решить эту проблему? Этот метод также относительно прост и груб: он заключается в непосредственном перезапуске всей вычислительной задачи и отслеживании некоторых данных из источника данных. После перезапуска вычислительной задачи произойдет перераспределение вычислительных узлов и миграция неисправностей завершится.
Обратная трассировка источника данных может гарантировать, что данные не будут потеряны. Это похоже на метод повторной отправки неудачных сообщений в очередях сообщений, чтобы гарантировать, что данные не будут потеряны.
Кластер Flink сам по себе также является распределенной системой. Сначала необходимо обеспечить, чтобы данные вычислялись только один раз внутри кластера Flink. Только на этой основе можно достичь сквозного метода Exactly Once.
Flink использует механизм CheckPoint для регулярного сохранения снимков вычислительных задач. Этот снимок в основном содержит две важные данные:
Статус всей вычислительной задачи. Это состояние в основном представляет собой временные данные о состоянии, которые каждая подзадача должна сохранять во время процесса расчета в задаче расчета. Например, половина данных была суммирована в примере из предыдущего урока.
Информация о местоположении источника данных. Эта информация записывает, какие данные были рассчитаны в этом потоке из источника данных. Если источником данных является тема Kafka, эта информация о местоположении является местом потребления в теме Kafka.
Flink гарантирует, что позиция и состояние в CheckPoint полностью соответствуют друг другу, вставляя в поток данных Barrier.
Сквозная семантика Exactly Once может гарантировать, что в распределенной системе каждый фрагмент данных обрабатывается только один раз. В потоковых вычислениях, поскольку дублирование данных может привести к ошибкам в результатах вычислений, функция Exactly Once особенно важна в сценариях потоковых вычислений. И Kafka, и Flink предоставляют функции, которые гарантируют Exactly Once, а при совместном использовании может быть достигнута сквозная семантика Exactly Once.
В Flink в случае сбоя узла вычислительные задачи могут быть автоматически перезапущены, а вычислительные узлы могут быть переназначены для обеспечения доступности системы. Сотрудничая с механизмом CheckPoint, он может гарантировать, что состояние задачи после перезапуска будет восстановлено до последнего CheckPoint, а затем продолжить чтение данных из позиции восстановления, записанной в CheckPoint для расчета. Flink использует умный Barrier, чтобы полностью соответствовать позиции восстановления в CheckPoint и статусу каждого узла.
Семантика Exactly Once в Kafka реализована совместно посредством идемпотентных функций транзакций и производства. При работе с Flink каждая CheckPoint Flink соответствует транзакции Kafka. Пока транзакции CheckPoint и Kafka отправляются синхронно, может быть достигнут сквозной метод Exactly Once, который гарантирует CheckPoint с помощью классического «двухфазного» алгоритма. commit» для распределенных транзакций. Согласованность с состоянием транзакции Kafka.
ЯсуществоватьучаствоватьНа третьем этапе специального тренировочного лагеря Tencent Technology Creation 2023 года будет проводиться конкурс сочинений. Соберите команду, чтобы выиграть приз!