Apache Parquetの開発者のひとりでApache ArrowプロジェクトのPMCメンバでもあるJulien Le Dem氏が,カラム指向データ処理の今後について,Data Eng Conf NYでプレゼンテーションを行なった。
Apache Arrowは,Apache Drillの持つインメモリ・カラム型データ構造の流れを汲む,カラム型(columnar)インメモリデータベースのオープンソース標準だ。インメモリのデータ保持とさまざまなデータエンジン間のデータ交換を行なうことで,シリアライズを回避する手段としてのデファクトを目指している。プロジェクトはCalcite, Drill, Pandas, HBase, Spark, Stormなど,Apacheを中心とする13のオープンソースプロジェクトの主要開発者によって支えられている。
InfoQはLe Dem氏にインタビューして,ArrowとParquetの違い,カラム型のオンデスク・ストレージ形式,2つのプロジェクトが実行エンジン間のより効率的な計算を実現している方法などを聞いた。
InfoQ: Apache Arrowは,Parquetと同じく,Apache Sparkなどの実行エンジンをコモディティ化すると思われますか?エンジン間のパフォーマンスの差を狭めることになるのでしょうか?
Le Dem: MonetDBが先鞭をつけたベクタ化エンジンは,効率的なクエリ処理としては最先端の技術です。オープンソースのクエリエンジンの多くが,このモデルに移行しつつあります。ですから,究極的に効率のより相互運用性を実現するために,インメモリのカラム型表現を標準化するのは,理に適ったことだと考えています。Parquetがカラム指向ストレージで行なったことを,Arrowはカラム型インメモリ処理とデータ交換で提供するのです。
このような標準化は,ストレージ層やクエリエンジン,DSL,UDFの間の統合を大幅に単純化すると同時に,シリアライズを不要にすることで,極めて効率のよい通信層を提供します。標準化によって共通的なボトルネックが除去されるので,すべてのシステム間の相互運用が簡単で安価,かつ短期間で実現できるようになります。一方で,それぞれのデータベースエンジンには,例えばベクタの圧縮処理やクエリオプティマイザの改善など,パフォーマンスを改善する独自技術を提供することによる革新の余地も十分に残されています。
InfoQ: Apache Parquetは述部のプッシュダウンをサポートして,述部にマッチしたデータを含まないページのディスクからの読み込みを回避しています。Apache Arrowのデータ構造にも同様の機能があるのでしょうか?
Le Dem: データをディスクから読み込む場合と,メモリから読み込む場合のトレードオフは違います。現時点では,エンジンの述語プッシュダウンの実装に任されています。最終的には,エンジン間で再利用できる高速なベクトル化処理をApache Arrowで提供すると思いますが,まだ着手はしていません。
InfoQ: Arrowの目標として,インメモリデータへの定時間アクセスの提供と,SIMD命令の実行によるベクタ化操作の実現がありますが,Parquetのようなデータ圧縮もインメモリで提供するのでしょうか?
Le Dem: Arrowは辞書のエンコーディングをサポートすることで,大幅な圧縮と集約や結合といった操作の高速実行を実現しています。snappyやgzipといった汎用目的のアルゴリズムを用いた,共通的なバッファ圧縮機能の提供についても議論しています。
最初のリリースでは,ビットパッキングのような他の圧縮技術はサポートされていませんが,標準のベクタに変わる独自のベクタを,実行エンジンが定義できるようにしています。これを使えば,圧縮されたベクタを直接操作するような,より高度な技術を可能になります。その実例として挙げられるのが,ウィスコンシン大学のBitWeavingプロジェクトです。将来的には,標準的なベクトルも拡張されると思います。
Arrowの最初のリリースではPandasライブラリとArrow,Parquet間の,C++によるネイティブなインテグレーションが提供されるので,ArrowのレコードバッチをPandasのデータフレームとして操作したり,Apache DrillなどのSQL-on-Hadoopエンジンに展開することが可能です。
InfoQ: Apache Arrowは,データをシリアライズせずにプロセス間で転送可能な相互運用性をサポートしています。このArrowのIPC層の機能について説明して頂けますか?
Le Dem: まだ実験レベルですが,完全なゼロコピー層を実現しています。Arrowのレコードバッチは完了すると変更不能(immutable)になります。この状態になることで,共有メモリを使って読み取り専用モードで,同時アクセスを気にすることなく,他のプロセスとの共有が可能になるのです。ベクトルの表現はメモリアドレスには依存しない(絶対アドレスのポインタは使用されていない)ので,プロセス毎にバッファのアドレスが異なる共有メモリで使用しても問題ありません。
InfoQ: Parquetと同じく,Apache Arrowもネストされたデータ型をサポートしていますが,現在サポートされているデータ型と,ロードマップ上にあるものを教えてください。
Le Dem: 一般的なデータ型については,かなり網羅的にサポートしています。最近になって追加されたものとしては,SQLのTimestampとInterval型があります。
この記事を評価
- 編集者評
- 編集長アクション