Что такое Apache Flink
Apache Flink является распределенной платформой обработки данных с открытым исходным кодом, разработанной Apache Software Foundation для использования данных в больших приложениях, прежде всего, для анализа данных, хранящихся в кластерах Hadoop. Поддерживает комбинацию обработки в оперативной памяти и на основе диска.
История развития
Flink, что на немецком языке означает быстрый или проворный, является открытым исходным кодом платформы для распределенного потока и пакетной обработки данных. Первоначально названный Стратосфера (2010) перед добавлением в программу инкубатор от Apache (2014), Flink был разработан в Техническом университете Берлина, чтобы быть заменой для Hadoop MapReduce (в рамках программного обеспечения для распределенных вычислений больших наборов данных), используя подход ориентированного графа, устраняя необходимость в отображении и сокращения.
Архитектура
Архитектура Apache Flink изображена на рисунке 1.
Рисунок 1 – Архитектура Apache Flink
Программы Flink после запуска сопоставляются потокам данных. Каждый поток данных Flink начинается с одного или нескольких источников (входные данные, которые берутся, например, из очереди сообщений или файловой системы) и заканчивается одним или несколькими приемниками (выходные данные, которые отправляются, например, в очередь сообщений, файловую систему или базу данных). В потоке может быть выполнено произвольное число преобразований. Эти потоки могут быть организованы как ориентированный, ациклический граф потока данных, позволяющий приложению распределять и объединять потоки данных.
Flink предлагает готовые коннекторы с Apache Kafka, Amazon Kinesis, HDFS, Apache Cassandra и др.
Потоковая и пакетная обработка данных
Flink может работать как в пакетном режиме, так и в потоковом режиме.
- Потоковый режим предназначен для обработки неограниченных потоков данных. Неограниченные потоки имеют начало, но их конец не определен. Они не прерываются и предоставляют данные по мере их создания. Неограниченные потоки должны непрерывно обрабатываться, т. е. события должны быть оперативно обработаны после их поступления. Невозможно дождаться появления всех входных данных, поскольку вход неограничен и не будет завершен в какой-то момент времени. Обработка неограниченных данных часто требует, чтобы события принимались в определенном порядке, например, в порядке, в котором происходили события, чтобы иметь возможность обосновать полноту результата.
- В пакетном режиме обрабатываются потоки данных, которые имеют определенные начальные и конечные значения. Такие потоки могут обрабатываться путем проглатывания всех данных перед выполнением любых вычислений. Для их обработки упорядоченный прием не требуется, потому что ограниченный набор данных всегда можно отсортировать.
Точное управление временем и состоянием позволяет использовать среду Flink для запуска любого приложения в потоковом режиме. Ограниченные потоки данных обрабатываются внутренними алгоритмами и структурами данных, которые предназначены именно для наборов данных фиксированного размера, что дает отличную производительность.
Интеграция
Flink интегрируется со всеми основными системами управления кластерами, такими как Hadoop YARN, Apache Mesos и Kubernetes, а также может быть настроен для работы в качестве автономного кластера.
Это достигается с помощью режимов развертывания, которые позволяют Flink взаимодействовать с каждым менеджером ресурсов по своему идиоматическому пути.
При развертывании приложения Flink автоматически идентифицирует требуемые ресурсы на основе настроенного параллелизма приложения и запрашивает их из системы управления кластером. В случае сбоя Flink заменяет контейнер, запрашивая новые ресурсы. Отправка и управление приложением происходит через REST. Это облегчает интеграцию Flink в различных средах.
Запуск крупномасштабных приложений
Flink предназначен для запуска приложений с непрерывным потоком данных в любом масштабе. Приложения могут распараллеливаться в тысячи задач, которые распределяются и выполняются в кластере одновременно. Таким образом, приложение может использовать практически неограниченное количество процессоров, основной памяти, дискового и сетевого ввода-вывода. Кроме того, Flink легко поддерживает очень большое состояние приложения. Его асинхронный и инкрементный контрольный алгоритм обеспечивает минимальное влияние на задержки обработки, гарантируя точную согласованность состояния за один раз.
По словам пользователей приложения, запущенные с помощью Flink, которые работают в их производственных средах, могут:
- обрабатывать несколько триллионов событий в день;
- поддерживать несколько терабайт состояния;
- работать на тысячах ядер.
Эффективное использование памяти
Приложения Flink оптимизированы для локального доступа. Состояние задачи всегда сохраняется в памяти или, если размер состояния превышает доступную память, в структурах данных на диске, доступных для доступа. Следовательно, задачи выполняют все вычисления, обращаясь к локальному состоянию, которое чаще всего хранится в памяти, что дает очень низкие задержки обработки. Flink гарантирует согласованность состояния в случае сбоев периодически и асинхронно проверяет локальное состояние на необходимость перемещения в долговечное хранилище.
API
Apache Flink включает в себя два основных API: DataStream API для ограниченных или неограниченных потоков данных и DataSet API для ограниченных наборов данных. Flink также предлагает Table API, который является SQL-подобным языком выражения для реляционного потока и пакетной обработки, который может быть легко встроен в DataStream API и DataSet API. Язык высокого уровня, поддерживаемый Flink, - это SQL, который семантически похож на Table API и представляет собой программы в виде SQL-запросов.
DataStream API позволяет преобразовывать объекты (например, фильтры, агрегации, оконные функции) в ограниченные или неограниченные потоки данных. API DataStream включает в себя более 20 различных типов преобразований и доступен в Java и Scala.
DataSet API позволяет преобразовывать объекты (например, фильтры, сопоставления, объединения, группировки) в ограниченные наборы данных. DataSet API включает в себя более 20 различных типов преобразований и доступен в Java, Scala и экспериментальном Python API. DataSet API концептуально похож на DataStream API.
Table API - это SQL-подобный язык выражений, предназначенный для реляционных потоков и пакетной обработки, который может быть встроен в Java и Scala DataSet API и DataStream API. Table API и интерфейс SQL работают с реляционной абстракцией Table. Таблицы могут быть созданы из внешних источников данных или из существующих DataStreams и DataSets. Table API поддерживает реляционные операторы, такие как выбор, агрегация и объединение в таблицах.
Данные из таблиц также могут запрашиваться с помощью обычного SQL. Table API и SQL предлагают эквивалентную функциональность и могут использоваться одновременно в одной и той же программе. Когда таблица преобразуется обратно в DataSet или DataStream, логический план, который был определен реляционными операторами и SQL-запросами, оптимизируется с использованием Apache Calcite и преобразуется в программу DataSet или DataStream.
Другие особенности
Также Apache Flink обладает следующими свойствами:
- Высокая производительность и низкое время ожидания
- Поддержка временных событий и неисправных событий
- Особо гибкие потоковые окна
- Непрерывная потоковая модель передачи с обратным воздействием
- Отказоустойчивость
- Одна среда выполнения для потоковой передачи и пакетной обработки
- Управление памятью
-
Число итераций и Delta-Итерации
- Специализированная поддержка для итерационных вычислений (машинное обучение, анализ графика)
- Delta-Итерации используют вычислительные зависимости для более быстрой сходимости
- Программа оптимизатор
- приложения потоковой передачи данных (DataStream API)
- приложений пакетной обработки данных (DataSet API)
- Библиотека экосистемы для машинного обучения, аналитических графиков и реляционной обработки данных
Конкуренты
У Apache Flink имеются конкурентные продукты. Далее представлен список этих продуктов.
- Hadoop MapReduce
- Apache Spark
- Apache Storm
- Apache Tez
- Apache Apex
Анализ Apache Flink
Одна из более гибких опций - это анализ больших данных (см. рисунок 2), так как Apache Flink предлагает распределять на потоковую обработку и на пакетную обработку данных.
Рисунок 2 – Анализ больших данных
Достоинства
Можно выделить ряд достоинств Apache Flink:
- Способен выполняться в обоих режимах
- обработка и аналитика данных в режиме реального времени
- Высокая производительность и низкое время ожидания
- Отказоустойчивость
- Одна среда для потоковой передачи и пакетной обработки
- Имеет систему управления собственной памяти
- Итерационные вычисления
- Автоматически собирает и оптимизирует программы
-
Совместимость с:
- Работает на YARN
- Работает с HDFS
- потоками данных от Kafka
- Можно выполнить программный код Hadoop
- Apache HBase
- Google Cloud Platform
- Tachyon
- пакет совместимости с Storm
- Предложения API-интерфейсов в Java и Scala, которые являются "очень простыми в использовании"
- Активно поддерживается (последний стабильный выпуск был 29 ноября 2018 г.)
Недостатки
Однако Apache Flink обладает рядом недостатков, таких как:
- Не обеспечивает собственную систему хранения данных
- Данные должны храниться в распределенных системах хранения данных, как HDFS или HBase
- Входные данные берутся из очередей сообщений, как Kafka
- Библиотеки все еще в бета-режиме
Установка
Установка Java
Apache Flink требует установки Java.
- Установка Python Software
$ sudo apt-get install python-software-properties
- Добавить в репозиторий
$ sudo add-apt-repository ppa:webupd8team/java
- Обновление списка
$ sudo apt-get update
- Установка Java
$ sudo apt-get install oracle-java7-installer
- Проверка установки. Чтобы проверить завершена ли успешно установка Java и какая версия установлена, используется следующая команда.
$ java -version
Установка Apache Flink
Установка непосредственно Apache Flink происходит так:
- Скачивание Apache Flink
Вы можете скачать Apache Flink с официального сайта.
- Распаковка файла установки
Переместить загруженный установочный файл в домашний каталог и запустить следующую команду для извлечения Flink:
$ tar xzf flink-1.1.3-bin-hadoop1-scala_2.10.tgz
- Переименование каталога установки
$ mv flink-1.1.3/ flink
Чтобы запустить Apache Flink надо перейти в каталог Apache Flink
$ cd flink
- Начало работы Apache Flink
Для запуска Apache Flink в локальном режиме используйте следующую команду
/flink$ bin/start-local.sh
- Проверка состояния
Проверьте состояния запущенных служб
/flink$ jps
Должен быть следующий вывод:
6740 Jps 6725 JobManager
Чтобы запустить Apache Flink используйте localhost:8081