Русская Википедия:Apache Flink

Материал из Онлайн справочника
Перейти к навигацииПерейти к поиску

Шаблон:Карточка программы Apache Flink — фреймворк с открытым исходным кодом для реализации обработки потоков, разработанный фондом Apache Software Foundation.

В основу фреймворка положен движок для обработки процессов, написанный на языках Java и Scala[1][2]. Flink поддерживает программирование потоков данных как в параллельном режиме, так и в конвейерном режиме (pipeline)[3]. В конвейерном режиме (pipeline) Flink позволяет реализовать последовательность заданий (batch) и поток заданий (stream)[4][5]. Flink поддерживает также итерационные алгоритмы естественным образом[6].

Flink обладает высокой пропускной способностью и низкими задержками[7], потоки могут активизироваться от событий и сохранять статус. Задачи в системе Flink устойчивы к отказам и используют строго одну семантику[8]. Программы для фреймворка можно писать на языках Java, Scala[9], Python[10] и SQL[11], задания автоматически компилируются и оптимизируются[12], работая как в кластерах, так и в облачном сервере[13].

Flink не обладает собственной системой хранения данных, но использует источники данных и коннекторы типа Amazon Kinesis, Apache Kafka, Alluxio, HDFS, Apache Cassandra и ElasticSearch[14].

Разработка

Разработка Apache Flink проводилась в рамках лицензии Apache 2.0[15] сообществом Apache Flink в составе Apache Software Foundation. Проект вели 25 основных разработчиков и более 340 программистов-вкладчиков.

Первоначальные разработчики Apache Flink основали фирму Data Artisans, в которую вошли 12 основных разработчиков[16][17].

Обзор

Программирование потоков данных в Apache Flink опирается на обработку событий как для ограниченных во времени наборов данных, так и для непрерывных потоков без временных ограничений. На нижнем уровне программы в системе Flink разделяются на потоки (stream) и преобразования (transformation). Поток по своей концепции представляет собой очередь записей, которая может и никогда не заканчиваться. Преобразование — это операция, которая на входе получает один или несколько потоков, и потом преобразует данные также в один или несколько потоков[18].

В Apache Flink используется два основных API: DataStream API для ограниченных или неограниченных потоков, и DataSet API для ограниченных наборов данных. Flink также поддерживает Table API для таблиц, используя язык типа SQL как для потоков так и для заданий. На высшем уровне Flink поддерживает язык SQL, который семантически близок к Table API и осуществляет запросы через SQL.

Программная модель и распределённое исполнение задач

Во время выполнения программы для Flink ставятся в соответствие с потоками данных (streaming)[18]. Каждый поток берёт входные данные от одного или нескольких источников (например, ввод данных, очередь или файл), и завершается, посылая данные в один или несколько выходных потоков (очередь сообщений, файлы, база данных). В потоке проводится произвольное количество преобразования. Потоки образуют граф без циклов, позволяя приложению ветвится на многие потоки и объединять потоки вместе.

Flink предлагает соединять входные и выходные потоки с хранилищами Alluxio, Apache Kafka, Amazon Kinesis, HDFS, Apache Cassandra и др[14].

В распределённых системах программы Flink могут работать по кластерам или быть независимыми, используя также YARN, Mesos, или Docker для конфигурирования и распределения ресурсов[19].

Статусы: контрольные точки, точки сохранения, отказоустойчивость

Apache Flink включает облегчённый механизм отказоустойчивости с использованием распределённых контрольных точек[8]. Контрольная точка представляет собой автоматическое асинхронное сохранение (snapshot) статуса приложения в исходном потоке. В случае отказа программа в среде Flink с опцией контрольных точек производит восстановление процесса с момента последнего сохранения, при этом подразумевается что Flink оперирует с только одной семантикой статуса приложения. Механизм контрольных точек использует отметки (hook) в коде приложения, чтобы внешние системы могли подключить сохранение статуса в контрольных точкахl (подобно трансакциям при работе с базами данных).

Flink включает также механизм «точек сохранения» (savepoints), которые активируются вручную[20]. Пользователь может создать точку сохранения, остановить программу в среде Flink, а потом заново запустить её с той же позиции. Точки сохранения позволяют также проводить изменения в программе без потери статуса приложения. Начиная с версии of Flink 1.2, точки сохранения позволяют заново запустить приложение в ситуации параллельной обработки данных

