重いJava不要のRustによるApache Iceberg
ビッグデータを扱う場合、Apache Icebergに触れたことがある方は多いでしょう。本質的には、IcebergはParquetやORCファイルの上にLakehouseアーキテクチャを構築するための標準です。長年にわたり、JavaはIcebergの主要なホームでした。SparkやTrinoとの公式ライブラリや統合はほとんどJVM向けに書かれていました。
しかし、データ処理ツールスタックは今、Rustへと移行しつつあります。Apache DataFusion、Polarsなどのプロジェクトでは、重いJavaランタイムを起動したりJNIバインディングを扱ったりせずにIcebergテーブルにアクセスする必要があります。Apache Foundation内に公式リポジトリ apache/iceberg-rust が作成されたのはこのためです。
Rustへの移植を検討する理由
ネイティブ実装はパフォーマンスと低いメモリオーバーヘッドを提供します。ストリーム処理用のマイクロサービス、ユーティリティ、またはPostgreSQL用のカスタムForeign Data Wrapperを作成する場合、JVMを一緒に連れて行くのは痛苦です。JVMは起動時に数百メガバイトのメモリを必要とし、ガベージコレクションのために定期的に停止します。
Rustライブラリは軽量バイナリファイルから直接Icebergのメタデータとデータを読み取ることができます。このプロジェクトはApache Foundation内で開発されているため、プライベートフォークではなく、公式インフラストラクチャコンポーネントです。
リポジトリの構造
開発者はすべてを巨大なモノリスにまとめることはありませんでした。プロジェクトは一連の独立したモジュールに分割されており、サービスに必要な依存関係だけを 가져갑。
ライブラリのコアはモジュール iceberg に存在します。Iceberg v1およびv2仕様に従って、メタデータのパース、マニフェスト操作、テーブルスキーマ操作を処理します。
メタデータカタログの操作用に個別のクレートが作成されています:
- REST API操作用の
iceberg-catalog-rest - AWS Glue Data Catalog統合用の
iceberg-catalog-glue - Hive Metastoreへの接続用の
iceberg-catalog-hms - PostgreSQLまたはSQLiteへのメタデータ保存用の
iceberg-catalog-sql - Amazon S3 Tables操作用の
iceberg-catalog-s3tables
モジュール iceberg-storage-opendal はS3、GCS、ローカルディスクなどの物理ストレージを処理します。Apache OpenDALライブラリを使用するため、すべての一般的なオブジェクトストアへの即座のアクセスが可能になります。
クエリ実行エンジンが必要な場合、モジュール iceberg-datafusion が便利です。このモジュールはIcebergをApache DataFusion SQLエンジンにバインドし、Rustから直接テーブルに対してSQLクエリを実行できます。
すでに動作している場所
開発は積極的に行われていますが、本番環境でライブラリを使用している本格的な製品がすでにあります:
- Databendはクラウドデータウェアハウスで使用しています
- RisingWaveはリアルタイムデータベースからIcebergを操作するためにこのライブラリを活用しています
- SupabaseはPostgresの拡張機能とストリーミングETLサービスにRust Icebergコンポーネントを使用しています
- MoonlinkはPostgresからIceberg形式へのCDCデータ複製を小数秒で解決するタスクにこのライブラリを使用しています
- Apache DataFusion CometはSparkパフォーマンスを高速化するために使用しています
サポートとバージョニング
プロジェクトチームはMSRV(最小サポートRustバージョン)ポリシーを採用しています。コードは安定したRustリリースに対してビルドおよびテストされています。最小サポートコンパイラバージョンは、最新の言語リリースからおよそ3ヶ月のバッファで固定されています。
開発は完全にオープンです。すべての議論は[email protected]メーリングリストとApache Iceberg Slackコミュニティのチャンネル #rust で行われています。
試してみる価値はあるか
データウェアハウス周围的サービスを構築している場合、Rustでコネクタを作成している場合、または独自のデータ処理ツールを開発している場合、 iceberg-rust は最も論理的な選択のように見えます。
ライブラリはまだIceberg仕様全体をカバーする点で改良中ですが、基本的な読み取り、書き込み、主要なカタログのサポートは安定して動作しています。DataFusionベースのプロジェクトにとっては、すでに使用可能なビルディングブロックです。
関連プロジェクト