Руководство по прохождению интервью Flink

Большие данные

Обзор

2019 год — самый необычный год в области вычислений больших данных в режиме реального времени.В январе 2019 года исходный код Alibaba Blink (внутренняя версия филиала Flink) был открыт, и область больших данных перешла от Spark к эпохе гегемонии двух держав в одночасье. . Flink стал популярным фреймворком для обработки больших данных благодаря своим характеристикам естественных потоковых вычислений и высокой производительности обработки.

Сегодня Flink разработан до версии 1.9. В области разработки больших данных проверка Flink на собеседовании уже является обязательной для соискателей работы в области разработки больших данных. Эта статья объединяет мой опыт интервьюера и суммирует почти 50 интервью и инспекционный пункт около Flink.

В этом чате он разделен на следующие части:

Первая часть: основные понятия и основы Flink, включая общее введение в Flink, основные понятия, операторы и другие точки проверки.

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

Третья часть: исходный код Flink, включая реализацию основного кода Flink, процесс отправки заданий, обмен данными, механизм распределенных снимков и принцип Flink SQL.

Часть 1. Основные понятия и базовые исследования в Flink

1. Краткое введение в Flink

Flink — это платформа и механизм распределенной обработки для вычислений с отслеживанием состояния на неограниченных и ограниченных потоках данных. И Flink обеспечивает основные функции, такие как распределение данных, механизм отказоустойчивости и управление ресурсами.

Flink предоставляет пользователям множество API-интерфейсов абстракции высокого уровня для написания распределенных задач:

  • DataSet API, который выполняет пакетные операции со статическими данными и абстрагирует статические данные в распределенные наборы данных. Пользователи могут легко использовать различные операторы, предоставляемые Flink для обработки распределенных наборов данных. Поддерживаются Java, Scala и Python.
  • DataStream API, который выполняет операции потоковой обработки потоков данных, абстрагирует потоковые данные в распределенные потоки данных и позволяет пользователям легко выполнять различные операции с распределенными потоками данных и поддерживает Java и Scala.
  • Table API выполняет операции запросов к структурированным данным, абстрагирует структурированные данные в реляционные таблицы и выполняет различные операции запросов к реляционным таблицам через SQL-подобный DSL, поддерживающий Java и Scala.

Кроме того, Flink также предоставляет доменные библиотеки для конкретных областей применения, таких как: Flink ML, библиотека машинного обучения Flink, предоставляет API конвейеров машинного обучения и реализует различные алгоритмы машинного обучения. Gelly, библиотека графовых вычислений Flink, предоставляет API-интерфейсы, связанные с графовыми вычислениями и реализацией различных алгоритмов графовых вычислений.

Согласно введению на официальном сайте, функции Flink включают в себя:

支持高吞吐、低延迟、高性能的流处理
支持带有事件时间的窗口 (Window) 操作
支持有状态计算的 Exactly-once 语义
支持高度灵活的窗口 (Window) 操作,支持基于 time、count、session 以及 data-driven 的窗口操作
支持具有 Backpressure 功能的持续流模型
支持基于轻量级分布式快照(Snapshot)实现的容错
一个运行时同时支持 Batch on Streaming 处理和 Streaming 处理
Flink 在 JVM 内部实现了自己的内存管理
支持迭代计算
支持程序自动优化:避免特定情况下 Shuffle、排序等昂贵操作,中间结果有必要进行缓存

2. В чем разница между Flink и традиционной потоковой передачей Spark?

Это очень широкий вопрос, потому что эти две структуры очень разные. Но есть очень важные моменты, на которые необходимо ответить во время собеседования:Flink — это стандартный механизм обработки в реальном времени, основанный на управлении событиями. А Spark Streaming — это модель Micro-Batch.

Ниже мы представим основные различия между двумя фреймворками в нескольких аспектах:

1. Архитектурная модель

Основные роли Spark Streaming во время выполнения включают: Master, Worker, Driver и Executor Flink в основном включает в себя: Jobmanager, Taskmanager и Slot во время выполнения.

2. Планирование задач

Spark Streaming непрерывно генерирует крошечные пакеты данных и строит направленный ациклический граф DAG.Spark Streaming последовательно создает DStreamGraph, JobGenerator и JobScheduler.

Flink создает StreamGraph на основе кода, отправленного пользователем, создает JobGraph после оптимизации, а затем отправляет его в JobManager для обработки. JobManager создает ExecutionGraph на основе JobGraph. ExecutionGraph — это основная структура данных для планирования Flink.

3. Механизм времени

Механизм времени, поддерживаемый Spark Streaming, ограничен и поддерживает тольковремя обработки. Flink поддерживает три определения обработчиков потоков во времени:Время обработки, время события, время инъекции. Также поддерживаетwatermarkмеханизм обработки запаздывающих данных.

