Apache Flink
Apache Flink — фреймворк с открытым исходным кодом для реализации обработки потоков, разработанный фондом Apache Software Foundation. В основу фреймворка положен движок для обработки процессов, написанный на языках Java и Scala[4][5]. Flink поддерживает программирование потоков данных как в параллельном режиме, так и в конвейерном режиме (pipeline)[6]. В конвейерном режиме (pipeline) Flink позволяет реализовать последовательность заданий (batch) и поток заданий (stream)[7][8]. Flink поддерживает также итерационные алгоритмы естественным образом[9]. Flink обладает высокой пропускной способностью и низкими задержками[10], потоки могут активизироваться от событий и сохранять статус. Задачи в системе Flink устойчивы к отказам и используют строго одну семантику[11]. Программы для фреймворка можно писать на языках Java, Scala[12], Python[13] и SQL[14], задания автоматически компилируются и оптимизируются[15], работая как в кластерах, так и в облачном сервере[16]. Flink не обладает собственной системой хранения данных, но использует источники данных и коннекторы типа Amazon Kinesis, Apache Kafka, Alluxio, HDFS, Apache Cassandra и ElasticSearch[17]. РазработкаРазработка Apache Flink проводилась в рамках лицензии Apache 2.0[18] сообществом Apache Flink в составе Apache Software Foundation. Проект вели 25 основных разработчиков и более 340 программистов-вкладчиков. Первоначальные разработчики Apache Flink основали фирму Data Artisans, в которую вошли 12 основных разработчиков[19][20]. ОбзорПрограммирование потоков данных в Apache Flink опирается на обработку событий как для ограниченных во времени наборов данных, так и для непрерывных потоков без временных ограничений. На нижнем уровне программы в системе Flink разделяются на потоки (stream) и преобразования (transformation). Поток по своей концепции представляет собой очередь записей, которая может и никогда не заканчиваться. Преобразование — это операция, которая на входе получает один или несколько потоков, и потом преобразует данные также в один или несколько потоков[21]. В Apache Flink используется два основных API: DataStream API для ограниченных или неограниченных потоков, и DataSet API для ограниченных наборов данных. Flink также поддерживает Table API для таблиц, используя язык типа SQL как для потоков так и для заданий. На высшем уровне Flink поддерживает язык SQL, который семантически близок к Table API и осуществляет запросы через SQL. Программная модель и распределённое исполнение задачВо время выполнения программы для Flink ставятся в соответствие с потоками данных (streaming)[21]. Каждый поток берёт входные данные от одного или нескольких источников (например, ввод данных, очередь или файл), и завершается, посылая данные в один или несколько выходных потоков (очередь сообщений, файлы, база данных). В потоке проводится произвольное количество преобразования. Потоки образуют граф без циклов, позволяя приложению ветвится на многие потоки и объединять потоки вместе. Flink предлагает соединять входные и выходные потоки с хранилищами Alluxio, Apache Kafka, Amazon Kinesis, HDFS, Apache Cassandra и др[17]. В распределённых системах программы Flink могут работать по кластерам или быть независимыми, используя также YARN, Mesos, или Docker для конфигурирования и распределения ресурсов[22]. Статусы: контрольные точки, точки сохранения, отказоустойчивостьApache Flink включает облегчённый механизм отказоустойчивости с использованием распределённых контрольных точек[11]. Контрольная точка представляет собой автоматическое асинхронное сохранение (snapshot) статуса приложения в исходном потоке. В случае отказа программа в среде Flink с опцией контрольных точек производит восстановление процесса с момента последнего сохранения, при этом подразумевается что Flink оперирует с только одной семантикой статуса приложения. Механизм контрольных точек использует отметки (hook) в коде приложения, чтобы внешние системы могли подключить сохранение статуса в контрольных точкахl (подобно трансакциям при работе с базами данных). Flink включает также механизм «точек сохранения» (savepoints), которые активируются вручную[23]. Пользователь может создать точку сохранения, остановить программу в среде Flink, а потом заново запустить её с той же позиции. Точки сохранения позволяют также проводить изменения в программе без потери статуса приложения. Начиная с версии of Flink 1.2, точки сохранения позволяют заново запустить приложение в ситуации параллельной обработки данных DataStream APIDataStream API в системе Flink проводит преобразования — такие как фильтрацию, агрегацию, выборку — на ограниченных или неограниченных потоках данных. DataStream API включает в себя более 20 различных типов преобразования, которые могут быть использованы на языках Java и Scala[24]. Вот пример простой обработки потока для счётчика количества слов в непрерывном входном потоке по пятисекундным временным интервалам: 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 — исполнитель FlinkApache Beam предлагает унифицированную модель программирования, позволяющую разработчику создавать задания в конвейерном и в потоковом режиме, а потом исполнять созданные задания в среде Flink[25]. Исполнитель Flink на базе Apache Beam содержит богатый набор возможностей[26]. В разработке исполнителя Flink работает фирма Data Artisans[27]. DataSet APIDataSet API в системе Flink поддерживает операции преобразования данных(такие как фильтрация, группирование, соответствие (mapping), объединение) с наборами данных, ограниченными во времени. DataSet API предлагает около 20 типов преобразований[28]. Это API поддерживается для языков Java и Scala, экспериментально также имеется API для языка Python. Концепция DataSet API сходна с концепцией DataStream API. Table API и SQLTable API — это язык выражений на языке типа SQL для обработки реляционных потоков и заданий, Table API входит как составная часть в DataSet и DataStream API для языков Java и Scala. Table API и соответствующий интерфейс SQL работают с абстрактным представлением реляционных таблиц. Абстрактные таблицы могут быть созданы из внешних данных, или из имеющихся потоков данных и наборов данных. Table API поддерживает реляционные операции — выборку, агрегацию, соединение. При этом таблицы можно опрашивать и с помощью стандартного языка SQL. Table API и SQL предлагают одинаковые функции и могут смешиваться в одной и той же программе. Таблицы могут преобразовываться обратно в наборы данных или потоки данных, логические операции оптимизируются с помощью Apache Calcite и преобразуются в программы интерфейсов DataSet или DataStream[29]. Примечания
Ссылки
|
Portal di Ensiklopedia Dunia