Apache Arrow 0.3.0リリース


Published 08 May 2017
By Wes McKinney (wesm)
Translations 原文(English)

Apache Arrowチームは0.3.0のリリースをアナウンスできてうれしいです。2月にリリースした0.2.0から10週間の活発な開発の結果が今回のリリースです。23人のコントリビューター306個のJIRAのissueを解決しました。

複数のArrowの実装にたくさんの新しい機能を追加しています。2017年、特に注力して開発するのは、インメモリー用のフォーマット、型のメタデータ、メッセージング用のプロトコルです。これは、ビッグデータアプリケーションに安定していてプロダクションで使える基盤を提供するためです。高性能IOとインメモリーデータ処理にArrowを活用するために、Apache SparkGeoMesaコミュニティーと協力していてとてもエキサイティングです。

それぞれのプラットフォームでArrowを使う方法はインストールページを見てください。

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のラムダ関数を使ってmapfilterを実行するケース。)

Python実装での新しい機能:メモリービュー、Feather、Apache Parquetのサポート

ArrowのPythonライブラリーであるpyarrowlibarrowlibarrow_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のファイルオブジェクトを読み書きできるようになっています。

DatetimeTZCategoricalといったpandas固有のデータ型のちゃんとした(robust)サポートも実装しました。

C++ライブラリーでのテンソルサポート

Apache Arrowはコピーなしで共有メモリーを管理するツールという側面があります。機械学習アプリケーションの文脈でこの機能への関心が増えています。UCバークレー校のRISELabRayプロジェクトが最初の例です。

機械学習ではは「テンソル」とも呼ばれる多次元配列というデータ構造を扱います。このようなデータ構造は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を使い始めるための有益な情報を見つけられるでしょう。

コントリビューター

このリリースにパッチをコントリビュートしたみなさんに感謝します。

$ 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