Apache Flink 1.18 アップデート

Apache Flinkの新バージョン1.18が公開されました。Conflunet Blogではその具体的な改善点をエリア毎に詳しく説明しており、ConfluentだけでなくVerverica、Aiven、Alibaba CloudのFlinkコミッターも共著として参加し、結果としてFlinkの情報発信として非常に有益なものとなっています。

昨年発表されたAkkaのライセンス変更に伴い、1年前にAkkaの代替模索に入ったFlinkプロジェクト。ようやくAkkaからApache Pekkoに切り替えた節目のリリースとなりました。

併せて、ストリーム処理/バッチ処理改善等Flinkのストリーム処理基盤としての成熟度がさらに増す多くの改善も含まれています。本エントリでは、一部ではありますがそのうちの幾つかをご紹介します。

FlinkクラスタへのRESTエンドポイントを提供するFlink SQL Ga†ewayに、新たに汎用的なJDBC経由で通信できるFlink JDBC Driverが接続出来るようになりました。

これまでSQL Gatewayにはコンソールベースでのアクセスは可能でしたが、セッションを保持したアプリケーションからのアクセスは出来ませんでした。一方JDBC Driverの基本利用はFlink Jobの登録にあり、インタラクティブなクエリはサポートされていませんでした。本FLIPによりこの2者を繋げ、SQL Gateway経由でJDBC接続が可能な多くのデータベースに対してJDBC Driverから接続出来るようになりました。

FLIP-311: Support Call Stored Procedure

これまでFlinkから見たデータソースはSourceでありSinkであり、あくまでデータストアという扱いにおける接続に限られました。本FLIPによってFlinkからStored Procedureの一覧取得と実行が可能となります。

Stored Procedure実行におけるインターフェース変更に合わせ、Catalog InterfaceにもStored Procedure用のメソッドが追加されており一覧の取得も可能です。

FLIP-308: Support Time Travel

SQL:2011 StandardのTime Travel Queryがサポートされます。どちらもSQL:2011標準であるようタイムスタンプでの指定となりますが、特定時点ならびに期間指定がサポートされます。

用途としてはデータレイクに長期格納しているデータに対してFlinkからソースアタッチする際に特定の過去時点でのデータも同様の方法で取得可能となります。IcebergやDelta Lake等、Time Travel Queryをサポートしているストレージに限られた機能となり、またConnectorが新しいインターフェースに沿って実装する必要があります。

FLIP-292: Enhance COMPILED PLAN to support operator-level state TTL configuration

Table APIやSQLを利用してステートフルなストリームパイプラインを構築する際の、ステート管理に関わる改善です。JOINをしたり同じTableデータに異なる条件で集約したりする場合に、そのステートのベースとなるイベントの有効期間 (TTL: Time To Live) の制御によっては処理の対象となるイベントが変わります。

本FLIPでは、それぞれの対象ソースに対して個別のTTLを設定出来るようになります。これにより要件に即したステート管理を行うことができるようになります。より粒度の細かなスコープの指定や、特定ユースケースにおけるステートストアの大幅な削減等が可能です。

ストリーム処理においてデータの整合性をいかに評価/制御することは極めて重要ですが、FlinkではEvent TimeとWatermarkを利用する事により明示的にそれぞれのデータ処理ウィンドウを決定しています。

Watermarkはその振る舞いを制御する重要な仕組みであり、DataStream APIであればその関連性の定義を制御(Watermark Alignment)する事も出来ました。但しWatermarkの制御をする為にはローレベルなDataStream APIを利用する必要がありました。

本FLIPでは、Flink SQLによってその制御を可能とします。具体的にはTable作成時やクエリにアノテーションを指定する事で:

CREATE TABLE user_actions (
  ...
  user_action_time TIMESTAMP(3),
  WATERMARK FOR user_action_time AS user_action_time - INTERVAL '5' SECOND
) WITH (
  'scan.watermark.emit.strategy'='on-event',
  ...
);

とWatermark生成インターバルを指定したり:

select
  ...
from source_table /*+ OPTIONS('scan.watermark.emit.strategy'='on-event') */

SELECT時にWatermarkの出力タイプを指定できます。

バッチ処理速度改善

FLIP-324: Introduce Runtime Filter for Flink Batch Jobs

FLIP-315 Support Operator Fusion Codegen for Flink SQL

全バージョン(Flink 1.17)ではバッチ処理におけるスループットが大きく改善しました。その改善は本リリースでも継続して行われており、さらにそのパフォーマンスが向上しています 。今回のリリースにおける主要な改善は:

  • FLIP-324 Runtime Filterは集約処理の前段階で対象レコードを絞るアプローチで、これにより集約やJoinにかかるネットワーク通信や必要処理の大規模化を削減する事ができます。このFLIPでは、クエリのプラン中に関連処理の中からローカルでの集約可能な処理を特定し、Runtime Filterとして実行するようになりました。
  • FLIP-315 利用可能メモリの増加からCPUの処理能力にボトルネックが移る中、処理プロセスにおける無駄が全体スループットに大きな影響を与えています。幾つかの改善ポイントを評価した結果、ベクター化とコード生成方式のうちコード生成方式のOperator Fusionの実装を導入しました。

TPC-DS ベンチマーク結果
結果としてTPC-DSのベンチマーク結果がFlink 1.17と比べて13%、1.16とでは35%改善しました。

おわりに

今回のご紹介はApache Flink1.18で導入された新機能や改善のごく一部ではありますが、ストリーム処理からバッチ、クラウドネイティブ化に向けた改善等、非常に多岐に渡る改善が含まれています。ksqlDBを知る身としてはFlinkの分散データ処理基盤としての重厚さを感じることにもなりました。是非オリジナルのブログもご覧ください。

hashi
hashi
Admin - Manager, Solutions Engineering, Korea/Japan

畑Noob