4. Механизм отказоустойчивости

Для задач Spark Streaming мы можем установить контрольную точку, а затем, если произойдет сбой и произойдет перезапуск, мы сможем восстановиться с последней контрольной точки, но такое поведение может только предотвратить потерю данных, и может обрабатываться повторно, и не может достичь точно- после обработки семантики.

Flink использует протокол двухфазной фиксации для решения этой проблемы.

3. Каковы стеки компонентов Flink?

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

fileИсточник изображения: https://flink.apache.org

Снизу вверх каждый уровень представляет: Уровень развертывания: этот уровень в основном включает режим развертывания Flink.Как видно на рисунке выше, Flink поддерживает несколько режимов развертывания, включая локальный, автономный, кластерный и облачный. Уровень выполнения. Уровень выполнения обеспечивает базовую реализацию, поддерживающую вычисления Flink, например, поддержку распределенной потоковой обработки, отображение JobGraph в ExecutionGraph, планирование и т. д., а также предоставляет базовые службы для верхнего уровня API. Уровень API: Уровень API в основном реализует API-интерфейсы потоковой (Stream) и пакетной (Batch) обработки. Среди них потоковая обработка соответствует DataStream API, а пакетная обработка соответствует DataSet API. версиях, Flink планирует унифицировать API DataStream и DataSet. Уровень библиотек: этот уровень называется уровнем платформы приложений Flink.В соответствии с разделением уровня API, вычислительная среда реализации, построенная на уровне API для удовлетворения конкретных приложений, также соответствует потоково-ориентированной и пакетно-ориентированной. Потоковая поддержка: CEP (обработка сложных событий), SQL-подобные операции (реляционные операции на основе таблиц), пакетная поддержка: FlinkML (библиотека машинного обучения), Gelly (обработка графов).

4. Должна ли работа Flink зависеть от компонентов Hadoop?

Flink может быть полностью независимым от Hadoop и работать без каких-либо зависимостей от компонентов Hadoop. Но как инфраструктуру больших данных, систему Hadoop нельзя обойти ни одной инфраструктурой больших данных. Flink может интегрировать многие компоненты Hadoop, такие как Yarn, Hbase, HDFS и т. д. Например, Flink может интегрироваться с Yarn для планирования ресурсов, чтения и записи HDFS или использования HDFS для создания контрольных точек.

5. Насколько велик ваш кластер Flink?

Внимание всем, этот вопрос, кажется, касается масштаба кластера Flink в вашем реальном приложении.На самом деле, есть еще один скрытый вопрос: сколько узлов может поддерживать Flink?

Отвечая на этот вопрос, вы можете объяснить масштаб кластера, узлы и условия памяти в вашем производственном процессе, а также режим развертывания (обычно Flink on Yarn).Кроме того, пользователи также могут работать в небольших кластерах (менее 5 узлов). ) и тысячи узлов с терабайтами состояния для выполнения задач Flink.

6. Вы понимаете базовую модель программирования Flink?

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

7. Каковы роли кластера Flink? Какова роль каждого?

file

Программы Flink в основном имеют три роли: TaskManager, JobManager и Client во время выполнения. JobManager играет роль диспетчера Master в кластере, координатора всего кластера, отвечающего за получение заданий Flink, координацию контрольных точек, аварийное восстановление после отказа и т. д., а также за управление подчиненным узлом TaskManager в кластере Flink.

TaskManager — это Worker, который фактически отвечает за выполнение вычислений.Набор задач, на которых выполняется задание Flink.Каждый TaskManager отвечает за управление информацией о ресурсах на своем узле, такой как память, диск и сеть, и отправляет статус ресурса в JobManager при его запуске.

Клиент — это клиент, представленный программой Flink. Когда пользователь отправляет программу Flink, сначала будет создан клиент. Клиент сначала предварительно обработает программу Flink, отправленную пользователем, и отправит ее в кластер Flink для обработки. Клиент должен быть обработан от пользователя.Получите адрес JobManager из отправленной конфигурации программы Flink, установите соединение с JobManager и отправьте задание Flink в JobManager.

8. Расскажите о концепции Task Slot в управлении ресурсами Flink.

file

В роли архитектуры Flink мы упомянули, что TaskManager — это Worker, который фактически отвечает за выполнение вычислений, а TaskManager — это процесс JVM, который выполняет одну задачу или несколько подзадач с независимыми потоками. Чтобы контролировать, сколько задач может принять TaskManager, Flink предлагает концепцию Task Slot.

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

9. Расскажите об общих операторах Flink?