DataStream API

DataStream API в системе Flink проводит преобразования — такие как фильтрацию, агрегацию, выборку — на ограниченных или неограниченных потоках данных. DataStream API включает в себя более 20 различных типов преобразования, которые могут быть использованы на языках Java и Scala[21].

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

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

Apache Beam предлагает унифицированную модель программирования, позволяющую разработчику создавать задания в конвейерном и в потоковом режиме, а потом исполнять созданные задания в среде Flink[22]. Исполнитель Flink на базе Apache Beam содержит богатый набор возможностей[23].

В разработке исполнителя Flink работает фирма Data Artisans[24].

DataSet API

DataSet API в системе Flink поддерживает операции преобразования данных(такие как фильтрация, группирование, соответствие (mapping), объединение) с наборами данных, ограниченными во времени. DataSet API предлагает около 20 типов преобразований[25]. Это API поддерживается для языков Java и Scala, экспериментально также имеется API для языка Python. Концепция DataSet API сходна с концепцией DataStream API.

Table API и SQL

Table API — это язык выражений на языке типа SQL для обработки реляционных потоков и заданий, Table API входит как составная часть в DataSet и DataStream API для языков Java и Scala. Table API и соответствующий интерфейс SQL работают с абстрактным представлением реляционных таблиц. Абстрактные таблицы могут быть созданы из внешних данных, или из имеющихся потоков данных и наборов данных. Table API поддерживает реляционные операции — выборку, агрегацию, соединение.

При этом таблицы можно опрашивать и с помощью стандартного языка SQL. Table API и SQL предлагают одинаковые функции и могут смешиваться в одной и той же программе. Таблицы могут преобразовываться обратно в наборы данных или потоки данных, логические операции оптимизируются с помощью Apache Calcite и преобразуются в программы интерфейсов DataSet или DataStream[26].

Примечания

Шаблон:Примечания

Ссылки

Шаблон:Перевести

Внешние ссылки

  1. Шаблон:Cite web
  2. Шаблон:Cite web
  3. Alexander Alexandrov, Rico Bergmann, Stephan Ewen, Johann-Christoph Freytag, Fabian Hueske, Arvid Heise, Odej Kao, Marcus Leich, Ulf Leser, Volker Markl, Felix Naumann, Mathias Peters, Astrid Rheinländer, Matthias J. Sax, Sebastian Schelter, Mareike Höger, Kostas Tzoumas, and Daniel Warneke. 2014. The Stratosphere platform for big data analytics. The VLDB Journal 23, 6 (December 2014), 939—964. DOI
  4. Шаблон:Cite web
  5. Шаблон:Cite web
  6. Stephan Ewen, Kostas Tzoumas, Moritz Kaufmann, and Volker Markl. 2012. Spinning fast iterative data flows. Proc. VLDB Endow. 5, 11 (July 2012), 1268—1279. DOI
  7. Шаблон:Cite news
  8. 8,0 8,1 Шаблон:Cite arxiv
  9. Шаблон:Cite web
  10. Шаблон:Cite web
  11. Шаблон:Cite web
  12. Fabian Hueske, Mathias Peters, Matthias J. Sax, Astrid Rheinländer, Rico Bergmann, Aljoscha Krettek, and Kostas Tzoumas. 2012. Opening the black boxes in data flow optimization. Proc. VLDB Endow. 5, 11 (July 2012), 1256—1267. DOI
  13. Daniel Warneke and Odej Kao. 2009. Nephele: efficient parallel data processing in the cloud. In Proceedings of the 2nd Workshop on Many-Task Computing on Grids and Supercomputers (MTAGS '09). ACM, New York, NY, USA, Article 8, 10 pages. DOI
  14. 14,0 14,1 Шаблон:Cite web
  15. Шаблон:Cite web
  16. Шаблон:Cite web
  17. Шаблон:Cite web
  18. 18,0 18,1 Шаблон:Cite web
  19. Шаблон:Cite web
  20. Шаблон:Cite web
  21. Шаблон:Cite web
  22. Шаблон:Cite web
  23. Шаблон:Cite web
  24. Шаблон:Cite web
  25. Шаблон:Cite web
  26. Шаблон:Cite web

Шаблон:Выбор языка Шаблон:Apache