Arrow Flight SQL を介して StarRocks と対話する
v3.5.1 以降、StarRocks は Apache Arrow Flight SQL プロトコルを介した接続をサポートしています。
概要
Arrow Flight SQL プロトコルを利用することで、ADBC ドライバーや Arrow Flight SQL JDBC ドライバーを通じて、一般的な DDL、DML、DQL ステートメントを実行できます。また、Python や Java のコードから Arrow Flight SQL ADBC または JDBC ドライバーを使用し、大規模データを効率的に読み取ることが可能です。
このソリューションは、StarRocks のカラム型実行エンジンからクライアントへの完全なカラム型データ転送パイプラインを確立し、従来の JDBC および ODBC インターフェースで一般的に見られる頻繁な行-カラム変換とシリアル化のオーバーヘッドを排除します。これにより、StarRocks はゼロコピー、低レイテンシー、高スループットでデータを転送できます。
利用シナリオ
Arrow Flight SQL の統合により、StarRocks は特に以下のシナリオに適しています。
- データサイエンスワークフロー:Pandas や Apache Arrow のように列指向データを必要とするツールに最適。
- デ ータレイク分析:大規模データセットに対する高スループット・低レイテンシのアクセス。
- 機械学習:高速なイテレーションと処理速度が重要なユースケース。
- リアルタイム分析プラットフォーム:遅延を最小限に抑えたデータ配信が求められる環境。
Arrow Flight SQL を利用することで、以下のメリットが得られます。
- 列指向フォーマットでのエンドツーエンド転送により、行形式との変換コストを排除。
- ゼロコピーによるデータ移動で CPU・メモリ負荷を削減。
- 低レイテンシ・超高スループットにより、分析や応答を高速化。
技術アプローチ
従来、StarRocks は内部で列指向の Block 構造を用いてクエリ結果を管理します。しかし、JDBC・ODBC・MySQL プロトコルを利用する場合、データは次の処理を経る必要がありました。
- サーバー側で行形式のバイト列にシリアライズ。
- ネットワーク越しに転送。
- クライアントでデシリアライズし、しばしば列形式に再変換。
この3ステップにより以下が発生します。
- 大きなシリアライズ/デシリアライズ負荷。
- 複雑なデータ変換処理。
- データ量に比例して増加するレイテンシ。
Arrow Flight SQL の統合は、次の方法でこれらの課題を解決します。
- StarRocks の実行エンジンからクラ イアントまで列指向形式を維持。
- Apache Arrow のインメモリ列指向表現を活用し、分析ワークロードを最適化。
- Arrow Flight プロトコルによる高速転送を実現し、中間変換なしで効率的にストリーミング。

この設計により、従来手法よりも高速かつリソース効率の高い真のゼロコピー送信を提供します。
さらに、StarRocks は Arrow Flight SQL 対応の汎用 JDBC ドライバーも用意しており、JDBC 互換性や他の Arrow Flight システムとの相互運用性を損なわずに、この高性能な転送経路を利用できます。
パフォーマンス比較
詳細なテストの結果、データ取得速度が大幅に向上しました。整数・浮動小数・文字列・ブール値・混合列といったさまざまなデータタイプで、Arrow Flight SQL は常に従来の PyMySQL および Pandas の read_sql インターフェースを上回りました。主な結果は以下の通りです。
- 1,000万行の整数データ読み取りで、実行時間が約35秒から0.4秒に短縮(約85倍の高速化)。
- 混合列テーブルでは最大160倍の性能向上。
- 単一の文字列列など単純なクエリでも12倍以上の高速化。
総じて Arrow Flight SQL は以下を達成しました。
- クエリの複雑性とデータ型に応じて、20〜160倍の転送速度。
- 冗長なシリアライズ工程を排除することで、CPU・メモリ消費を大幅に低減。
これらの性能向上により、ダッシュボードの応答性向上、データサイエンスワークフローの効率化、より大規模なデータセットのリアルタイム分析が可能となります。
使用方法
Python ADBC ドライバーを使用して Arrow Flight SQL プロトコルを介して StarRocks に接続し、対話するための手順に従ってください。完全なコード例については Appendix を参照してください。
Python 3.9 以上が前提条件です。