Impala と Iceberg の統合における性能最適化と実証

はじめに

Impala は Apache Foundation に所屬するオープンソースの列指向クエリエンジンであり、大規模なデータセットに対して高速な分析処理を可能にします。Iceberg は、データのバージョン管理や変更履歴の保持を可能にするオープンソースの表形式であり、データの削除や更新操作を効率的に処理するための機能を提供します。本記事では、Impala と Iceberg の統合における性能最適化の実現方法とその成果を解説します。

技術の定義と基本概念

Impala のアーキテクチャ

Impala は、多ノードクラスタをサポートしており、協調器(Coordinator)と実行器(Executor)の2つの主要なコンポーネントで構成されています。協調器はクエリの解析、実行計畫の生成、データの配布を擔當し、実行器はデータの読み込み、JOIN、集約などの操作を実行します。クエリ実行計畫はツリー構造で表現され、スキャンノード、JOINノード、交換ノードなどの要素を含みます。

Iceberg の表形式特性

Iceberg は、データの削除操作を効率化するための複數の戦略を提供します。Copy and Delete は特定のデータを再構築して削除し、Merge and Read は削除情報を読み込む際にデータと削除情報をマージします。位置削除(Position Delete)は、削除ファイルにデータファイルのパスと行位置情報を含め、読み込み時にデータと削除情報を統合する必要があります。

重要な特性と機能

データ読み込みメカニズム

Impala は Iceberg API を介してデータファイルと削除ファイルのリストを取得します。削除ファイルが存在する場合、左反結合(Left Anti Join)を用いてデータと削除情報を統合し、仮想列(File Path、Position)をデータスキャンノードに追加します。このプロセスは、ネットワーク転送コストを削減するための直接配布モード(Direct Distribution Mode)を活用します。

パフォーマンス最適化

直接配布モードでは、Iceberg スケジューラのデータファイル配布情報に基づき、削除ファイルの File Path に応じて実行器ノードを直接割り當て、データを目標ノードに送信します。これにより、全域ブロードキャストやパーティションJOINの高コストを迴避し、ネットワーク転送量を削減します。

実際の応用ケースと結果

テスト環境と結果

40ノードのクラスタでS3にデータを保存し、85億件のデータをテスト対象としました。削除データは10%(約8.5億件)と設定しました。SELECT COUNT(*) クエリを実行した結果、ネットワーク転送コストが7秒(左側データ)+4秒(右側データ)で総実行時間が21秒でしたが、直接配布モードを導入したことでネットワーク転送量を8.25億件に削減し、総実行時間を12秒(性能向上42%)に短縮しました。

大規模データのテスト

1兆件のデータテーブルでSELECT ... GROUP BYクエリを実行し、70億件の削除データを処理した場合、無削除データ時の2.5分に対して7分15秒の実行時間となり、性能が3倍低下しました。これは、削除データの処理がネットワークと計算リソースを過剰に消費していることを示しています。

技術の優位性と課題

パフォーマンスの改善

直接配布モードにより、ネットワーク転送量を削減し、クエリ実行時間を短縮することができました。また、データ構造の最適化(例:vector of vectorsの使用)により、メモリ再配置の頻度を減らし、処理速度を向上させました。

今後の改善方向

Roaring BitMapを用いてsorted int64構造を置き換えることで、メモリ使用量を削減し、JOINやBuild操作の速度を向上させることが検討されています。さらに、並列処理戦略の改善により、大規模データの処理効率をさらに高めることが期待されます。

結論

Impala と Iceberg の統合により、直接配布モードなどの最適化手法を活用することで、ネットワーク転送コストを削減し、クエリ実行性能を大幅に向上させることができます。大規模データ処理においては、削除操作の最適化が不可欠であり、今後の改善によりさらなる性能向上が期待されます。