Наиболее часто используемые операторы в Flink включают: Map: DataStream → DataStream Введите параметр для создания параметра Функция карты заключается в преобразовании входного параметра. Фильтр: отфильтровать данные указанного условия. KeyBy: группировка по указанному ключу. Уменьшить: используется для агрегирования и объединения результатов. Окно: оконная функция, которая группирует данные каждой клавиши в соответствии с некоторыми характеристиками (например, данные, поступающие в течение 5 с).

10. Расскажите мне о стратегии разделов Flink, которую вы знаете?

Что понимать, что такое стратегия разделов. Стратегии секционирования используются для определения того, как данные отправляются вниз по течению. В настоящее время Flink поддерживает реализацию 8 стратегий разделения.

file

На приведенном выше рисунке представлена ​​диаграмма наследования стратегии разделения для всей реализации Flink:

GlobalPartitionerДанные распределяются на первый экземпляр нижестоящего оператора для обработки.

ShufflePartitionerДанные случайным образом распределяются между каждым экземпляром нижестоящего оператора для обработки.

RebalancePartitionerДанные циклически отправляются каждому нижестоящему экземпляру для обработки.

RescalePartitionerЭтот разделитель будет выводить данные для каждого экземпляра нижестоящего оператора по кругу в соответствии с параллелизмом вышестоящего и нижестоящего операторов. Здесь немного сложно понять, предполагая, что восходящий параллелизм равен 2, пронумерованным A и B. Нисходящий параллелизм равен 4, а числа равны 1, 2, 3, 4. Затем A отправляет цикл данных на 1 и 2, а B отправляет цикл данных на 3 и 4. Предположим, что восходящий параллелизм равен 4, пронумерованным A, B, C, D. Нисходящий параллелизм равен 2, а числа равны 1, 2. Затем A и B отправляют данные на 1, а C и D отправляют данные на 2.

BroadcastPartitionerШироковещательные разделы выводят восходящие данные для каждого экземпляра нижестоящего оператора. Он подходит для сценариев, где в качестве Jion используются большие наборы данных и небольшие наборы данных.

ForwardPartitionerForwardPartitioner используется для вывода записей в нижестоящие экземпляры локального оператора. Это требует одинаковой степени параллелизма вышестоящих и нижестоящих операторов. Проще говоря, ForwardPartitioner используется для консольной печати данных.

KeyGroupStreamPartitionerХэш-разделитель. Данные будут выводиться нижестоящему экземпляру оператора в соответствии со значением Hash ключа.

CustomPartitionerWrapperПользовательский разделитель. Пользователям необходимо самим реализовать интерфейс Partitioner, чтобы определить собственную логику разделов. Например:

static class CustomPartitioner implements Partitioner<String> {
      @Override
      public int partition(String key, int numPartitions) {
          switch (key){
              case "1":
                  return 1;
              case "2":
                  return 2;
              case "3":
                  return 3;
              default:
                  return 4;
          }
      }
  }

11. Вы понимаете параллелизм Flink? Какова настройка параллелизма Flink?

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

Мы можем установить степень параллелизма на четырех разных уровнях в реальной производственной среде:

  • Уровень оператора
  • Уровень среды выполнения
  • Уровень клиента
  • Системный уровень

Приоритет, на который следует обратить внимание: уровень оператора > уровень среды > уровень клиента > уровень системы.

12. В чем разница между слотом Flink и параллелизмом?

Очень классическая картинка на официальном сайте:

file

Слот относится к возможности одновременного выполнения диспетчера задач Предположим, мы настроили taskmanager.numberOfTaskSlots на 3, тогда каждому диспетчеру задач выделяется 3 слота задач, а 3 диспетчера задач имеют в общей сложности 9 слотов задач.

file

Параллелизм относится к возможности параллелизма, фактически используемой диспетчером задач. Допустим, мы установили parallelism.default в 1, тогда можно использовать только 1 из 9 TaskSlots, а 8 свободны.

13. Есть ли у Flink стратегия перезапуска? Подскажите какие есть?

Flink реализует различные стратегии перезапуска.

  • Стратегия перезапуска с фиксированной задержкой
  • Стратегия перезапуска частоты отказов
  • Стратегия без перезапуска
  • Стратегия резервного перезапуска

14. Использовали ли вы распределенный кеш во Flink? как пользоваться?

Распределенный кеш, реализованный Flink, аналогичен Hadoop. Цель состоит в том, чтобы прочитать файл локально и поместить его в узел диспетчера задач, чтобы предотвратить повторное выполнение задачи.

val env = ExecutionEnvironment.getExecutionEnvironment

// register a file from HDFS
env.registerCachedFile("hdfs:///path/to/your/file", "hdfsFile")

// register a local executable file (script, executable, ...)
env.registerCachedFile("file:///path/to/exec/file", "localExecFile", true)

