#Apache Flink とは?
「Apache Flink」は、分散ストリーム処理プラットフォームのひとつのOSSです。
同類のモノとしては、「Apache Storm」や「Apache Spark Streaming」などがあります(同じApacheで、さすがに同類のモノを出し過ぎだろう、と私も思っています)。
他のプラットフォームとして異なる特長は、以下になります。
- 高パフォーマンス&低レイテンシ(真のストリーム処理が可能)
- 耐障害性に優れる(自動でイベント処理継続)
- ストリーム処理、バッチ処理の両方をサポートし、高レベルのAPIが提供されるAll-in-One構成
##Flink Stack
Flinkの全体像です。
ストリーム処理だけでなく、バッチ処理も可能であり、CEP(複合イベント処理)やML(機械学習)、SQLライクなAPIも提供しています。
この辺りは、Sparkと似ていますね。ただ、Sparkはバッチ処理からストリーム処理に派生した感じですが、Flinkは逆で、ストリーム処理からバッチ処理に派生しています。
#特長
他のプラットフォームと比べて、一番の違いは、耐障害性に優れる という部分でしょう。
Flinkでは、各処理をステートフルで扱っており、障害が発生した際には、その情報から処理を自動で復旧させる機能を有しています。
その他、Flinkのドキュメントより、特長を説明します。
https://flink.apache.org/features.html
##Streaming
- 高パフォーマンス&低レイテンシ
-
Flinkは、耐障害性を持ちつつも、高パフォーマンス、低レイテンシを実現しています。
-
ベンチマークについては、Yahoo!が発表していますが、Stormと同等以上の性能を示しています。
- イベントタイムのサポート
-
リアルタイムで処理を行う分、遅延などの影響は必ず発生します。Flinkでは、受信したイベントに対する時間を、以下の3つの概念で扱うことが可能です。
- Processing Time : システムの時間
- Event Time : イベントの発生元の時間(遅延を考慮するした時間い)
- Ingestion Time : イベントを取得した時間
- Exactly-once(正確に1回だけ実行する)
-
Flinkで処理されるイベントは、Exactly-once のポリシーに基づいて処理されます。
-
Flinkのコンポーネントはステートフルであり、障害発生後も、前回処理した内容を保持しており、その途中状態から、処理を再開することが可能です。
- 柔軟なストリームウィンドウ
- Backpressure タイプのストリーム処理
- 分散スナップショットを利用した耐障害性
##Batch and Streaming in One System
- 同一ランタイムで、ストリーム処理もバッチ処理も可能
- メモリ管理
- イテレーション機構・Deltaイテレーション機構
-
機械学習やグラフ処理など、大量のデータを扱うのに関して、Flinkはイテレーション機構をサポートします。
-
イテレーション機構は、ステップ実行した結果を次の入力値にして、繰り返し計算します。Deltaイテレーションは、ワークセットを利用して、高速に繰返し計算を行います。
-
※あまり良く分かっていないので、以下のドキュメント参照。
- プログラム最適化
##APIs and Libraries
- ストリームデータ・アプリケーション
-
DataStream API は、関数型の処理をサポートしており、柔軟なウィンドウ処理などが可能です。
case class Word(word: String, freq: Long) val texts: DataStream[String] = ... val counts = text .flatMap { line => line.split("\\W+") } .map { token => Word(token, 1) } .keyBy("word") .timeWindow(Time.seconds(5), Time.seconds(1)) .sum("freq")
- バッチ・アプリケーション
-
DataSet API は、タイプセーフで、メンテナンスしやすいコードを実現します。
-
幅の広い、key/valueのデータタイプをサポートします。
case class Page(pageId: Long, rank: Double) case class Adjacency(id: Long, neighbors: Array[Long]) val result = initialRanks.iterate(30) { pages => pages.join(adjacency).where("pageId").equalTo("pageId") { (page, adj, out : Collector[Page]) => { out.collect(Page(page.id, 0.15 / numPages)) for (n <- adj.neighbors) { out.collect(Page(n, 0.85*page.rank/adj.neighbors.length)) } } } .groupBy("pageId").sum("rank") }
- ライブラリ・エコシステム
- Flink Stackは、機械学習、グラフ分析、(RDBのような)関係データなどに対する高レベルのAPIを提供しています。
##Ecosystem
- 幅広い統合
- Flinkは、他のデータ処理を行うOSSと統合可能です。
- Flinkは、YARN上で動作し、HDFS、Kafka、および、Hadoop関連のプロダクトと、一緒に動作させることが可能です。