LoginSignup
136
112

More than 5 years have passed since last update.

Apache Flink とは?

Last updated at Posted at 2016-07-10

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-stack-frontpage.png

特長

他のプラットフォームと比べて、一番の違いは、耐障害性に優れる という部分でしょう。
Flinkでは、各処理をステートフルで扱っており、障害が発生した際には、その情報から処理を自動で復旧させる機能を有しています。

その他、Flinkのドキュメントより、特長を説明します。
https://flink.apache.org/features.html

Streaming

  1. 高パフォーマンス&低レイテンシ

    streaming_performance.png

  2. イベントタイムのサポート

    • リアルタイムで処理を行う分、遅延などの影響は必ず発生します。Flinkでは、受信したイベントに対する時間を、以下の3つの概念で扱うことが可能です。
      • Processing Time : システムの時間
      • Event Time : イベントの発生元の時間(遅延を考慮するした時間い)
      • Ingestion Time : イベントを取得した時間

    out_of_order_stream.png

  3. Exactly-once(正確に1回だけ実行する)

    • Flinkで処理されるイベントは、Exactly-once のポリシーに基づいて処理されます。
    • Flinkのコンポーネントはステートフルであり、障害発生後も、前回処理した内容を保持しており、その途中状態から、処理を再開することが可能です。

    exactly_once_state.png

  4. 柔軟なストリームウィンドウ

    • スライディングウィンドウなどの、Window API を提供します。
    • トリガーを利用して、条件をカスタマイズすることも可能です。

    windows.png

  5. Backpressure タイプのストリーム処理

    • 過負荷となり、イベントを処理しきれない場合に、イベント処理を中断し、全体がハングアップしないようにするフロー制御の機能を保持しています。

    continuous_streams.png

  6. 分散スナップショットを利用した耐障害性

    • Chandy-Lamport アルゴリズムを利用した分散スナップショットにより、高スループットを維持しつつ、耐障害性を実現しています。

    distributed_snapshots.png

Batch and Streaming in One System

  1. 同一ランタイムで、ストリーム処理もバッチ処理も可能

    • Flinkでは、同一のランタイムで、ストリーム処理も、バッチ処理も実行可能です。

    one_runtime.png

  2. メモリ管理

    • 独自のメモリ管理機構も持っており、アプリケーションがスケールしても、JVMのGC(Garbage Collection)による影響を回避できるようにしています。

    memory_heap_division.png

  3. イテレーション機構・Deltaイテレーション機構

    • 機械学習やグラフ処理など、大量のデータを扱うのに関して、Flinkはイテレーション機構をサポートします。
    • イテレーション機構は、ステップ実行した結果を次の入力値にして、繰り返し計算します。Deltaイテレーションは、ワークセットを利用して、高速に繰返し計算を行います。
    • ※あまり良く分かっていないので、以下のドキュメント参照。

    iterations.png

  4. プログラム最適化

    • バッチ処理は、自動で最適化された実行計画を選択します。

    optimizer_choice.png

APIs and Libraries

  1. ストリームデータ・アプリケーション

    • 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")
    
  2. バッチ・アプリケーション

    • 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")
    }
    
  3. ライブラリ・エコシステム

    • Flink Stackは、機械学習、グラフ分析、(RDBのような)関係データなどに対する高レベルのAPIを提供しています。

Ecosystem

  1. 幅広い統合
    • Flinkは、他のデータ処理を行うOSSと統合可能です。
    • Flinkは、YARN上で動作し、HDFS、Kafka、および、Hadoop関連のプロダクトと、一緒に動作させることが可能です。
136
112
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
136
112