// define your program and execute
...
val input: DataSet[String] = ...
val result: DataSet[Integer] = input.map(new MyMapper())
...
env.execute()

15. Говоря о широковещательных переменных во Flink, на что следует обратить внимание при их использовании?

Мы знаем, что Flink параллелен, и процесс расчета может вестись не в слоте, тогда возникает ситуация: когда нам нужно получить доступ к одним и тем же данным. Тогда широковещательная переменная во Flink должна решить эту ситуацию.

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

16. Расскажите об окнах во Flink?

Вот классическая картинка с официального сайта:file

Flink поддерживает два способа разделения окон по времени и количеству. Если окно разделено по времени, то это временное окно. Если окно разделено по данным, то это окно-счетчик.

Flink поддерживает два важных свойства окон (размер и интервал).

Если size=interval, то будет сформировано переворачивающееся окно (без перекрывающихся данных), если size>interval, то будет сформировано скользящее окно (с перекрывающимися данными), если size

Четыре основных окна могут быть получены комбинацией:

  • time-tumbling-window Окно времени без перекрывающихся данных, пример установки: timeWindow(Time.seconds(5))
  • time-sliding-window Окно времени с перекрывающимися данными, пример настройки: timeWindow(Time.seconds(5), Time.seconds(3))
  • count-tumbling-window Количество окон без перекрывающихся данных, пример установки: countWindow(5)
  • count-sliding-window имеет количество перекрывающихся окон данных, например: countWindow(5,3)

17. Расскажите о хранении статуса в FLINK?

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

Flink предоставляет три метода хранения состояния: MemoryStateBackend, FsStateBackend, RocksDBStateBackend.

18. Какие типы времени есть во Flink?

Время в Flink делится на три категории, как и время других систем потоковых вычислений: время события, время приема и время обработки.

Если временное окно определено на основе EventTime, будет сформировано EventTimeWindow, и требуется, чтобы само сообщение содержало EventTime. Если временное окно определено на основе IngestingTime, будет сформировано IngestingTimeWindow, основанное на системном времени источника. Окно ProcessingTimeWindow будет сформировано, если временное окно определено эталоном ProcessingTime, который зависит от системного времени оператора.

19. Что такое водяной знак во Flink и какую роль он играет?

Водяной знак — это механизм, предложенный Apache Flink для обработки расчета окна EventTime, который по сути является меткой времени. В общем, водяные знаки часто используются с Window для обработки нестандартных событий.

20. Знакомы ли вы с Flink Table & SQL? Что делает класс TableEnvironment?

TableEnvironment — это основная концепция интеграции Table API и SQL.

Этот класс в основном используется для:

  • Реестр во внутреннем каталоге
  • Зарегистрировать внешний каталог
  • Выполнить SQL-запрос
  • Регистрация пользовательских (скалярных, табличных или агрегатных) функций
  • Преобразование DataStream или DataSet в таблицу
  • содержит ссылку на ExecutionEnvironment или StreamExecutionEnvironment

20. Каков принцип реализации Flink SQL? Как реализовать парсинг SQL?

Прежде всего, вы должны знать, что синтаксический анализ SQL Flink основан на платформе Apache Calcite с открытым исходным кодом.file

Исходя из этого, полный процесс разбора SQL выглядит следующим образом:

  • Пользователи разрабатывают бизнес-приложения, используя внешний синтаксис Stream SQL.
  • Используйте кальцит для проверки синтаксиса StreamSQL.После прохождения проверки синтаксиса он преобразуется в узел логического дерева кальцита, наконец, формируется логический план кальцита.
  • Используйте настраиваемые правила оптимизации Flink, модель кальцитового вулкана и эвристическую модель для совместной оптимизации логического дерева для создания оптимального физического плана Flink.
  • Используйте janino codegen для генерации кода для физического плана, создания потокового приложения, описанного низкоуровневым API DataStream, и отправки его на платформу Flink для выполнения.

Часть 2: Продвинутое интервью Flink

1. Как Flink поддерживает интеграцию пакетного потока?

file

В этом вопросе интервью исследуется только одно предложение: Разработчики Flink считают, что пакетная обработка — это частный случай потоковой обработки. Пакетная обработка — это ограниченная потоковая обработка. Flink поддерживает API DataSet и API DataStream с одним механизмом.

2. Как Flink обеспечивает эффективный обмен данными?

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

3. Как Flink обеспечивает отказоустойчивость?

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

4. Каков принцип распределенного моментального снимка Flink?

Распределенные моментальные снимки Flink адаптированы в соответствии с алгоритмом Чанди-Лэмпорта. Проще говоря, это непрерывное создание непротиворечивых снимков распределенных потоков данных и их состояния.

file

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

5. Как Flink гарантирует семантику Exactly-once?

