2
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

FlinkやFlink SQLについてまとめてみよう

2
Posted at

Flinkとは

Apache Flink(以下、Flink)は、継続的に発生するデータをリアルタイムに処理するためのストリーム処理エンジンです。

Kafkaなどから流れてくるデータに対して、データをすべて蓄積してから処理するのではなく、流れている途中で加工・結合・集計などを行うために利用します。


Flinkのイメージ

データ発生
    ↓
  Kafka
    ↓
  Flink
    ├─ 絞り込み(Filter)
    ├─ データ変換
    ├─ データの結合(JOIN)
    ├─ 一定時間ごとの集計(Window)
    └─ リアルタイム計算
    ↓
Kafka / Snowflake / Iceberg / データベースなど

Flinkでできること

1. リアルタイム処理

データが到着するたびに、継続的に処理します。

例えば、次のような処理ができます。

  • IoTセンサーデータのリアルタイム処理
  • イベントデータの加工・変換
  • ログデータのリアルタイム集計
  • 不要なデータの絞り込み
  • 異常値や条件に一致するイベントの検出
センサーデータ
      ↓
    Kafka
      ↓
    Flink
      ↓
加工・集計されたデータ

2. データの結合(JOIN)

複数のデータを組み合わせて処理できます。

例えば、次のようなデータを結合できます。

  • IoTセンサーデータ
  • MESの製造情報
  • 製造ロット情報
  • 設備マスターデータ
  • 商品・顧客などのマスターデータ

これにより、単独では意味を持ちにくいイベントデータに、分析に必要な情報を付加できます。

IoTセンサーデータ ──┐
                     ├─→ Flinkで結合 → ロット情報付きセンサーデータ
MESの製造情報 ──────┘

INNER JOIN

INNER JOINは、2つのデータのキーが一致したもの同士を結合する一般的なJOINです。

例えば、注文データと商品データを 商品ID で結合します。

注文データ                     商品データ

商品A  10:30                   商品A  100円
商品B  10:35                   商品B  200円
      │                            │
      └──────── INNER JOIN ────────┘
                    ↓
             商品A  10:30  100円
             商品B  10:35  200円

ストリーム処理ではデータが継続的に到着するため、JOIN相手となるデータを待つために、必要なデータをStateとして保持する場合があります。

Temporal JOIN

Temporal JOINは、単純にキーが一致するデータを結合するのではなく、イベントが発生した時点で有効だったデータを選択して結合するためのJOINです。

例えば、商品の価格が途中で変更された場合を考えます。

価格マスター

09:00  商品A = 100円
10:00  商品A = 120円
11:30  商品A =  90円

10:30に商品Aの注文が発生した場合、

注文イベント
商品A / 10:30
      ↓
Temporal JOIN
      ↓
10:30時点で有効だった価格
商品A = 120円

となります。

現在の価格である90円ではなく、注文が発生した10:30時点で有効だった120円を参照することがポイントです。

INNER JOINとTemporal JOINの違い

項目 INNER JOIN Temporal JOIN
基本的な考え方 キーが一致するデータを結合 キーと時点を考慮して結合
時間の考慮 基本的なJOIN条件には含まれない 重要
マスターデータの変更 変更の影響を受ける可能性がある イベント発生時点の値を参照
主な用途 データ同士の一般的な結合 履歴を持つマスターとの結合
例 注文 × 商品 注文 × 注文時点の商品価格

イメージとしては、次のように整理できます。

INNER JOIN
「このキーと一致するデータはどれ?」

Temporal JOIN
「このキーと一致し、さらに "その時点" で有効だったデータはどれ?」

例えば、

  • 注文 × 注文時点の商品価格
  • 取引 × 取引時点の顧客属性
  • IoTデータ × データ発生時点の設備情報
    など、「その時点ではどうだったか」まで考慮してデータを結合したい場合にTemporal JOINが重要になります。

3. 一定時間ごとの処理(Window)

流れ続けるデータを、一定の時間範囲に区切って処理します。

例えば、次のような処理ができます。

  • 1分ごとのイベント件数
  • 5分ごとの平均温度
  • 10分ごとの異常発生件数
  • 1時間ごとの売上金額
10:00        10:05        10:10        10:15
  ├──────────┤├──────────┤├──────────┤
    Window 1     Window 2     Window 3
    平均温度      平均温度      平均温度

「Window」は、流れ続けるデータの一部分を時間の窓で切り取って見るというイメージです。

Tumbling Window

重ならない一定の時間単位に区切ります。

時間 →
┌────────┐┌────────┐┌────────┐
│ 0~5分  ││ 5~10分 ││10~15分 │
└────────┘└────────┘└────────┘

