McDonnell Douglas AH-64 Apache
- 1 year ago
- 0
- 0
Apache Flink — фреймворк с открытым исходным кодом для реализации обработки потоков , разработанный фондом Apache Software Foundation .
В основу фреймворка положен движок для обработки процессов, написанный на языках Java и Scala . Flink поддерживает программирование потоков данных как в параллельном режиме, так и в конвейерном режиме (pipeline) . В конвейерном режиме (pipeline) Flink позволяет реализовать последовательность заданий (batch) и поток заданий (stream) . Flink поддерживает также итерационные алгоритмы естественным образом .
Flink обладает высокой пропускной способностью и низкими задержками , потоки могут активизироваться от событий и сохранять статус. Задачи в системе Flink устойчивы к отказам и используют строго одну семантику . Программы для фреймворка можно писать на языках Java , Scala , Python и SQL , задания автоматически компилируются и оптимизируются , работая как в кластерах, так и в облачном сервере .
Flink не обладает собственной системой хранения данных, но использует источники данных и коннекторы типа Amazon Kinesis , Apache Kafka , , HDFS , Apache Cassandra и ElasticSearch .
Разработка Apache Flink проводилась в рамках лицензии Apache 2.0 сообществом Apache Flink в составе Apache Software Foundation . Проект вели 25 основных разработчиков и более 340 программистов-вкладчиков.
Первоначальные разработчики Apache Flink основали фирму Data Artisans, в которую вошли 12 основных разработчиков .
Программирование потоков данных в Apache Flink опирается на обработку событий как для ограниченных во времени наборов данных, так и для непрерывных потоков без временных ограничений. На нижнем уровне программы в системе Flink разделяются на потоки (stream) и преобразования (transformation). Поток по своей концепции представляет собой очередь записей, которая может и никогда не заканчиваться. Преобразование — это операция, которая на входе получает один или несколько потоков, и потом преобразует данные также в один или несколько потоков .
В Apache Flink используется два основных API: DataStream API для ограниченных или неограниченных потоков, и DataSet API для ограниченных наборов данных. Flink также поддерживает Table API для таблиц, используя язык типа SQL как для потоков так и для заданий. На высшем уровне Flink поддерживает язык SQL, который семантически близок к Table API и осуществляет запросы через SQL.
Во время выполнения программы для Flink ставятся в соответствие с потоками данных (streaming) . Каждый поток берёт входные данные от одного или нескольких источников (например, ввод данных, очередь или файл), и завершается, посылая данные в один или несколько выходных потоков (очередь сообщений, файлы, база данных). В потоке проводится произвольное количество преобразования. Потоки образуют граф без циклов, позволяя приложению ветвится на многие потоки и объединять потоки вместе.
Flink предлагает соединять входные и выходные потоки с хранилищами , Apache Kafka , Amazon Kinesis, HDFS , Apache Cassandra и др .
В распределённых системах программы Flink могут работать по кластерам или быть независимыми, используя также YARN, Mesos, или Docker для конфигурирования и распределения ресурсов .
Apache Flink включает облегчённый механизм отказоустойчивости с использованием распределённых контрольных точек . Контрольная точка представляет собой автоматическое асинхронное сохранение (snapshot) статуса приложения в исходном потоке. В случае отказа программа в среде Flink с опцией контрольных точек производит восстановление процесса с момента последнего сохранения, при этом подразумевается что Flink оперирует с только одной семантикой статуса приложения. Механизм контрольных точек использует отметки (hook) в коде приложения, чтобы внешние системы могли подключить сохранение статуса в контрольных точкахl (подобно трансакциям при работе с базами данных).
Flink включает также механизм «точек сохранения» (savepoints), которые активируются вручную . Пользователь может создать точку сохранения, остановить программу в среде Flink, а потом заново запустить её с той же позиции. Точки сохранения позволяют также проводить изменения в программе без потери статуса приложения. Начиная с версии of Flink 1.2, точки сохранения позволяют заново запустить приложение в ситуации параллельной обработки данных
DataStream API в системе Flink проводит преобразования — такие как фильтрацию, агрегацию, выборку — на ограниченных или неограниченных потоках данных. DataStream API включает в себя более 20 различных типов преобразования, которые могут быть использованы на языках Java и Scala .
Вот пример простой обработки потока для счётчика количества слов в непрерывном входном потоке по пятисекундным временным интервалам:
import org.apache.flink.streaming.api.scala._ import org.apache.flink.streaming.api.windowing.time.Time case class WordCount(word: String, count: Int) object WindowWordCount { def main(args: Array[String]) { val env = StreamExecutionEnvironment.getExecutionEnvironment val text = env.socketTextStream("localhost", 9999) val counts = text.flatMap { _.toLowerCase.split("\\W+") filter { _.nonEmpty } } .map { WordCount(_, 1) } .keyBy("word") .timeWindow(Time.seconds(5)) .sum("count") counts.print env.execute("Window Stream WordCount") } }
В данном потоке входной текст делится на слова с помощью операции flatMap, каждое слово преобразуется в структуру WordCount со счётчиком, равным единице, поток объектов WordCount группируется по словам и временным интервалам в 5 секунд, а потом суммируются по счётчикам, так что в итоговом потоке остаются счётчики слов для пятисекундных интервалов.
Apache Beam предлагает унифицированную модель программирования, позволяющую разработчику создавать задания в конвейерном и в потоковом режиме, а потом исполнять созданные задания в среде Flink . Исполнитель Flink на базе Apache Beam содержит богатый набор возможностей .
В разработке исполнителя Flink работает фирма Data Artisans .
DataSet API в системе Flink поддерживает операции преобразования данных(такие как фильтрация, группирование, соответствие (mapping), объединение) с наборами данных, ограниченными во времени. DataSet API предлагает около 20 типов преобразований . Это API поддерживается для языков Java и Scala, экспериментально также имеется API для языка Python. Концепция DataSet API сходна с концепцией DataStream API.
Table API — это язык выражений на языке типа SQL для обработки реляционных потоков и заданий, Table API входит как составная часть в DataSet и DataStream API для языков Java и Scala. Table API и соответствующий интерфейс SQL работают с абстрактным представлением реляционных таблиц. Абстрактные таблицы могут быть созданы из внешних данных, или из имеющихся потоков данных и наборов данных. Table API поддерживает реляционные операции — выборку, агрегацию, соединение.
При этом таблицы можно опрашивать и с помощью стандартного языка SQL. Table API и SQL предлагают одинаковые функции и могут смешиваться в одной и той же программе. Таблицы могут преобразовываться обратно в наборы данных или потоки данных, логические операции оптимизируются с помощью и преобразуются в программы интерфейсов DataSet или DataStream .