Flink обеспечивает сквозную семантику согласованности, реализуя двухэтапную фиксацию и сохранение состояния. Делится на следующие этапы:

  • Начать транзакцию (beginTransaction), чтобы создать временную папку для записи данных в эту папку
  • PreCommit записывает кэшированные данные в память в файл и закрывает
  • Официальная фиксация (commit) помещает ранее записанные временные файлы в целевой каталог. Это означает, что окончательные данные будут с некоторой задержкой.
  • Abort отбрасывает временные файлы

Если отказ происходит после успешной предварительной подачи, но до официальной подачи. Предварительно зафиксированные данные могут быть зафиксированы или удалены в зависимости от статуса.

6. Что особенного в коннекторе kafka Flink?

В исходном коде Flink есть независимый модуль коннектора.Все остальные коннекторы зависят от этого модуля.Новый коннектор kafka, выпущенный Flink в версии 1.9, отказался от прежней практики подключения разных версий кластеров kafka и опоры на разные версии коннектора .Только нужно опираться на разъем.

Семь, расскажите, как у Флинка устроено управление памятью?

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

Теоретически управление памятью Flink разделено на три части:

  • Сетевые буферы: выделяются при запуске TaskManager.Это группа памяти, используемая для кэширования сетевых данных.Каждый блок равен 32 КБ, и по умолчанию выделяется 2048, что можно изменить с помощью «taskmanager.network.numberOfBuffers».
  • Пул управления памятью: большое количество блоков сегментов памяти, используемых для алгоритмов времени выполнения (сортировка/объединение/перетасовка и т. д.), которые будут выделены при запуске этой части. Следующий код вычисляет метод выделения памяти в соответствии с различными параметрами в файле конфигурации. (куча или вне кучи, это будет обсуждаться в следующем разделе), распределение памяти поддерживает предварительное выделение и ленивую загрузку, метод ленивой загрузки по умолчанию.
  • Пользовательский код, эта часть представляет собой структуру данных памяти, отличную от диспетчера памяти для пользовательского кода и самого диспетчера задач.

8. Расскажите о том, как выполняется сериализация Flink?

В Java есть свои функции сериализации и десериализации, но вспомогательная информация занимает много места, а при сериализации объектов записывается слишком много информации о классах.

Apache Flink отказывается от собственных методов сериализации Java и обрабатывает типы данных и сериализацию уникальным способом, включая собственный дескриптор типа, извлечение универсального типа и структуру сериализации типов.

TypeInformation — это базовый класс для всех дескрипторов типов. Он предоставляет некоторые основные свойства типа и может генерировать сериализаторы. TypeInformation поддерживает следующие типы:

  • BasicTypeInfo: любой базовый тип Java или тип String.
  • BasicArrayTypeInfo: любой массив базового типа Java или массив строк.
  • WritableTypeInfo: класс реализации любого интерфейса Hadoop Writable.
  • TupleTypeInfo: любой тип Flink Tuple (поддерживаются Tuple1–Tuple25). Кортежи Flink представляют собой реализации Java Tuple фиксированной длины и фиксированного типа.
  • CaseClassTypeInfo: любой Scala CaseClass (включая кортежи Scala)
  • PojoTypeInfo: любой POJO (Java или Scala), например, все переменные-члены объекта Java, определенные либо с помощью общедоступных модификаторов, либо с помощью методов получения/установки.
  • GenericTypeInfo: любой класс, который не может соответствовать предыдущим типам.

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

9. Окно во Flink имеет перекос данных, что вы можете сделать?

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

  • Выполните предварительную агрегацию до того, как данные попадут в окно
  • Редизайн ключа агрегации окон

10. Как устранить проблемы с данными при использовании агрегатных функций GroupBy, Distinct, KeyBy и других функций во Flink?

Перекос данных и горячие точки данных — это проблемы, которых не могут избежать все платформы больших данных. Решение таких проблем в основном начинается с трех аспектов:

  • Избегайте таких проблем в бизнесе

Например, в гипотетическом сценарии заказа объем заказов в Пекине и Шанхае увеличился в десятки раз, а объем данных остальных городов остается неизменным. В это время, когда мы агрегируем, будет происходить накопление данных в Пекине и Шанхае, и мы можем разделить данные Пекина и Шанхая.

  • Ключевой дизайн

Разделение горячих клавиш, таких как Пекин и Шанхай в предыдущем примере, может разделить и объединить Пекин и Шанхай по регионам.

  • настройки параметров

Важным улучшением оптимизации производительности Flink 1.9.0 SQL (Blink Planner) является обновление модели микропакетов, а именно MiniBatch. Принцип заключается в том, чтобы кэшировать определенные данные, а затем инициировать обработку для уменьшения доступа к состоянию, тем самым повышая пропускную способность и уменьшая вывод данных.

