Apache Arrowの開発に参加している須藤です。先月、Apache Arrowの公式ブログにHow the Apache Arrow Format Accelerates Query Result TransferというApache Arrowフォーマットを使うとなぜクエリー結果の転送が高速になるのかを説明した記事が投稿されました。すごくよくまとまっている内容で、今後、何度も参照したくなりそうでした。ということで、Apache Arrowの公式ブログに翻訳記事を追加しておきました。昨今の機械翻訳は精度がかなり上がっているので人手の翻訳がなくても読みたい人は読む気はしますが、検索したときに見つかりやすくなるかもなぁと思ってやっておきました。
詳細はこの翻訳記事を読んでもらうとして、ここでは簡単に概要を紹介しておきます。
概要
OLTP(OnLine Transaction Processing)では少数のレコードを変更するだけなのでクエリー結果が大きくなることはほぼありませんが、OLAP(OnLine Analytical Processing)では大量のレコードを扱うのでクエリー結果が大きくなることがよくあります。ここではこのような大きなクエリー結果を扱うことを前提にします。
Apache Arrowフォーマットが大きなクエリー結果の転送を高速にするのは次の5つの特徴が関係しています。
- 列指向
- 自己記述的で型安全
- ゼロコピー可能
- ストリーム可能
- 汎用的
列指向
Apache Arrowフォーマットは列指向(カラムナー)です。
OLAPはデータ分析処理ですが、データ分析処理用のツールはだいたい列指向でデータを持っています。その方がデータ分析処理が速いからです。転送用のフォーマットが列指向だと、転送用に行と列を転置する必要がなくなります。行と列を転置するのは重い処理なので、これをやらなくて済むと高速になります。
(列指向とかは元の記事に図入りで説明があります。)
自己記述的で型安全
Apache Arrowフォーマットは自己記述的で型安全です。
自己記述的というのはデータ内にスキーマなどのメタデータも含まれているということです。メタデータが含まれていない場合は、データからスキーマを推測するか正しく処理するために別途メタデータを取得しなければいけません。そのような処理(特に推測する処理)が必要になると遅くなります。
型安全というのは数値のデータが入っているべきところに文字列のデータが混ざったりしないということです。たとえば、CSVは型安全ではありません。数値の列にしれっと文字列が混ざっていたりします。型安全でない場合は処理する前に値をチェックしないといけません。これは遅い処理です。
遅い処理をしなくて済むので高速になります。
ゼロコピー可能
Apache Arrowフォーマットはゼロコピーで使えます。
ゼロコピー可能というのは中間コピーを作成せずにデータを転送できるということです。たとえば、ネットワークから読み込んだデータをそのまま処理できるならゼロコピーですし、処理の前になにか変換しなければいけないならゼロコピーではありません。
なにもしないのが最速なので、ゼロコピーだと高速になります。
ストリーム可能
Apache Arrowフォーマットはストリーム処理できます。
ストリーム処理ができるというのはデータ全体がなくても一部だけあれば処理を始められるということです。ストリーム処理するとデータのダウンロードとデータ処理を並列にできるので高速になります。
(ストリーム処理できるようにするためのレコードバッチという概念があって、それは元記事に図入りで説明があります。)
汎用的
Apache Arrowフォーマットは多くのプログラミング言語で使えます。
昨今のデータ処理パイプラインの各コンポーネントはいろいろな言語で実装されていますが、全コンポーネントで高速化できないとパイプライン全体は高速になりません。高速化できなかったコンポーネントがボトルネックになるからです。たとえば、9割のコンポーネントをApache Arrowフォーマットで高速にできても、残りの1割のコンポーネントでApache Arrowフォーマットを使えずに低速なままなら、パイプライン全体は高速になりません。
Apache Arrowフォーマットは多くの言語でサポートされているので、すべてのコンポーネントでApache Arrowフォーマットを使って高速にできます。
まとめ
Apache Arrowの公式ブログにあるApache Arrowフォーマットはどのようにクエリー結果の転送を高速にしているのかを翻訳したので紹介しました。↑の概要で詳細が気になった人は元記事も読んでみてね。
そんな翻訳をした私にApache Arrow関連のサポートを頼みたいという場合はクリアコードのApache Arrowサービスをどうぞ。