Apache Flink

Материал из Википедии — свободной энциклопедии
Перейти к навигации Перейти к поиску
Apache Flink
Логотип программы Apache Flink
Разработчик Apache Software Foundation
Написана на Java[3][1] и Scala[1]
Первый выпуск 6 января 2015[1]
Аппаратная платформа Java Virtual Machine
Последняя версия
Репозиторий github.com/apache/flink
Лицензия Apache License 2.0
Сайт flink.apache.org
Логотип Викисклада Медиафайлы на Викискладе

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 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 предлагает унифицированную модель программирования, позволяющую разработчику создавать задания в конвейерном и в потоковом режиме, а потом исполнять созданные задания в среде Flink[25]. Исполнитель Flink на базе Apache Beam содержит богатый набор возможностей[26].

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

DataSet API в системе Flink поддерживает операции преобразования данных(такие как фильтрация, группирование, соответствие (mapping), объединение) с наборами данных, ограниченными во времени. DataSet API предлагает около 20 типов преобразований[28]. Это 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 предлагают одинаковые функции и могут смешиваться в одной и той же программе. Таблицы могут преобразовываться обратно в наборы данных или потоки данных, логические операции оптимизируются с помощью Apache Calcite и преобразуются в программы интерфейсов DataSet или DataStream[29].

Примечания

[править | править код]
  1. 1 2 3 https://projects.apache.org/json/projects/flink.json
  2. Release 1.20.0 — 2024.
  3. The flink Open Source Project on Open Hub: Languages Page — 2006.
  4. Apache Flink: Scalable Batch and Stream Data Processing. apache.org. Дата обращения: 7 февраля 2020. Архивировано 26 декабря 2018 года.
  5. apache/flink. GitHub. Дата обращения: 7 февраля 2020. Архивировано 28 января 2019 года.
  6. 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
  7. Ian Pointer. Apache Flink: New Hadoop contender squares off against Spark. InfoWorld (7 мая 2015). Дата обращения: 7 февраля 2020. Архивировано 23 октября 2018 года.
  8. On Apache Flink. Interview with Volker Markl. odbms.org. Дата обращения: 7 февраля 2020. Архивировано 23 октября 2018 года.
  9. 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
  10. "Benchmarking Streaming Computation Engines at Yahoo!". Yahoo Engineering. Архивировано 1 мая 2017. Дата обращения: 23 февраля 2017. {{cite news}}: Указан более чем один параметр |accessdate= and |access-date= (справка)
  11. 1 2 Carbone, Paris; Fóra, Gyula; Ewen, Stephan; Haridi, Seif; Tzoumas, Kostas (2015-06-29). "Lightweight Asynchronous Snapshots for Distributed Dataflows". arXiv:1506.08603 [cs.DC].
  12. Apache Flink 1.2.0 Documentation: Flink DataStream API Programming Guide (англ.). ci.apache.org. Дата обращения: 23 февраля 2017. Архивировано 21 января 2019 года.
  13. Apache Flink 1.2.0 Documentation: Python Programming Guide (англ.). ci.apache.org. Дата обращения: 23 февраля 2017. Архивировано 21 февраля 2017 года.
  14. Apache Flink 1.2.0 Documentation: Table and SQL (англ.). ci.apache.org. Дата обращения: 23 февраля 2017. Архивировано 18 мая 2019 года.
  15. 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
  16. 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
  17. 1 2 Apache Flink 1.2.0 Documentation: Streaming Connectors (англ.). ci.apache.org. Дата обращения: 23 февраля 2017. Архивировано 21 февраля 2017 года.
  18. ASF Git Repos - flink.git/blob - LICENSE. apache.org. Дата обращения: 12 апреля 2015. Архивировано из оригинала 23 октября 2017 года.
  19. Team – data Artisans (англ.). data-artisans.com. Дата обращения: 23 февраля 2017. Архивировано из оригинала 23 февраля 2017 года.
  20. Apache Flink: Community & Project Info (англ.). flink.apache.org. Дата обращения: 23 февраля 2017. Архивировано 21 февраля 2017 года.
  21. 1 2 Apache Flink 1.2.0 Documentation: Dataflow Programming Model (англ.). ci.apache.org. Дата обращения: 23 февраля 2017. Архивировано 21 февраля 2017 года.
  22. Apache Flink 1.2.0 Documentation: Distributed Runtime Environment (англ.). ci.apache.org. Дата обращения: 24 февраля 2017. Архивировано 21 февраля 2017 года.
  23. Apache Flink 1.2.0 Documentation: Distributed Runtime Environment - Savepoints (англ.). ci.apache.org. Дата обращения: 24 февраля 2017. Архивировано 21 февраля 2017 года.
  24. Apache Flink 1.2.0 Documentation: Flink DataStream API Programming Guide (англ.). ci.apache.org. Дата обращения: 24 февраля 2017. Архивировано 21 января 2019 года.
  25. Apache Beam (англ.). beam.apache.org. Дата обращения: 24 февраля 2017. Архивировано 25 февраля 2017 года.
  26. Apache Beam Capability Matrix (англ.). beam.apache.org. Дата обращения: 24 февраля 2017. Архивировано 25 февраля 2017 года.
  27. Why Apache Beam? A Google Perspective | Google Cloud Big Data and Machine Learning Blog | Google Cloud Platform (англ.). Google Cloud Platform. Дата обращения: 24 февраля 2017. Архивировано 25 февраля 2017 года.
  28. Apache Flink 1.2.0 Documentation: Flink DataSet API Programming Guide (англ.). ci.apache.org. Дата обращения: 24 февраля 2017. Архивировано 21 января 2019 года.
  29. Stream Processing for Everyone with SQL and Apache Flink (англ.). flink.apache.org. Дата обращения: 8 января 2020. Архивировано 3 июля 2019 года.