11. У Flink высокая задержка выполнения задач. Если вы хотите решить эту проблему, с чего начать?

В управлении фоновыми задачами Flink мы можем видеть, какой оператор и задача Flink имеют обратное давление. Наиболее важными средствами являются настройка ресурсов и настройка оператора. Настройка ресурсов — это настройка таких параметров, как количество одновременных операторов (параллелизм), ЦП (ядро) и динамической памяти (heap_memory) в задании. Настройка параметров задания включает в себя: настройку параллелизма, настройку состояния и настройку контрольной точки.

12. Как Flink справляется с противодавлением?

Flink внутренне основан на модели передачи сообщений «производитель-потребитель», и конструкция противодавления Flink также основана на этой модели. Flink использует эффективную и ограниченную распределенную очередь блокировки, как и общая очередь блокировки Java (BlockingQueue). Когда нижестоящие потребители потребляют медленнее, вышестоящие потребители будут заблокированы.

13. В чем разница между противодавлением Флинка и Стромом?

Storm отслеживает загрузку очереди приема в Bolt.Если уровень воды превышен, информация о противодавлении будет записана в Zookeeper.Watch на Zookeeper уведомит всех воркеров в топологии о переходе в состояние противодавления, и, наконец, Spout перестает отправлять кортежи.

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

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

14. Вы понимаете концепцию цепочек операторов?

Для более эффективного распределенного выполнения Flink будет связывать подзадачи оператора вместе, чтобы максимально сформировать задачи. Каждая задача выполняется в потоке. Объединение операторов в задачи — очень эффективная оптимизация: сокращается количество переключений между потоками, сокращается сериализация/десериализация сообщений, сокращается обмен данными в буферах, сокращается задержка и повышается общая пропускная способность. Это то, что мы называем цепочкой операторов.

15. При каких обстоятельствах Flink объединяет цепочки операторов в цепочку операторов?

Условия объединения двух операторов в цепочку:

  • Постоянный параллелизм между восходящим и нисходящим потоком
  • Нижестоящие узлы имеют степень вхождения 1 (то есть нижестоящие узлы не получают входных данных от других узлов).
  • И восходящий, и нисходящий узлы находятся в одной и той же группе слотов (группа слотов будет объяснена ниже).
  • Политика цепочки нисходящего узла ВСЕГДА (она может быть связана с восходящим и нисходящим потоком, по умолчанию для карты, плоской карты, фильтра и т. д. ВСЕГДА)
  • Политика цепочки вышестоящего узла — ВСЕГДА или HEAD (можно связываться только с нисходящим, а не восходящим потоком, по умолчанию для источника используется HEAD)
  • Метод разделения данных между двумя узлами является прямым (обратитесь к разделению потока данных).
  • Пользователь не отключил цепочку

16. Расскажите о новых возможностях Flink 1.9?

  • Поддержка чтения и записи куста, поддержка UDF
  • Оптимизации, такие как Flink SQL TopN и GroupBy
  • Контрольная точка и точка сохранения оптимизированы для реальных бизнес-сценариев
  • Запрос состояния Flink

17. Как бороться с грязными данными при использовании данных kafka?

Перед обработкой можно добавить оператор фильтра, чтобы отфильтровать данные, не соответствующие правилам.

Часть 3: Исходный код интервью Flink

1. Процесс отправки Flink JobЗадание Flink, отправленное пользователем, будет преобразовано в задачу DAG для запуска, а именно: StreamGraph, JobGraph, ExecutionGraph.Взаимодействие между JobManager и TaskManager в Flink, а также взаимодействие между JobManager и Client основано на наборе инструментов Akka и управляется по сообщениям. Отправка всего задания Flink также включает создание ActorSystem, запуск JobManager, а также запуск и регистрацию TaskManager.

2. Что представляют собой «графики» так называемой «трехслойной графической» структуры Флинка?

График расчета генерации DAG задачи Flink примерно проходит через следующие три процесса:

  • StreamGraph
    Для топологии вычислений, наиболее близкой к логическому уровню, выраженному кодом, добавьте StreamTransformation в StreamExecutionEnvironment в соответствии с порядком выполнения пользовательского кода, чтобы сформировать граф потоковой передачи.
  • JobGraph
    Генерируется из StreamGraph, объединяет узлы, которые можно объединять последовательно, устанавливает ребра между узлами, упорядочивает слоты для совместного использования ресурсов и размещает связанные узлы, загружает файлы, необходимые для задач, устанавливает конфигурации контрольных точек и т. д. Эквивалентно частично инициализированному и оптимизированному графу задач.
  • ExecutionGraph
    Преобразованный из JobGraph, он содержит содержимое, необходимое для конкретного выполнения задачи, и представляет собой граф выполнения, наиболее близкий к базовой реализации.

