ストリーミング


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

Flinkのデータストリーミング ランタイムは、 ほんの少しの設定で高スループットレートと低レイテンシーを実現します。以下の図はストリーミングデータのシャッフルを必要とする分散項目カウントのタスクのパフォーマンスを示します。

データストリーミングアプリケーションのパフォーマンス

Support for Event Time and Out-of-Order Events

Flink はEvent Time セマンティクスを使ったストリーム処理とウィンドウ化をサポートします。

Event time を使うと、イベントの到着が順番通りでは無い場合、およびイベントが遅れて到着する場合のストリームの計算が楽になります。

Event Time と Out-of-Order ストリーム

ステートフルの計算のための Exactly-once セマンティクス

ストリーミングアプリケーションは計算の間に独自の状態を維持することができます。

Flinkのチェックポイント機構は、障害時の状態のための exactly once セマンティクスを確実にします。

ステートフルの計算のための Exactly-once セマンティクス

非常に柔軟なストリーミング ウィンドウ

Flink はデータ駆動ウィンドウと同様に、時間、回数、あるいはセッションのウィンドウをサポートします。

ウィンドウは洗練されたストリーミング パターンをサポートするために、柔軟な駆動条件を使ってカスタマイズすることができます。

ウィンドウ

バックプレシャーを使った絶え間の無いストリーミングモデル

データストリーミングアプリケーションは絶え間の無い(長時間)演算子を使って実行されます。

Flinkのストリーミング ランタイムは自然なフロー制御を持ちます: 遅いデータのsinkは、速いソースに圧力を掛けます。

絶え間の無いストリーミングモデル

軽量分散スナップショットを使った耐障害性

Flinkの耐障害性機構は Chandy-Lamport 分散スナップショットに基づいています。

その仕組みは軽量で、システムは高スループットレートを維持し、同時に強力な一貫性保証を提供することができます。

軽量分散スナップショット

1つのシステムでのバッチとストリーミング


ストリーミングとバッチ処理のための1つのランタイム

Flinkは、データストリーミングアプリケーションとバッチ処理アプリケーションのために1つの共通のランタイムを使用します。

バッチ処理アプリケーションはストリーム処理アプリケーションの特別な場合として効果的に実行します。

バッチとストリームデータ解析のための統一されたランタイム

メモリ管理

Flink はJVM内に独自のメモリ管理を実装します。

Applications scale to data sizes beyond main memory and experience less garbage collection overhead.R

管理されたJVMヒープ

イテレーションとDeltaイテレーション

Flinkは(機械学習およびグラフ解析にあるような)繰り返しの計算のための専用のサポートを持ちます。

Deltaイテレーションは高速な収束のために計算上の依存性を利用することができます。

イテレーションとdeltaイテレーションのパフォーマンス

プログラムのオプティマイザー

Batch programs are automatically optimized to exploit situations where expensive operations (like shuffles and sorts) can be avoided, and when intermediate data should be cached.

異なる実行戦略の間で選択を行うオプティマイザ

APIs とライブラリ


ストリーミング データ アプリケーション

DataStream API は、ユーザ定義の状態と柔軟なウィンドウを使って、データストリーム上で実用的な変換をサポートします。

例では、テキストのデータストリームの単語の出現のスライドするヒストグラムを計算する方法を示します。

FlinkのデータストリームAPIの WindowWordCount

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")

バッチ処理アプリケーション

Flinkの DataSet API を使ってJavaあるいはScalaで綺麗なタイプセーフおよび維持可能なコードを書くことができます。それは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のスタックは異なる使用方法のための高レベルのAPIを持つライブラリを提供します: 機械学習、グラフ解析、および関連データ処理。

現在のところライブラリはbeta 状態で、猛烈に開発されています。

ライブラリを使ったFlinkスタック

エコシステム


Broad Integration

Flinkはオープンソースのデータ処理エコシステムの他の多くのプロジェクトと統合されます。

Flink runs on YARN, works with HDFS, streams data from Kafka, can execute Hadoop program code, and connects to various other data storage systems.

Flinkが統合されている他のプロジェクト

TOP
inserted by FC2 system