ja ja ja ja ja ja ja ja ja en ja ja ja ja ja ja ja ja ja ja ja en ja ja ja ja ja ja ja ja ja ja ja ja ja ja ja ja ja ja ja en ja ja ja ja ja ja ja ja ja ja ja ja ja ja ja ja ja ja ja ja ja pl ja ja pl ja ja en ja zh ja ja ja ja ja en ja ja ja en ja ja ja en en ja ja ja ja ja ja ja ja ja ja ja ja ja ja ja ja ja en fr ja ja ja ja pt ja ja ja ja ja ja ja ja en ja ja ja ja ja ru ja ja ja ja ja ja ja ja ja en ja ja ja ja ja ja ja en ja ja ja ja ja ja ja en ja ja ja en ja ja ja ja ja en ja ja en ja ja ja ja en ja ja ja ja en ja pl ja ja ja ja en ja ja ja ja ja ja ja ja en ja ja ja ja zh ja ja ja ja ja en ja ja ja ja ja ja ja ja en ja ja ja ja ja ja ja ja ja ja ja en ja ja en ja ja vi ja sv eu ja en en hu ja ja en en pl ja ja jbo hbs_lat en ja ja ja ja ja ja ja ja ja ja ja ja ja ja ja ja ja ja ja
ちなみに、英語ではいろいろ情報があります。有用な情報源はApache Arrowの公式ブログや公式メーリングリストやそれぞれの開発者のブログ・発表などです。開発者のブログの中ではVoltron Dataさんのブログがオススメです。直近のイベントだと6月23日に開催されるVoltron Dataさん主催のThe Data Threadがよさそうです。私も(日本語で)なにか話すかもしれません。バーチャルカンファレンスなので日本からでも参加できます。が、日本時間で深夜1:00-3:00開催なので参加しにくいとは思います。なお、Voltron DataさんはApache Arrowを軸にしたスタートアップです。フルタイムでApache Arrowの開発をしている人を何人も雇っていてApache Arrowの開発を強力に推進している企業の1つです。実は、2022年4月から私のApache Arrowの開発時間もVoltron Dataさんが資金援助してくれています。
2020年7月24日にApache Arrow 1.0.0がリリースされたのですが、約2年後である今の最新バージョンはApache Arrow 8.0.0です。すごく上がっていますね!これはApache Arrowのバージョン付け・リリースのポリシーが次のようになっているからです。
メディアタイプ:application/vnd.apache.arrow.stream
ファイルフォーマット:
メディアタイプ:application/vnd.apache.arrow.file
もろもろの手続きをしたのは私で.arrowsという拡張子を提案したのも私なので感慨深いです。詳細はApache Arrowデータのメディアタイプ(MIMEタイプ)を参照してください。
Apache Arrow Flight
Apache Arrow FlightはApache Arrowデータを効率よくやりとりするためのRPCフレームワークです。
Apache Arrow Flightの紹介:高速データトランスポートフレームワーク
db tech showcase 2021 - Apache Arrow Flight – ビッグデータ用高速データ転送フレームワーク #dbts202
1.0.0リリース当時はApache Arrow Flightに対応しているのはC++実装とJava実装だけでしたが、C#実装やC GLib実装など他の実装でも対応するようになりました。具体的にどの実装が対応したかは後述の各実装のセクションを参照してください。
Apache Arrow Flight上でSQLを使うためのApache Arrow Flight SQLが入りました。Apache Arrow Flight SQLはSQLベースのデータベースと高速にやり取りするための仕組みです。既存のSQLベースのデータベースはそれぞれ独自のプロトコルを使っていますが、データ転送の効率がよくありません。Apache Arrow Flightベースにすることで高速にデータ転送できるようにしようということです。
ただ、既存のSQLベースのデータベースはApache Arrow Flightベースではないので現時点ではApache Arrow Flight SQLで既存のSQLベースのデータベースに接続することはできません。サンプルとしてSQLite3をApache Arrow Flight SQLに対応させたものなどがいくつかあるくらいです。今後、Apache Arrow Flight SQLに対応したSQLベースのデータベースが増えてくるはずです。
参考:Introducing Apache Arrow Flight SQL: Accelerating Database Access
Apache Arrow Flight SQLはSQLベースのデータベースが対応しないと使えませんが、もう一つ、SQLベースのデータベースが対応しなくてもデータ転送を高速化するアプローチが検討されています。それがApache Arrow Database Connectivity(ADBC)です。
ADBCは各種既存の独自プロトコルやODBCでデータベースと接続しますが、接続して取得したデータを高速にApache Arrowデータに変換します。データ転送のボトルネックは通信のためのシリアライズ・デシリアライズのことが多いのでそこを高速化できない分Apache Arrow Flight SQLよりも高速化できませんが、それ以外の部分でできる最適化で高速化するアプローチです。たとえば、既存のデータベースでは行ベースで結果を返しますが、Apache Arrowデータは列ベースなのでその変換をしなければいけません。データベースから複数行をまとめて取得して一気に行ベースと列ベースを変換すれば1行ずつ変換するよりも効率がよいです。そんな最適化をもろもろして高速化します。
ADBCは現在検討中の仕組みなので興味がある人は議論に参加してください。
dev@arrow.apache.orgのスレッド:[DISC] Improving Arrow's database support
デザインドキュメント(Google Docs、コメント可):ADB: Arrow Database Connectivity
通信方法としてgRPC以外にUCX (Unified Communication X)も使えるようになりました。UCXはハードウェアリソースなども使って高速に通信するための仕組みです。たとえば、RDMA(Remote Direct Memory Access)でOSを介せずに別ホストにデータを転送して高速化します。
まだ改善の余地はありますが、一部のケースではgRPCよりもUCXを使った方が速かったというベンチマーク結果も出ています。より速いデータ転送が必要という人はUCXバックエンドを試してみてください。
参考:Arrow in HPC
Apache Arrow Dataset
Apache Arrow DatasetはApache Arrow Flightとは違って現時点ではC++実装しかありませんが、独立した「仕組み」として紹介します。C++実装のバインディングがあって、PythonやRubyやRやJavaなど他の言語からもC++実装を使うことはできます。現時点ではC++以外に独自に実装している言語はないということです。
Apache Arrow DatasetはApache Arrowフォーマット・Apache Parquetフォーマット・Apache ORCフォーマット・CSVフォーマットなど各種フォーマットを統一的なAPIで読み書きするためのモジュールです。別の言い方をすると、フォーマットの違いを気にせずにデータを読み書きできるということです。
1.0.0の頃は読み込みしかできませんでしたが、書き込みもできるようになっています。また、複数のファイルにパーティションされたデータも読み書きできます。現時点で対応しているパーティションの方法は次の通りです。
ディレクトリーパーティショニング
パス中の階層ごとにカラムを割り当ててカラムの値ごとに別ディレクトリーにしてパーティションする。
例:1段目のカラムをyear:int16、2段目のカラムをmonth:int8とし、パスが/2009/11/data.arrowだった場合、data.arrowのレコードすべてにyearカラムとmonthカラムができ、それぞれ値を2009と11にする。
Hiveパーティショニング
ディレクトリーパーティショニングと似ているがパスのフォーマットが違う。
/${カラム1}=${値1}/${カラム2}=${値2}/...というように値だけでなくカラム名もパスに入れる。
ファイル名パーティショニング
ディレクトリーパーティショニングと似ているがディレクトリーで値を区切るのではなく、ファイル名内に_で区切って値の情報を入れる。
例:1つ目のカラムをyear:int16、2つ目のカラムをmonth:int8とし、ファイル名が2009_11_data.arrowだった場合、このファイルのレコードすべてにyearカラムとmonthカラムができ、それぞれ値を2009と11にする。
関数パーティショニング
ユーザーがどうパーティションするかをプログラムできる。
非同期・並列での処理をできるようになったので性能が向上しています。
Amazon S3に加えてGoogle Cloud Storage上のデータも透過的に(ローカルのファイルと同じAPIで)扱えるようになっています。Azure Blob Storageにも対応させるプルリクエストもあります。これからも対応するオンラインストレージサービスは増えていくはずです。
少し変わったところだとSkyhookというプログラミング可能なストレージもサポートしました。プログラミング可能なストレージとは、データを処理する機能(プログラム)を追加できるストレージのことです。ストレージ上でデータを処理できるとデータ転送量を削減して効率よくデータを取得できます。たとえば、1年分のデータが入ったファイルから1ヶ月分だけのデータを読みたい場合、ストレージ上でデータを絞り込めば1ヶ月分のデータだけ転送すればよいので効率的です。
参考:Skyhook: Bringing Computation to Storage with Apache Arrow
Apache Arrowの一部ではないのですがSubstraitも紹介します。
Substraitはプログラミング言語に依存せずにクエリーを表現するための仕様です。Apache Arrowが高速にデータ転送するためのプログラミング言語に依存しないデータフォーマットを定義していることに似ています。ただ、Substraitは仕様なのでSubstraitで表現されたクエリーを実行する機能は提供しません。Substraitで表現されたクエリーは各データ処理エンジンが処理します。たとえば、Apache ArrowのC++実装にある計算(Compute)モジュールもSubstrait対応のデータ処理エンジンです。
他にもクエリーを異なるデータ処理エンジンで交換したり、クエリーを可視化するときの入力に使ったりといったユースケースを想定しています。
Apache Arrowの中だけでもC++実装の計算モジュールやRust実装のDataFusionなど複数のデータ処理エンジンがあるので、Apache Arrowでも言語を超えてそれらのデータ処理エンジンを連携させるときに使います。
C++実装は独自実装です。(他の実装のバインディングではありません。)
計算(Compute)モジュールがかなり改良されました。計算関数がたくさん増えた(本当にたくさん増えました)こともそうですが、マルチカラムでのソートやグループ化機能なども増えています。現在使える計算関数のドキュメントも用意されたのでどんな計算をできるようになっているかはそちらで確認してください。ちなみに、最近、この計算モジュールに名前をつけない?という議論をしています。
依存ライブラリーをvcpkgでインストールできるようになりました。これまでもCondaで依存ライブラリーを揃えることができましたが同じようなことをvcpkgでもできるようになりました。
リトルエンディアン・ビッグエンディアンを変換できるようになりました。これは石崎さんの仕事です。なお、石崎さんはApache ArrowのコミッターだけでなくApache Sparkのコミッターでもあります。
Apache ORCファイルへの書き出しもできるようになりました。読み込みは前からできたのでこれで読み書きできるようになりました。
対応している型が増えました。たとえば、次の型に対応しました。
256ビットのdecimal(浮動小数点と違って誤差なく小数を表現できる数値型)
OpenTelemetryを使ったトレーシングに対応しました。
C#実装は独自実装です。(他の実装のバインディングではありません。)
Apache Arrow Flightに対応しました。
EOLになった.Net Core 2.1のサポートを終了し、.NET Core 3.1以降が必須になりました。
対応している型が増えました。たとえば、次の型に対応しました。
C GLib実装はC++実装のバインディングです。
Apache Arrow Flightに対応しました。
Cデータインターフェイスに対応しました。
引き続きC++実装に追従し続けていますがだんだん取りこぼしが増えてきました。原因は開発リソース不足です。C++実装は何人もフルタイムで開発している人たちがいるのでもりもり改良されていきます。一方、最近C GLib実装を開発しているのは私とSpeeeの岡田さんくらいです。2人ともフルタイムではないので取りこぼしが増えてきました。ただ、前述の通り、私のApache Arrowの開発時間をVoltron Dataさんが資金援助してくれるようになったので今後は取りこぼしが減っていくはずです。
重要そうな機能はできるだけ優先して追従するようにしているので次のような機能はC GLib実装でも使えます。
HDFS/Amazon S3/Google Cloud Storage上にあるデータを読み書きする機能
Apache Arrowフォーマット/Apache Parquetフォーマット/CSVフォーマットなど各種フォーマットのデータを読み書きする機能
Gandivaを使った行フィルター機能
3.0.0まではGNU AutotoolsあるいはMesonでビルドできましたが、4.0.0からはGNU Autotoolsのサポートをやめました。4.0.0以降はMesonを使う必要があります。
Go実装は独自実装です。(他の実装のバインディングではありません。)
Apache Arrow Flightに対応しました。
対応している型が増えました。たとえば、次の型に対応しました。
Cデータインターフェイスに対応しました。
go/arrow/v${VERSION}とタグを用意するようになりました。これでgo get -u github.com/apache/arrow/go/arrow@v${VERSION}というようにバージョンを指定してGo実装を使えるようになりました。
Java実装は独自実装です。(他の実装のバインディングではありません。)
Apache Arrowファイル内のデータをZstandardまたはLZ4で圧縮できるようになりました。(Apache Arrowファイル全体ではなくデータ部分のみが対象。)
対応している型が増えました。たとえば、次の型に対応しました。
256ビットのdecimal(浮動小数点と違って誤差なく小数を表現できる数値型)
Cデータインターフェイスに対応しました。
後述するRust実装のデータ処理エンジンDataFusionのバインディングが実装されました。
Java 17に対応しました。
JavaScript実装は独自実装です。(他の実装のバインディングではありません。)
C++実装にあるような計算(Compute)モジュールがJavaScript実装にもあるのですがこれが削除されました。
APIがシンプルになったとか他にもいろいろ変更があるのですがちょっと説明しづらいので気になる人は公式ドキュメントを参照してください。
Julia実装は独自実装です。(他の実装のバインディングではありません。)
3.0.0からオフィシャル実装になりました。
オフィシャル実装になったのですが、その後いろいろあって一度オフィシャル実装から抜けています。ただ、2022年5月現在はまたオフィシャル実装になっています。このあたりは私がサポートしたんですよ!
3.0.0の頃はC++実装などと同じタイミングでのリリース(3-4ヶ月ごとにリリース)だったのですが、再度オフィシャル実装になってからはJulia実装独自のタイミングでリリースするようになりました。明確なルールはありませんが、1つ2つ機能追加・バグ修正が入ったらリリースというような感じです。
リリースタイミングだけでなくバージョン付けもC++実装らとは違います。セマンティクスバージョニングなのは変わりませんが、C++実装らのように3-4ヶ月ごとにメジャーバージョンするというようなことはしていません。互換性が壊れる変更が入ったらメジャーバージョンアップ、そうでない場合は変更内容に合わせてマイナーバージョンアップあるいはパッチバージョンアップです。
MATLAB実装はC++実装のバインディングです。
Featherバージョン1(非推奨になっている)を読み書きする機能だけしかないままですがAPIが改良されています。
Python実装はC++実装のバインディングです。
引き続きC++実装に追従し続けています。C++実装でできることはPythonでもできると思っていいです。
最新のPythonにも対応済みです。M1のmacOS用のwheelも用意されています。サポートが切れたPythonはサポートしていないので古いPythonを使い続けている場合はPythonをバージョンアップしてください。関連して、サポートが切れたmanylinux1のwheelのサポートを終了しました。サポートが切れそうなmanylinux2010のwheelのサポートも近いうちに終了する予定です。
後述するRust実装のデータ処理エンジンDataFusionのバインディングが実装されました。
R実装はC++実装のバインディングです。
Apache Arrow Flightに対応しました。
dplyr連携がかなり改良されています。たとえば、C++実装の計算関数をdplyrのfilter()の中で使えるようになっています。他にもグループ化してからの集計や、ジョインなどできることがかなり増えています。
DuckDBなどApache Arrowフォーマットをサポートしている他のプロジェクトとの連携を強化しました。
参考:DuckDB quacks Arrow: A zero-copy data integration between Apache Arrow and DuckDB
ALTREPへの対応も進めています。ALTREPサポートを有効にする(デフォルトでは無効)ことでより高速になります。
Ruby実装はC GLib実装のバインディングです。C GLib実装にある機能は自動的にRuby実装でも使えるようになっています。
Ruby 3.0で導入されたMemoryView機能に対応しました。MemoryView機能とはゼロコピーで多次元配列データを共有するための仕組みです。MemoryViewに対応したということはApache Arrowデータを他のRubyライブラリーとゼロコピーで共有できるということです。これまでもred-arrow-numo-narrayなどを使うことでゼロコピーで多次元配列データを共有できましたが、そういうことを一般化した仕組みがMemoryViewです。
参考:MemoryView: Ruby 3.0 から導入される数値配列のライブラリ間共有のための仕組み - Speee DEVELOPER BLOG
Rと同様にDuckDBと連携できますが連携機能はRuby実装に含めずred-arrow-duckdbという外部ライブラリーになっています。これは依存ライブラリーを少なくしてDuckDBとの連携が必要ないケースではDuckDBなしでも使えるようにするためです。(R実装もDuckDB関連ライブラリーがインストールされていれば使えるというレベルの依存にはなっています。)
Rust実装は独自実装です。(他の実装のバインディングではありません。)
https://github.com/apache/arrow/ 内で開発していたのですが、ここから https://github.com/apache/arrow-rs/ と https://github.com/apache/arrow-datafusion/ に分離して開発することになりました。理由は次の通りです。
https://github.com/apache/arrow/ はメインのissue管理システムとしてJIRAを使っているのが、それがRust実装の開発スタイルとマッチしない
https://github.com/apache/arrow-rs/ と https://github.com/apache/arrow-datafusion/ はJIRAではなくGitHub Issuesを使うようになった
https://github.com/apache/arrow/ よりも高頻度でリリースしたい
https://github.com/apache/arrow/ は3-4ヶ月に一回のメジャーバージョンアップリリース
https://github.com/apache/arrow-rs/ はおよそ毎月メジャーバージョンアップリリース
https://github.com/apache/arrow-datafusion/ は必要に応じてリリース
参考:A New Development Workflow for Arrow's Rust Implementation | Apache Arrow
安定版のRustでも使えるようになりました。これまでは安定版のRustでは使えなかったのですが、基本機能は安定版のRustでも使えるようになりました。
Apache Arrow Flightに対応しました。
対応している型が増えました。たとえば、次の型に対応しました。
SIMD対応などで高速になっています。
Rust実装開発者の1人がRust実装をいい感じに再実装したArrow2という実装もできました。将来的にこの実装に置き換わるとは思いますがいつになるかはわかりません。
Cデータインターフェイスに対応しました。
Rust実装ベースのDataFusionというクエリーエンジンも改良されています。SQLはいろいろ方言がありますが、PostgreSQLのSQL方言を使う方針にしました。ウインドウ関数に対応するなど機能面での改良もありますし、高速化など性能面での改良もあります。
DataFusionの拡張機能を集めたDataFusion-Contrib organizationができました。DataFusion自体はApache Arrowプロジェクトの一部ですがDataFusion-ContribはApache Arrowプロジェクトの一部ではありません。そのため開発スタイルが違います。
参考:Introducing Apache Arrow DataFusion Contrib
DataFusionは1ノード上で動くクエリーエンジンですがDataFusionをベースに実装されているBallistaという分散計算プラットフォームもApache Arrowに寄付されました。
2022年5月時点のApache Arrowの最新情報を、2020年7月からの差分という形でまとめました。Apache Arrowの最新情報をまとめはじめた2018年からApache Arrowはデータ処理界隈で重要なコンポーネントになると言っていましたが、1.0.0がリリースされて数年経った現在、本当にそうなったなと思っています。Apache Arrowに対応したプロダクトは増え、Apache Arrowに対応したクラウドサービスも増えています。今後もApache Arrowの重要度は増えていくでしょう。
私が知っていることはまとめたつもりですが、もしかしたらカバーできていない話があるかもしれません。もし、「○○についても知りたい!」という方がいたら@ktouに声をかけてください。この記事に追加します。
Apache Arrowについて講演して欲しいとかApache Arrow関連の開発のお仕事の相談はお問い合わせフォームからご連絡ください。
自分も仕事でApache Arrowの開発をしたい!という人はクリアコードの採用情報かVoltron Dataさんの採用情報を読んでください。あなたと一緒にApache Arrowの開発をすることを楽しみにしています!
去年は2番目でした。 ↩
Apache Arrow
現在クリアコードではソフトウェア開発者を募集しています! フリーソフトウェア開発での開発の仕方をベースに、成果や知識を公開し共有しながら業務に携われます。
RubyKaigi 2022 after event - 「Fast data processing with Ruby and Apache Arrow」のスピーカーに質問しよう! RubyKaigi 2022で須藤が発表した内容をより深堀するイベントをYouTube Liveで開催しました!アーカイブ公開中です。
2022年6月Apache Arrowの最新情報が一堂に集うデジタルカンファレンス『The Data Thread』に須藤が「Why Apache Arrow is important for Ruby」と題しビデオ登壇しました。動画はチャンネルからご覧いただけます。
2021-11-17 db tech showcase 2021で Apache Arrow Flight について講演しました!
メール誤送信対策製品「FlexConfirmMail」のMicrosoft Outlook版をリリースしました
Groonga delta - 差分ベースでMySQL/MariaDBのデータをGroongaに取り込むツール
Apache Arrow
milter manager
ククログの記事はCC BY-SA 4.0とGFDLのデュアルライセンスで自由に利用できます。
クリアコードはプログラミングが楽しいソフトウェア開発者を1名募集しています。
クリアコードは「クリアコードをいい感じにする人」を1名募集しています。
クリアコードはフリーソフトウェア開発で培った技術力を提供しています。特にMozilla製品(Mozilla FirefoxとMozilla Thunderbird)とRubyとGroonga(全文検索)に関連した開発を得意としています。