GCP: Dataflow

# Features

https://cloud.google.com/dataflow#all-features

- 垂直自動スケール: ワーカーキャパシティの調整
- Right fitting: ステージに合わせたリソース最適化
- スマート診断: パフォーマンスのモニタリング
- ストリーミングエンジン: ストレージとコンピューティングの分離
- 水平自動スケール
- Dataflow shuffle: グルーピングと結合のためのシャッフリング
- Dataflow SQL
- Flexible Resource Scheduling
- Dataflow templates
- Notebooks integration: Vertex AI Notebooksとの統合
- Real time change data capture: データの変更をリアルタイムに捕捉
- Inline monitoring
- CMEK
- VPC
- Private IPs

# Programming model for Apache Beam
https://cloud.google.com/dataflow/docs/concepts/beam-programming-model

- Pipelines: データ処理の単位
- PCollection: Pipelineのデータとして扱えるオブジェクト
- Transforms: PCollectionを入力とするデータ変換の処理
- ParDo: ユーザー定義の関数を呼び出す並列処理オペレーション
- Pipeline I/O: 入力のソースと出力のシンクからなるTransform
- Aggregation: 複数の入力から値を計算する処理、代表的なものはグルーピング
- Runner: Pipelineを実行するソフトウェア
- Source: 外部ストレージを読み込むTransform
- Sink: 外部ストレージに書き込むTransform
- Windowing: データをグルーピングするためのまとまり
- Watermarks: ウィンドウのすべてのデータが到着すると期待される時間
- Trigger: 集約されたデータを出力するタイミング

# Streaming pipelines

https://cloud.google.com/dataflow/docs/concepts/streaming-pipelines

- 連続的にデータが来る状況
- window, watermark, triggerを使って集約する
- watermark: watermarkより遅く到着したデータはlate dataと呼ばれる
- trigger: 集約データを創出するタイミング、デフォルトではwatermarkを過ぎたら

tumbling window: 固定ウィンドウ、固定時間のウィンドウ
![tumbling](https://cloud.google.com/static/dataflow/images/fixed-time-windows.png)

hopping window: スライディングウィンドウ、ウィンドウの時間と間隔をしていできる
![hopping](https://cloud.google.com/static/dataflow/images/sliding-time-windows.png)

session window: 特定の動作が続くことで生まれるウィンドウ、ギャップ時間をこえると新しいウィンドウが生まれる
![session](https://cloud.google.com/static/dataflow/images/session-windows.png)

# Security and permissions

https://cloud.google.com/dataflow/docs/concepts/security-and-permissions

- permission: roleに基づく
- `--update` option: セキュリティパッチを適用する
- Dataflow service account: Dataflowの管理用
- Worker service account: ワーカー用
- Dataflowはリージョナル、ワーカーのゾーンを指定できる
- HTTPSで通信する
- VM上のデータは暗号化される

# Regional endpoints

https://cloud.google.com/dataflow/docs/concepts/regional-endpoints

- メタデータを保存、管理する
- データのローカリティが増すため、ネットワークレイテンシが改善する

# Streaming with Pub/Sub

- low latency watermarks: 専用のPub/Sub APIを使うことで、より低レイテンシでwatermarkを取得できる
- high watermark accuracy: event timeをより正確に測定できる
- exactly onceを容易に実現できる

# Pipeline fundamentals

https://beam.apache.org/documentation/pipelines/design-your-pipeline/

![basic](https://beam.apache.org/images/design-your-pipeline-linear.svg)

![multi_transf](https://beam.apache.org/images/design-your-pipeline-multiple-pcollections.svg)

![multi_out](https://beam.apache.org/images/design-your-pipeline-additional-outputs.svg)

![merge](https://beam.apache.org/images/design-your-pipeline-flatten.svg)

![multi_source](https://beam.apache.org/images/design-your-pipeline-join.svg)

# Dataflow Shuffle

https://cloud.google.com/dataflow/docs/guides/deploying-a-pipeline#dataflow-shuffle

`GroupByKey`や`CoGroupByKey`や`Combine`のもとになる操作
keyでパーティション、グルーピングされる
バッチパイプラインでのみ利用可能
速い
ワーカーのリソース処理が少ない
データを保持しないのでオートスケールしやすい
フォールトトレラント

# Update a pipeline

https://cloud.google.com/dataflow/docs/guides/updating-a-pipeline

- `--update` option
- `--jobName` of the job to be updated
- in-flightデータも処理が続くが、transformを追加した場合は保証されない

# Stop a pipeline

https://cloud.google.com/dataflow/docs/guides/stopping-a-pipeline

- cancel: パイプラインを止める
- drain: ストリーミングのみ、バッファされたデータの処理を完了させる
- force cancel: スタックした処理を止めるとき
# Customer Managed Encryption Key

https://cloud.google.com/dataflow/docs/guides/customer-managed-encryption-keys

- ユーザー管理の暗号化鍵を利用できる
- ユーザー指定のデータソースから読み込んだデータは暗号化される
    - persistent disk
    - data shuffle state
    - GCS
    - streaming engine state
    - なども
- グルーピングなどのキーベースのTransformを使う際には、データキーが暗号化されない
    - データキーがセンシティブな場合、ハッシュ化などを検討すべき
- ジョブメタデータは暗号化されない

# Price

https://cloud.google.com/dataflow/pricing

- CPUとメモリ
- シャッフルで処理されるデータ (バッチパイプライン)
- ストリーミングエンジンで処理されるデータ

# Quotas & limits

https://cloud.google.com/dataflow/quotas

- max 3,000,000 requests per minute
- max 1,000 compute engine
- max 25 concurrent Dataflow jobs per project
- max 125 concurrent Dataflow jobs per organization