ja ja ja ja ja ja ja ja ja en ja ja ja ja ja ja ja ja ja ja ja de ja ja ja ja ja ja ja ja ja ja ja ja ja ja en ja ja ja ja ja ja ja ja ja en 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 en ja en ja en tr en ja ja ja ja ja ja ja fi ja ja ja ja ja ja pt ja ja ja ja en ja ja zh ja ja en ja ja en ja ja hbs_lat zh ja zh ja ja el ja ja en ja ja en ja ja ja en ja ja ja ja ja ja en ja ja ja ja en en ja ja en en ja ja en en ja en ja ja ja ja ja ja ja ja ja ja en ja ja en ja ja ja ja ja ja ja ja ja ja ja ja ja en en en ja ja en ja en ja ja ja ja en ja ja en en 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 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の公式ブログや公式メーリングリストやそれぞれの開発者のブログ・発表などです。開発者のブログの中ではUrsa Labs Blogの隔月の開発レポートがオススメです。Ursa Labsはスポンサーを集めてフルタイムでApache Arrowの開発をしている非営利の組織です。(という説明でそんなに間違っていないはず。)
参考:[DISCUSS] Format changes: process and requirements
参考:[VOTE] Adopt FORMAT and LIBRARY SemVer-based version schemes for Arrow 1.0.0
1.0.0の次の次のリリース
ライブラリーのバージョン:3.0.0
データフォーマットのバージョン:1.0.0
Apache Arrowにはたくさんのプログラミング言語向けのライブラリーがありますが、すべてこのルールで一緒にリリースされます。
バージョンの話はこれくらいにして、Apache Arrowが扱えるデータについて説明します。基本的なデータについてはApache Arrowの最新情報(2018年9月版)を参照してください。ここではこの1年で新しく扱えるようになったデータについて説明します。
新しく次のデータを扱えるようになりました。
2つの日の差(64bit整数)
2つの月の差(64bit整数)
2つの時刻の差(64bit整数)
サポートしている単位:秒・ミリ秒・マイクロ秒・ナノ秒
2GiB以上の大きさの可変長バイナリーデータ
参考:ARROW-750 [Format] Add LargeBinary and LargeString types
2GiB以上の大きさの可変長UTF-8文字列
参考:ARROW-750 [Format] Add LargeBinary and LargeString types
2G個以上の要素を扱えるリスト
参考:ARROW-4810 [Format][C++] Add "LargeList" type with 64-bit offsets
参考:ARROW-854 [Format] Support sparse tensor
また、ユーザーが独自に型を追加できるようになりました。これを拡張型と呼びます。
拡張型は次のように実現しています。
生データはApache Arrowが提供するプリミティブ型を使って表現する
生データにメタデータを付与して追加情報を表現する
たとえば、UUID型は次のように実現します。
生データは16バイトの固定長バイナリーデータ型を使って表現する
生データに次のメタデータを付与
UUIDのバージョン:1
この実現方法のメリットは、使っているApache Arrowのライブラリーが対象の拡張型のことを知らなくても(UUID型について知らなくても)データを扱えるという点です。対象の拡張型を知らなかったら単に生データ(UUID型ならただの16バイトの固定長バイナリーデータ)として扱えばよいからです。もちろん、その拡張型固有の操作はできませんが、要素数を数えたり、複数のデータチャンクをまとめて次のデータ処理モジュールにデータを渡すといった基本的な操作はできます。
Apache Arrowは各種データ処理ツールが共通で使える高速なデータ処理機能の開発も重視しています。去年の時点ではデータフォーマットの方に注力していたためあまり進んでいませんでした。しかし、この1年でデータ処理部分の実装が進んでいます。
特に進んだのがC++とRustです。C++のバインディングとして実装されているPython、R、Rubyもその恩恵を受けています。
それではそれぞれの言語毎にデータ処理部分がこの1年でどう改良されたかを紹介します。去年の時点で実装されている処理についてはApache Arrowの最新情報(2018年9月版)を参照してください。
C++でこの1年で実装された処理は次の通りです。
指定した値と各要素の比較
比較方法:==, !=,  , >=
例:Compare([null, 1, 2, 3], 2, >=)→[null, false, true, true]
非NULLの要素数のカウント
例:Count([null, 1, 2, 3])→3
真偽値配列による要素の選択
結果:対応する真偽値配列の要素が偽ではない要素の部分だけが残った配列
例:Filter([null, 1, 2, 3], [true, false, null, true])→[null, null, 3]
値ごとの要素数のカウント
結果:構造体({"Values": 入力の配列と同じ型, "Counts": 64ビット整数})の配列
例:ValueCounts([null, "a", "b", "a"])→[{"Value": "a", "Counts": 2}, {"Value": "b", "Counts": 1}]
対象の配列の中に指定した配列にある要素が含まれているか
例:IsIn([null, 1, 2, 3], [1, 3])→[null, true, false, true]
算術平均(NULLを無視)
結果:平均値(64bit浮動小数点数)
例:Mean([null, 1, 2, 3])→2.0
ソートし、ソート後の各要素がソート前は何番目の要素だったかを返す(NULLは最後になる)
結果:64bit整数の配列
例:SortToIndices([null, 3, 1, 2])→[2, 3, 1, 0]
合計(NULLを無視)
結果:合計値(64bit整数または64bit非負整数または64bit浮動小数点数)
例:Sum([null, 1, -2, 3])→2
配列から指定したインデックスの要素を抽出
結果:対応する要素だけが残った配列
例:Take([null, "a", "b", "c"], [2, null, 1])→["b", null, "a"]
さらにGandivaという名前の式コンパイラーが取り込まれました。Apache Arrowの最新情報(2018年9月版)の段階で取り込まれようとしていたものが正式に取り込まれたということです。
前述の処理は配列単位の処理ですが、Gandivaはレコードバッチ(レコードの集合)に対する処理を扱います。たとえば、「record.column1 > 100 && record.column2 == "XXX"」のような処理を扱います。このような処理をLLVMを使って実行時にネイティブコードにコンパイルしてから実行するので高速に式を評価できます。
Gandivaは単に条件で絞り込むような簡単な式だけでなく、SQLで記述できるような集約処理や条件分岐(CASE相当)などの複雑な式も扱います。
参考:Gandiva: A LLVM-based Analytical Expression Compiler for Apache Arrow | Apache Arrow
現時点でGandivaはC++だけでなくJava、Python、Rubyから使えます。
現時点では前述の配列単位の処理(内部では計算カーネルと呼んでいます)とGandivaは特に連携していません。算術演算のような基本的な処理はどちらにもあります。では、どうやって使い分けるのかが気になりますね。おそらく、次のような使い分けになるでしょう。
中間結果(最終結果じゃない)のレコードバッチの処理:Gandiva
例:レコードのフィルター
最終結果を生成する処理:計算カーネル
参考:Compute kernels and Gandiva operators
もう少し先になると、ユーザーはもう少し高レベルのAPIを使うことができるようになるはずです。どこかからデータを読み込み、読み込みながら指定したクエリーでデータを絞り込めるようなAPIです。
データ読み込み処理はデータセットAPIとして実装が始まっています。
今のところローカルにあるApache Parquetフォーマットのデータだけ読み込めますが、今後、CSVやJSONフォーマットのデータも読み込めるようになったり、S3上のファイルなどリモートにあるデータも読み込めるようになる予定です。条件のプッシュダウン(指定した条件のデータだけ読み込む)も対応します。プッシュダウンなしで、読み込んだ後に不要なデータを捨てる方法もありますが、それよりも、そもそも読まない方が圧倒的に高速なのです。
Developing a "dataset" API / framework for Arrow C++ users
Apache Arrow C++ Datasets
読み込んだデータはクエリーエンジンで処理できるようになる予定です。クエリーエンジンは内部で計算カーネルやGandivaを利用して効率的に処理します。
[DISCUSS][C++] Arrow-native C++ query engine development
Apache Arrow Query Engine ("AQE" for short) for C++
ユーザーがより扱いやすいAPIとしてデータフレームAPIも実装する予定です。
[DISCUSS] Developing a "data frame" subproject in the Arrow C++ libraries
Arrow C++ Data Frame Project
Rustでこの1年で実装された処理は次の通りです。
要素ごとの算術演算(SIMD対応)
要素ごとの論理演算(AND・OR・NOT)
要素ごとの比較(SIMD対応)
配列から指定したインデックスの要素を抽出
時刻配列の各要素を時間(hour)に変換
Rustでもクエリーエンジンの実装が始まりました。DataFusionという名前です。
C++のクエリーエンジンはSQLなど特定のフロントエンドを用意しない3設計4ですが、DataFusionにはSQLのフロントエンドがあります。
まだ簡単なSQLしか処理しかできませんが、より複雑なSQLも処理できるように開発を進めています。
参考:DataFusion: A Rust-native Query Engine for Apache Arrow | Apache Arrow
この1年でRustのApache Parquet実装がApache Arrowに取り込まれたので、Apache Parquetフォーマットのデータもデータソースとして扱えます。
現時点ではすべてRustで実装していますが、どうにかしてGandivaとつなげられないかという検討もしています。
参考:[DISCUSS] [Gandiva] Adding query plan to Gandiva protobuf definition
DataFusionの開発をしている@andygrove73はDataFusionベースの分散計算プラットフォームBallistaの開発をはじめました。PoCのプロジェクトだそうなので、ここでの実験の成果がDataFusionに還元されていくのだと思います。
データ処理まわりについては、この1年で特に進んだC++実装とRust実装を紹介しました。
Arrow Flight - 高速RPCシステム
この1年Arrow FlightというApache Arrowベースの高速RPCシステムの開発が始まりました。gRPCベースのプロトコルですが、できるだけ高速になるように設計されています。たとえば、データのコピーができるだけ少なくなるようになっています。
ここでもう少しArrow Flightについて紹介できればよかったのですが、私がまだ触っていないのでそんなに説明できることがありません。残念。
Java実装を主に実装したDremioの人たちが書いたArrow Flightの記事Understanding Apache Arrow Flightもあるのですが、ちょっとこれだけだとピンとこないと思います。
現時点でArrow Flightを使えるのはC++とJavaとPythonです。
来年にはRubyでも使えるようにして紹介できるようにしたいな。
追記:Apache Arrow Flightの日本語情報を公開
各言語での実装の完成度
各言語での実装の完成度もApache Arrowの最新情報(2018年9月版)からの差分を紹介します。
まず、次の言語が増えました。
C#はネイティブ実装で、RとMATLABはC++実装のバインディングです。
C#実装は基本的な型にだいたい対応しています。前述の新しく扱えるようになったデータはまだ対応していません。NuGetでインストールできます。
参考:NuGet Gallery | Apache.Arrow
R実装はかなりC++実装をカバーしています。Python実装やRuby実装ほどではありませんが、完成度が高めです。Apache Parquetの読み込みもサポートしました。RからApache Parquetを読み込めるとうれしい人が多いはずです。CRANからインストールできます。
参考:CRAN - Package arrow
MATLAB実装はFeatherフォーマットを読み書きできるだけです。今後、開発が活発になるかどうかはよくわかりません。
Apache Arrow利用者
Apache Arrowの利用者が増えています。
TensorFlowはApahche Arrowフォーマットのデータをデータセットとして使えるようにしました。
参考:TensorFlow with Apache Arrow Datasets
BigQuery Storage APIもApache Arrowフォーマットのデータをサポートしました。
BigQuery Storage API now supports Arrow
Announcing google-cloud-bigquery Version 1.17.0: Query Results to DataFrame 31x Faster with Apache Arrow
PG-StromというPostgreSQLの拡張モジュールもApache Arrowフォーマットのデータをサポートしました。PG-StromはGPUを使って高速にデータ処理するための拡張モジュールです。PG-Stromの関連モジュールとしてArrow_Fdwがあり、これを使うとストレージに置いてあるApache ArrowフォーマットのデータをPostgreSQLから読み込めます。読み込んだデータはPG-Stromで高速に処理できます。
参考:PostgreSQLをどこまで高速化できるのか?〜ハードウェアの限界に挑むPG-Stromの挑戦〜
PG-StromにはPostgreSQLに接続して結果をApache Arrowフォーマットのデータとして保存するpg2arrowというコマンドもあります。この機能はC++のデータセットAPIで実現しようとしている機能の1つでもあります。この機能をApache Arrow本体に取り込まないか?という話もあるので楽しみですね。
参考:Contributing to Apache Arrow? · Issue #9 · heterodb/pg2arrow
1.0.0がリリースされたらもっとApache Arrowの利用者が増えるでしょう。
Apache Arrowの今後
ここまででApache Arrowのこの1年の最新情報を説明しました。最後に今後のことを説明します。
前日の通り、近いうちに1.0.0がリリースされます。
去年、Apache Arrow東京ミートアップ2018というApache Arrowイベントを開催しましたが、1.0.0に合わせて今年もApache Arrowイベントを開催する予定です。楽しみにしていてください!
Apache Arrow利用者の増加
1.0.0がリリースされるとこれまで「様子見」だった人たちが使うようになるはずです。そうするといろんなところでApache Arrowを利用した高速なデータ交換ができるようになります。
次の1年でApache Arrow対応プロダクト・サービスはたくさん増えるでしょう。
前述の通りC++実装ではデータセット・クエリーエンジン・データフレームなどデータ処理機能の実装に注力していきます。次の1年で使える機能がかなり増えるでしょう。
2019年9月時点のApache Arrowの最新情報を、2018年9月からの差分という形でまとめました。Apache Arrowは数年後にはデータ処理界隈で重要なコンポーネントになっているだろうプロジェクトです。日本でもApache Arrowのことを知っている人が増えるといいと思うので日本語でまとめました。Apache Arrowを使う人が増えるといいなぁと思います。さらに言えば開発に参加する人も増えるといいなぁと思います。
私が知っていることはまとめたつもりですが、もしかしたらカバーできていない話があるかもしれません。もし、「○○についても知りたい!」という方がいたらApache Arrowのことを日本語で話せるチャットで声をかけてください。この記事に追加します。
Apache Arrowについて講演して欲しいという方はお問い合わせフォームからご連絡ください。
私はデータ処理ツールの開発という仕事をしたいと思っています。その中にはもちろんApache Arrowの開発も含まれています。一緒に仕事をしたい!(自社サービスをApache Arrow対応したいとか)という方はお問い合わせフォームからご連絡ください。
去年はPMCメンバー・コミッター含めて日本人は私だけでしたが、今は私の他に2人日本人がいます。 ↩
去年は3番目でした。 ↩
そのようなフロントエンドのバックエンドになる ↩
前述の設計文書の「Non-goals」を参照。少なくとも今のところはそうしない設計。 ↩
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 について講演しました!
GitLab Runnerを使ったサポートコストの低減
SentencePiece・fastTextをEPELのパッケージを使って簡単にインストールできるようになります
Apache Arrow
milter manager
ククログの記事はCC BY-SA 4.0とGFDLのデュアルライセンスで自由に利用できます。
クリアコードはプログラミングが楽しいソフトウェア開発者を1名募集しています。
クリアコードは「クリアコードをいい感じにする人」を1名募集しています。
クリアコードはフリーソフトウェア開発で培った技術力を提供しています。特にMozilla製品(Mozilla FirefoxとMozilla Thunderbird)とRubyとGroonga(全文検索)に関連した開発を得意としています。