Stream Load トランザクションインターフェースを使用したデータのロード
バージョン 2.4 以降、StarRocks は Stream Load トランザクションインターフェースを提供し、Apache Flink® や Apache Kafka® などの外部システムからデータをロードするために実行されるトランザクションに対して、2 フェーズコミット (2PC) を実装します。Stream Load トランザクションインターフェースは、高度に並行したストリームロードのパフォーマンスを向上させます。
バージョン 4.0 以降、Stream Load トランザクションインターフェースは複数テーブルトランザクションをサポートします。つまり、同一データベース内の複数のテーブルにデータをロードすることが可能です。
このトピックでは、Stream Load トランザクションインターフェースと、このインターフェースを使用して StarRocks にデータをロードする方法について説明します。
説明
Stream Load トランザクションインターフェースは、HTTP プロトコル互換のツールや言語を使用して API 操作を呼び出すことをサポートします。このトピックでは、curl を例にとってこのインターフェース の使用方法を説明します。このインターフェースは、トランザクション管理、データ書き込み、トランザクションの事前コミット、トランザクションの重複排除、トランザクションのタイムアウト管理など、さまざまな機能を提供します。
Stream Load は CSV および JSON ファイル形式をサポートします。個々のサイズが 10 GB を超えない少数のファイルからデータをロードしたい場合、この方法が推奨されます。Stream Load は Parquet ファイル形式をサポートしていません。Parquet ファイルからデータをロードする必要がある場合は、INSERT+files() を使用してください。
トランザクション管理
Stream Load トラン ザクションインターフェースは、トランザクションを管理するために使用される以下の API 操作を提供します。
-
/api/transaction/begin: 新しいトランザクションを開始します。 -
/api/transaction/prepare: 現在のトランザクションを事前コミットし、データ変更を一時的に永続化します。トランザクションを事前コミットした後、コミットまたはロールバックを実行できます。トランザクションが事前コミットされた後にクラスターがクラッシュした場合でも、クラスターが復旧した後、トランザクションをコミットし続けることができます。 -
/api/transaction/commit: 現在のトランザクションをコミットしてデータの変更を永続化します。 -
/api/transaction/rollback: 現在のトランザクションをロールバックしてデータの変更を中止します。
NOTE
トランザクションが事前コミットされた後は、そのトランザクションを使用してデータを書き続けないでください。トランザクションを使用してデータを書き続けると、書き込みリクエストがエラーを返します。
以下の図は、トランザクションの状態と操作の関係を示しています:
stateDiagram-v2
direction LR
[*] --> PREPARE : begin
PREPARE --> PREPARED : prepare
PREPARE --> ABORTED : rollback
PREPARED --> COMMITTED : commit
PREPARED --> ABORTED : rollback
データ書き込み
Stream Load トランザクションインターフェースは、データを書き込むための /api/transaction/load 操作を提供します。この操作は、1 つのトランザクション内で複数回呼び出すことができます。
バージョン 4.0 以降、異なるテーブルに対して /api/transaction/load 操作を呼び出すことで、同一データベース内の複数テーブルにデータをロードできます。
トランザクションの重複排除
Stream Load トランザクションインターフェースは、StarRocks のラベリングメカニズムを引き継いでいま す。各トランザクションに一意のラベルをバインドすることで、トランザクションに対して最大 1 回の保証を実現できます。
トランザクションのタイムアウト管理
トランザクションを開始する際、HTTP リクエストヘッダーの timeout フィールドを使用して、PREPARE 状態から PREPARED 状態へのトランザクションのタイムアウト期間(秒単位)を指定できます。この期間内にトランザクションが準備完了状態に達しない場合、自動的に中止されます。このフィールドが指定されていない場合、デフォルト値は FE 設定の stream_load_default_timeout_secondによって決定されます(デフォルト:600 秒)。
トランザクションを開始する際、HTTP リクエストヘッダーの idle_transaction_timeout フィールドを使用して、トランザクションがアイドル状態のまま保持できるタイムアウト期間(秒単位)を指定できます。この期間内にデータが書き込まれない場合、トランザクションは自動的にロールバックされます。
トランザクションを準備する際、HTTP リクエストヘッダーの prepared_timeout フィールドを使用して、トランザクションが PREPARED 状態から COMMITTED 状態に移行するまでのタイムア ウト期間(秒単位)を指定できます。この期間内にトランザクションがコミットされない場合、自動的に中止されます。このフィールドが指定されていない場合、デフォルト値は FE 設定の prepared_transaction_default_timeout_second によって決定されます(デフォルト:86400秒)。prepared_timeout は v3.5.4 以降でサポートされています。
利点
Stream Load トランザクションインターフェースは、次の利点をもたらします。
-
厳密な一度だけのセマンティクス
トランザクションは、事前コミットとコミットの 2 つのフェーズに分割され、システム間でデータをロードしやすくします。たとえば、このインターフェースは Flink からのデータロードに対して厳密な一度だけのセマンティクスを保証できます。
-
ロードパフォーマンスの向上
プログラムを使用してロードジョブを実行する場合、Stream Load トランザクションインターフェースを使用すると、複数のミニバッチのデータをオンデマンドでマージし、1 つのトランザクション内で
/api/transaction/commit操作を呼び出して一度に送信できます。その結果、ロードするデータバージョンが少なくなり、ロードパフォーマンスが向上します。