3. Какую роль JobManger играет в кластере?

JobManager отвечает за планирование задач и управление ресурсами всего кластера Flink, получает отправленные приложения от клиента, а затем выделяет соответствующие ресурсы TaskSlot отправленным приложениям в соответствии с использованием TaskSlot в TaskManager в кластере и дает указание TaskManager запустить приложение от клиента Приобретенное приложение.

JobManager эквивалентен Главному узлу всего кластера, и весь кластер имеет только один активный JobManager, отвечающий за управление задачами и управление ресурсами всего кластера.

Актерская система обменивается данными между JobManager и TaskManager, чтобы получить статус выполнения задачи и отправить статус выполнения прикладной задачи клиенту через акторную систему.

При этом в процессе выполнения задачи Flink JobManager инициирует операцию контрольной точки.После того, как каждый узел TaskManager получит инструкцию запуска контрольной точки, он завершит операцию контрольной точки.Все процессы согласования контрольной точки завершаются в Fink JobManager.

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

4. Какую роль JobManger играет в процессе запуска кластера?

Обязанности JobManager в основном заключаются в получении заданий Flink, планировании задач, сборе статуса заданий и управлении диспетчерами задач. Он содержит Актера и делает следующее:

  • RegisterTaskManager: он отправляется TaskManager, который хочет зарегистрироваться в JobManager. Если регистрация прошла успешно, подтверждение будет выполнено с помощью сообщения AcknowledgeRegistration.
  • SubmitJob: отправляется клиентом, который отправляет задание в систему. Представленная информация представляет собой описание работы в форме JobGraph.
  • CancelJob: запрос на отмену задания с указанным идентификатором. Возвращает CancellationSuccess в случае успеха, в противном случае возвращает CancellationFailure.
  • UpdateTaskExecutionState: отправляется TaskManager для обновления состояния исполнительного узла (ExecutionVertex). Возвращает true в случае успеха, false в противном случае.
  • RequestNextInputSplit: Задача TaskManager запрашивает следующее разделение ввода, возвращает NextInputSplit в случае успеха, в противном случае возвращает значение null.
  • JobStatusChanged: означает, что статус задания (ВЫПОЛНЯЕТСЯ, ОТМЕНА, ЗАВЕРШЕНО и т. д.) изменился. Это сообщение отправляется ExecutionGraph.

5. Какую роль TaskManager играет в кластере?

TaskManager эквивалентен подчиненному узлу всего кластера, отвечающему за выполнение конкретных задач и использование ресурсов, а также управление соответствующими задачами на каждом узле.

Клиент компилирует и упаковывает написанное приложение Flink и отправляет его в JobManager, а затем JobManager назначит задачу узлу TaskManager с ресурсами в соответствии с ситуацией с ресурсами TaskManager, зарегистрированной в JobManager, а затем запустит и запустит задачу. .

TaskManager получает задачи для развертывания от JobManager, а затем использует ресурс Slot для запуска задачи, установления сетевого подключения для доступа к данным, получения данных и запуска обработки данных. При этом взаимодействие данных между диспетчерами задач осуществляется через поток данных.

Видно, что работа задачи Flink на самом деле многопоточная, что сильно отличается от того, как работает MapReduce multi-JVM.Flink может значительно повысить эффективность использования ЦП.TaskSlot используется между несколькими задачами и задачами.Общие системные ресурсы, каждый TaskManager эффективно управляет ресурсами, управляя несколькими пулами ресурсов TaskSlot.

6. Какую роль TaskManager играет в процессе запуска кластера?

Процесс запуска TaskManager относительно прост: класс запуска: org.apache.flink.runtime.taskmanager.TaskManager Основной метод запуска: selectNetworkInterfaceAndRunTaskManager после запуска напрямую регистрируется в JobManager.После завершения регистрации некоторые модули инициализируются.

7. Как реализовано планирование вычислительных ресурсов Flink?

Наиболее детальным ресурсом в TaskManager является слот Task, который представляет подмножество ресурсов фиксированного размера, и каждый TaskManager равномерно распределяет ресурсы, которые он занимает, в свой слот.

Регулируя количество слотов задач, пользователь может определить, как задачи будут изолированы друг от друга. У каждого TaskManager есть слот, что означает, что каждая задача выполняется в отдельной JVM. Если каждый TaskManager имеет несколько слотов, то есть несколько задач выполняются в одной и той же JVM.