Hopping Window

一定の間隔で、時間範囲をずらしながら集計します。処理対象となる時間範囲は互いに重なることがあります。

時間 →
┌────────────┐
    ┌────────────┐
        ┌────────────┐

4. 状態を持った処理(State)

Flinkは、処理途中の情報を**State(状態)**として保持できます。

イベントA到着
      ↓
Stateに情報を保持
      ↓
イベントB到着
      ↓
AとBを組み合わせて処理

Stateは、例えば次のような処理で利用されます。

  • JOIN相手のデータを待つ
  • 集計途中の値を保持する
  • 過去に処理したデータを記録する
  • 重複データを判定する
  • 連続するイベントの関係を確認する

5. イベント発生時刻を考慮した処理

Flinkでは、データがシステムに到着した時刻だけでなく、データが実際に発生した時刻を基準に処理できます。

ストリームデータは、ネットワーク遅延などによって到着順序が前後することがあります。

実際の発生順序:A → B → C
システム到着順:A → C → B

このような場合でも、イベントに含まれる発生時刻を利用して処理できます。

Watermark

Watermarkは、イベント時刻の処理がどこまで進んだかを判断するための基準です。

Watermark
「この時刻までのデータは、おおむね到着した」

Window処理では、このWatermarkを基準として、一定時間の集計結果をいつ確定するか判断します。


6. Flink SQLによるデータ処理

Flink SQLを利用すると、ストリーム処理をSQL形式で記述できます。

SELECT
    product_id,
    SUM(amount)
FROM orders
GROUP BY product_id;

Flink SQLでは、主に次のような処理を記述できます。

  • 絞り込み(Filter)
  • データ変換
  • データの結合(JOIN)
  • データ集計
  • 一定時間ごとの処理(Window)
  • 時点を考慮した結合(Temporal JOIN)

7. DataStream APIによるデータ処理

Flink SQL以外に、DataStream APIを使ってFlinkの処理を実装できます。

主に次のプログラミング言語が利用されます。

  • Java
  • Python(PyFlink)

DataStream APIは、Flink SQLだけでは表現しにくい独自のストリーム処理や、Stateを細かく制御したい場合に使用します。

入力データ
    ↓
Filter
    ↓
KeyBy
    ↓
Window
    ↓
Aggregate
    ↓
出力データ

Flink SQLとの関係

Flinkはデータ処理エンジンで、Flink SQLはFlinkに処理内容を指定する方法の1つです。

               Apache Flink
                    │
          ┌─────────┴─────────┐
          ↓                   ↓
      Flink SQL          DataStream API
        SQL              Java / Python
          │                   │
          └─────────┬─────────┘
                    ↓
              Flink Runtime
                    ↓
       Kafka / Iceberg / DBなど

したがって、Flink SQLとFlinkは別の製品ではありません。

Flink SQLは、Flink上で実行する処理をSQLで記述するための方法です。


KafkaとFlinkの違い

KafkaとFlinkは役割が異なります。

  • Kafka:データを継続的に流し、保持する基盤
  • Flink:流れているデータを加工・結合・集計する処理基盤
データ発生
    ↓
  Kafka
「データを流す・保持する」
    ↓
  Flink
「データを加工・結合・集計する」
    ↓
Snowflake / Iceberg / データベースなど

Kafkaだけでもデータを運ぶことはできますが、複雑なJOINや時間単位の集計などを継続的に実行する場合にFlinkを利用します。


代表的な利用例

IoTデータの処理

設備センサー
    ↓
  Kafka
    ↓
  Flink
    ├─ 不要データの除外
    ├─ 単位や形式の変換
    ├─ MES情報との結合
    ├─ ロット番号の付加
    └─ 一定時間ごとの集計
    ↓
分析基盤 / Snowflake / Iceberg

販売データの処理

注文イベント
    ↓
  Flink
    ├─ 商品マスターとの結合
    ├─ 顧客情報の付加
    ├─ 売上金額の集計
    └─ 異常取引の検出
    ↓
データベース / 分析基盤

まとめ

  • Flinkは、流れ続けるデータをリアルタイムに処理するエンジン
  • Kafkaなどから受け取ったデータを加工・結合・集計できる
  • Windowを利用して、一定時間ごとの集計ができる
  • Stateを利用して、処理途中の情報を保持できる
  • イベントの発生時刻を考慮した処理ができる
  • Flink SQLまたはDataStream APIで処理内容を記述できる
  • Kafkaはデータを流す・保持する基盤、Flinkはデータを処理する基盤

Flink = 流れ続けるデータを、リアルタイムに加工・結合・集計するためのストリーム処理エンジン

2
0
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
2
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?