Apache Arrowの開発に参加している須藤です。Apache Arrowのコミッターにならない?と打診がきたので、そろそろコミッターになるかもしれません。最近、私以外の人がここに書くことが増えたので、わかりやすいように(?)私が書く時は記名して書くことにします。今回から。
さて、2017年5月8日にApache Arrow 0.3.0がリリースされたのでリリースアナウンスを翻訳します。翻訳記事なので、この記事のライセンスは他の記事のライセンスと違いApache License 2.0です。元の記事の著作権者はApache Software Foundation(ASF)です。リリースアナウンスを書いたのはWes McKinneyさんです。pandasの作者ですね。
Apache Arrowチームは0.3.0のリリースをアナウンスできてうれしいです。2月にリリースした0.2.0から10週間の活発な開発の結果が今回のリリースです。23人のコントリビューターが306個のJIRAのissueを解決しました。
複数のArrowの実装にたくさんの新しい機能を追加しています。2017年、特に注力して開発するのは、インメモリー用のフォーマット、型のメタデータ、メッセージング用のプロトコルです。これは、ビッグデータアプリケーションに安定していてプロダクションで使える基盤を提供するためです。高性能IOとインメモリーデータ処理にArrowを活用するために、Apache Spark・GeoMesaコミュニティーと協力していてとてもエキサイティングです。
それぞれのプラットフォームでArrowを使う方法はインストールページを見てください。(訳注:ここには載っていませんが、私が用意した非公式のAPT/YUMリポジトリーもあります。Apache ArrowだけでなくApache Parquetのパッケージもあります。リリース版ではなく未リリースの最新版のパッケージです。)
Arrowでビッグデータシステムを高速化するケースを増やすために、近いうちにApache Arrowのロードマップを公開する予定です。
Arrowの開発に参加するコントリビューターを募集中です!すでにArrowの開発に参加しているコミュニティーからのコントリビューターもそうですし、まだ参加していないGo、R、Juliaといったコミュニティーからのコントリビューターも募集中です!
ファイルフォーマットとストリーミングフォーマットの強化
0.2.0ではランダムアクセス用とストリーミング用のArrowのワイヤーフォーマット(訳注:データ交換用のフォーマット?)を導入しました。実装の詳細はIPC仕様を見てください。ユースケースは使用例を紹介したブログを見てください。これらのフォーマットを使うと低オーバーヘッド・コピーなしでArrowのレコードバッチのペイロードにアクセスできます。
0.3.0ではこのバイナリーフォマットの細かい詳細をたくさん固めました。Java、C++、Python間の連携のテストおよびそれぞれ言語での単体テストの整備も進めました。Google Flatbuffersは、前方互換性を壊さずにメタデータに新しい機能を追加するのに非常に助かりました。
まだバイナリーフォーマットの前方互換性を必ず壊さないと約束できる状態ではありませんが(もしかしたら変更する必要があるなにかが見つかるかもしれない)、メジャーリリース間では不必要に互換性を壊さないように努力するつもりです。Apache ArrowのWebサイト、各コンポーネントのユーザー向けのドキュメントおよびAPIドキュメントへのコントリビューションを非常に歓迎します。
辞書エンコーディングのサポート
GeoMesaプロジェクトのEmilio Lahr-VivazはJavaのArrow実装に辞書エンコード対応ベクターをコントリビュートしました。これを受けて、C++とPythonでもサポートしました。(pandas.Categorical
とも連携できます。)辞書エンコーディング用のインテグレーションテスト(C++とJava間でこのデータを送受信するテスト)はまだ完成していませんが、0.4.0までには完成させたいです。
これはカテゴリーデータ用の一般的なデータ表現テクニックです。これを使うと、複数のレコードバッチで共通の「辞書」を共有し、各レコードバッチの値はこの辞書を参照する整数になります。このデータは統計的言語(statistical language)の分野では「カテゴリー(categorical)」や「因子(factor)」と呼ばれています。(訳注:日本語での呼び方はあっています?)Apache Parquetのようなファイルフォーマットの分野ではデータ圧縮のためだけに使われています。
日付、時刻、固定長型の拡張
0.2.0では現実に使われている日付・時刻型をインテグレーションテスト付きで完全にサポートすることを諦めました。これらはApache ParquetとApache Sparkとの連携に必要な機能です。
-
日付: 32-bit(日単位)と64-bit(ミリ秒単位)
-
時刻: 単位付き64-bit整数(単位:秒、ミリ秒、マイクロ秒、ナノ秒)
-
タイムスタンプ(UNIXエポックからの経過時間): 単位付き64-bit整数のタイムゾーン付きとタイムゾーンなし
-
固定長バイナリー: 決まったバイト数のプリミティブな値
-
固定長リスト: 各要素が同じサイズのリスト(要素のベクターとは別にオフセットのベクターを持つ必要がない)
C++のArrow実装では、Boost.Multiprecisionを使ったexactな小数のサポートを実験的に追加しました。ただし、Java実装とC++実装間での小数のメモリーフォーマットはまだ固まっていません。
C++とPythonのWindowsサポート
一般的なC++とPythonでの開発用に、パッケージ周りの改良も多数入っています。0.3.0はVisual Studio(MSVC)2015と2017を使ってWindowsを完全にサポートした最初のバージョンです。AppveyorでMSVC用のCIを実行しています。Windows上でソースからビルドするためのガイドも書きました。C++用とPython用。
conda-forgeからWindows用のArrowのPythonライブラリーをインストールできます。
conda install pyarrow -c conda-forge
C(GLib)バインディングとRuby・Lua・他のサポート
Kouhei Sutou(訳注:私です)は新しいApache Arrowのコントリビューターです。Linux用の(ArrowのC++実装の)GLibを使ったCバインディングをコントリビュートしました。GObject IntrospectionというCのミドルウェアを使うことでRuby、Lua、Goや他にも様々なプログラミング言語でシームレスにバインディングを使うことができます。これらのバインディングがどのように動いているか、これらのバインディングをどのように使うかを説明するブログ記事が別途必要な気がします。
PySparkを使ったApache Sparkとの連携
SPARK-13534でApache Sparkコミュニティーと協力しています。PySparkでのDataFrame.toPandas
をArrowを使って高速化しようとしています。効率的なデータのシリアライズにより40倍以上高速化できるケースがあります。
PySparkでArrowを使うことでこれまでできなかったパフォーマンス最適化の道が開けました。特に、UDFの評価まわりでいろいろやれることがあるでしょう。(たとえば、Pythonのラムダ関数を使ってmap
・filter
を実行するケース。)
Python実装での新しい機能:メモリービュー、Feather、Apache Parquetのサポート
ArrowのPythonライブラリーであるpyarrow
はlibarrow
とlibarrow_python
というC++ライブラリーのCythonバインディングです。pyarrow
はNumPyとpandasとPythonの標準ライブラリー間のシームレスな連携を実現します。
ArrowのC++ライブラリーで最も重要なものはarrow::Buffer
オブジェクトです。これはメモリービューを管理します。コピーなしの読み込みとスライスをサポートしている点が重要です。Jeff KnuppはArrowのバッファーとPythonのバッファープロトコルとmemoryviewの連携処理をコントリビュートしました。これにより次のようなことができるようになりました。
In [6]: import pyarrow as pa
In [7]: buf = pa.frombuffer(b'foobarbaz')
In [8]: buf
Out[8]: <pyarrow._io.Buffer at 0x7f6c0a84b538>
In [9]: memoryview(buf)
Out[9]: <memory at 0x7f6c0a8c5e88>
In [10]: buf.to_pybytes()
Out[10]: b'foobarbaz'
C++でのParquet実装であるparquet-cppを使うことで大幅にApache Parquetサポートを改良しました。たとえば、ディスク上にあるかHDFS上にあるか関係なく、パーティションされたデータセットをサポートしました。DaskプロジェクトはArrowを使ったParquetサポートを実装した最初のプロジェクトです。Dask開発者とはpandsデータを分散処理する文脈でさらに協力できることを楽しみにしています。
pandasを成熟させるためにArrowを改良することもあり、Featherフォーマットの実装をマージしたのもその1つです。Featherフォーマットは本質的にはArrowのランダムアクセスフォーマットの特別なケースの1つです。ArrowのコードベースでFeatherの開発を続けます。たとえば、今のFeatherはArrowのPythonバインディングのレイヤーを使うことでPythonのファイルオブジェクトを読み書きできるようになっています。
DatetimeTZ
やCategorical
といったpandas固有のデータ型のちゃんとした(robust)サポートも実装しました。
C++ライブラリーでのテンソルサポート
Apache Arrowはコピーなしで共有メモリーを管理するツールという側面があります。機械学習アプリケーションの文脈でこの機能への関心が増えています。UCバークレー校のRISELabのRayプロジェクトが最初の例です。
機械学習ではは「テンソル」とも呼ばれる多次元配列というデータ構造を扱います。このようなデータ構造はArrowのカラムフォーマットがサポートしているデータ構造の範囲を超えています。今回のケースでは、arrow::Tensor
というC++の型を追加で実装しました。これはArrowのコピーなしの共有メモリー機能を活用して実装しました。(メモリーの生存期間の管理にarrow::Buffer
を使いました。)C++実装では、これからも、共通のIO・メモリー管理ツールとしてArrowを活用できるようにするため、追加のデータ構造を提供するつもりです。
JavaScript(TypeScript)実装の開始
Brian HuletteはNodeJSとWebブラウザー上で動くアプリケーションで使うためにTypeScriptでのArrowの実装を始めました。FlatBuffersがJavaScriptをファーストクラスでサポートしているので実装が捗ります。
Webサイトと開発者用ドキュメントの改良
0.2.0をリリースしてからドキュメントとブログを公開するためにWebサイトのシステムをJekyllベースで作りました。Kouhei Sutou(訳注:私です)はJekyll Jupyter Notebookプラグインを作りました。これによりArrowのWebサイトのコンテンツを作るためにJupyterを使うことができます。
WebサイトにはC、C++、Java、PythonのAPIドキュメントを公開しました。これらの中にArrowを使い始めるための有益な情報を見つけられるでしょう。
コントリビューター
このリリースにパッチをコントリビュートしたみなさんに感謝します。(訳注:上から2番目が私です。)
$ git shortlog -sn apache-arrow-0.2.0..apache-arrow-0.3.0
119 Wes McKinney
55 Kouhei Sutou
18 Uwe L. Korn
17 Julien Le Dem
9 Phillip Cloud
6 Bryan Cutler
5 Philipp Moritz
5 Emilio Lahr-Vivaz
4 Max Risuhin
4 Johan Mabille
4 Jeff Knupp
3 Steven Phillips
3 Miki Tebeka
2 Leif Walsh
2 Jeff Reback
2 Brian Hulette
1 Tsuyoshi Ozawa
1 rvernica
1 Nong Li
1 Julien Lafaye
1 Itai Incze
1 Holden Karau
1 Deepak Majeti
以上が0.3.0のリリースアナウンスです。Apache Arrowを使いたくなってきましたか?
Apache Arrowに興味が出てきた人は今月(2017年5月)次のイベントでApache Arrow関連の話題があるのでぜひ参加してください。
Apache Arrow関連のイベントを開催したい!という方は私(@ktou)に相談してください。Apache Arrowがデファクトスタンダードになって開発に参加する人がもっと増えるといいなぁと思っているので一緒に協力してやっていきたいです。