Задачи в одном и том же процессе JVM могут совместно использовать соединения TCP (на основе мультиплексирования) и контрольные сообщения, что может сократить передачу данных по сети и совместно использовать некоторые структуры данных, в определенной степени уменьшая потребление каждой задачи. Каждый слот может принимать одну задачу или конвейер, состоящий из нескольких последовательных задач.Как показано на рисунке ниже, функция FlatMap занимает один слот задач, а ключевая функция Agg и функция приемника делят слот задач:file

8. Кратко опишите процесс абстрагирования данных и обмена данными Flink?

Flink Чтобы избежать использования врожденных дефектов JVM, таких как плотность хранения объектов Java, FGC влияет на пропускную способность и отклик и т. д., реализовано независимое управление памятью. MemorySegment — это абстракция памяти Flink. По умолчанию MemorySegment можно рассматривать как абстракцию большого блока памяти размером 32 КБ. Эта память может быть BYTE [] в JVM или DirectByTbuffer.

Помимо абстракции MemorySegment, абстракцией или объектом памяти, используемым Flink, является Buffer в процессе передачи данных из объекта данных в операторе в TaskManager и подготовке к отправке на следующий узел.

Промежуточный объект, соединяющий переход от объектов Java к буферам, — это еще один абстрактный StreamRecord.

9. Как реализован механизм распределенных снимков во Flink?

Основной частью механизма отказоустойчивости Flink является создание согласованных моментальных снимков распределенных потоков данных и состояний операторов. Эти моментальные снимки действуют как контрольные точки согласованности, и в случае сбоя система может выполнить откат. Механизм, который Flink использует для создания этих моментальных снимков, описан в разделе «Легкие асинхронные моментальные снимки для распределенных потоков данных». Он основан на стандартном алгоритме Чанди-Лампорта для распределенных моментальных снимков и адаптирован специально для модели исполнения Flink.

file

Барьеры вводятся в параллельные потоки данных в источнике потока данных. Позиция, в которую вставлены барьеры снимка n (назовем ее Sn), является максимальной позицией данных, содержащихся в снимке, в источнике данных. Например, в Apache Kafka это расположение будет смещением последней записи в разделе. Сообщите позицию Sn координатору контрольно-пропускного пункта (Flink's JobManager).

Затем барьеры текут вниз по течению. Когда промежуточный оператор получает барьеры для моментального снимка n из всех своих входных потоков, он посылает барьеры для моментального снимка n во все свои выходные потоки. Как только оператор приемника (конец потоковой DAG) получает барьеры n из всех своих входных потоков, он подтверждает координатору контрольной точки, что снимок n завершен. После того, как все приемники подтвердят моментальный снимок, это означает, что моментальный снимок завершен.

После создания снимка n задание больше никогда не будет запрашивать у источника данных записи, предшествующие Sn, потому что в этот момент эти записи (и их последующие записи) уже прошли через всю топологию потока данных, то есть были обработаны.

10. Кратко расскажите, как реализован FlinkSQL?

Flink делегирует проверку SQL, анализ SQL и оптимизацию SQL в Apache Calcite. Кальцит также используется во многих других проектах с открытым исходным кодом, таких как Apache Hive, Apache Drill, Apache Kylin, Cascading. Кальцит лежит в основе новой архитектуры, как показано на рисунке ниже.file

Calcite должен построить абстрактное синтаксическое дерево. SQL-запрос будет преобразован в дерево узлов SQL синтаксическим анализатором Calcite, и после проверки он будет построен в виде абстрактного синтаксического дерева Calcite (то есть логического плана на рисунке). С другой стороны, вызовы Table API будут создаваться в абстрактном синтаксическом дереве Table API и преобразовываться в абстрактное синтаксическое дерево Calcite с помощью RelBuilder, предоставляемого Calcite. Затем он преобразуется в план логического выполнения и план физического выполнения по очереди.

После отправки задачи она будет распределена по каждому диспетчеру задач для запуска, а компилятор Janino будет использоваться для компиляции кода и запуска его во время выполнения.

Добро пожаловать в другие чаты автора:

Руководство по интервью по разработке больших данных Самое острое оружие Flink: введение в Flink SQL и реальная битва

Руководство по собеседованию по разработке больших данных

Хранилище данных в режиме реального времени | Вам нужен мощный OLAP-движок

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

Обратите внимание на мой официальный аккаунт и ответьте на [JAVAPDF] в фоновом режиме, чтобы получить 200 страниц тестовых вопросов!Большие данные, на которые обращают внимание 50 000 человек, — это дорога к Богу, почему бы вам не прийти и не узнать об этом?50 000 человек обращают внимание на то, как большие данные становятся богом, разве вы не хотите узнать об этом?50 000 человек обращают внимание на то, как стать богом больших данных, вы уверены, что действительно не хотите прийти и узнать об этом?

приветствую ваше внимание«Дорога к большим данным становится Богом»

大数据技术与架构