Apache Flink

Материал из Википедии — свободной энциклопедии
Перейти к навигации Перейти к поиску
Apache Flink
Разработчик Apache Software Foundation
Написана на Java[2][1] и Scala[1]
Первый выпуск 6 января 2015[1]
Аппаратная платформа Java Virtual Machine
Последняя версия
Лицензия Apache License 2.0
Сайт flink.apache.org
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] and 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[править | править код]

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[править | править код]

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

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

DataSet API[править | править код]

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

Примечания[править | править код]

  1. 1 2 3 https://projects.apache.org/json/projects/flink.json
  2. The flink Open Source Project on Open Hub: Languages Page — 2006.
  3. Release 1.11.0 — 2020.
  4. Apache Flink: Scalable Batch and Stream Data Processing. apache.org.
  5. apache/flink. GitHub.
  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).
  8. On Apache Flink. Interview with Volker Markl.. odbms.org.
  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!.
  11. 1 2 Carbone, Paris; Fóra, Gyula; Ewen, Stephan; Haridi, Seif & Tzoumas, Kostas (2015-06-29), Lightweight Asynchronous Snapshots for Distributed Dataflows, arΧiv:1506.08603 [cs.DC] 
  12. Apache Flink 1.2.0 Documentation: Flink DataStream API Programming Guide (англ.). ci.apache.org. Дата обращения 23 февраля 2017.
  13. Apache Flink 1.2.0 Documentation: Python Programming Guide (англ.). ci.apache.org. Дата обращения 23 февраля 2017.
  14. Apache Flink 1.2.0 Documentation: Table and SQL (англ.). ci.apache.org. Дата обращения 23 февраля 2017.
  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.
  18. ASF Git Repos - flink.git/blob - LICENSE (недоступная ссылка). apache.org. Дата обращения 7 февраля 2020. Архивировано 23 октября 2017 года.
  19. Team – data Artisans (англ.) (недоступная ссылка). data-artisans.com. Дата обращения 7 февраля 2020. Архивировано 23 февраля 2017 года.
  20. Apache Flink: Community & Project Info (англ.). flink.apache.org. Дата обращения 23 февраля 2017.
  21. 1 2 Apache Flink 1.2.0 Documentation: Dataflow Programming Model (англ.). ci.apache.org. Дата обращения 23 февраля 2017.
  22. Apache Flink 1.2.0 Documentation: Distributed Runtime Environment (англ.). ci.apache.org. Дата обращения 24 февраля 2017.
  23. Apache Flink 1.2.0 Documentation: Distributed Runtime Environment - Savepoints (англ.). ci.apache.org. Дата обращения 24 февраля 2017.
  24. Apache Flink 1.2.0 Documentation: Flink DataStream API Programming Guide (англ.). ci.apache.org. Дата обращения 24 февраля 2017.
  25. Apache Beam (англ.). beam.apache.org. Дата обращения 24 февраля 2017.
  26. Apache Beam Capability Matrix (англ.). beam.apache.org. Дата обращения 24 февраля 2017.
  27. Why Apache Beam? A Google Perspective | Google Cloud Big Data and Machine Learning Blog | Google Cloud Platform (англ.). Google Cloud Platform. Дата обращения 24 февраля 2017.
  28. Apache Flink 1.2.0 Documentation: Flink DataSet API Programming Guide (англ.). ci.apache.org. Дата обращения 24 февраля 2017.
  29. Stream Processing for Everyone with SQL and Apache Flink (англ.). flink.apache.org. Дата обращения 8 января 2020.

Литература[править | править код]

Ссылки[править | править код]