Above & Beyond

日々のアウトプット記録

Apache ArrowのRバインディング

Apache Arrow東京ミートアップ2018」のコード懇親会の時に到達できなかったサンプルを動かす環境を作るまでを、やり直して手順を整理したので書きます。

speee.connpass.com

f:id:kabukawa:20181208125310j:plain

目次


動かしたいもの

尚、動かしたいものはここにある Apache ArrowのRバインディングとサンプルコードです。 github.com


環境

本当はWindowsネイティブで動かしたかったのですが、取り敢えず先に動かしてみたかったので、Windows10のWSLに立てた Ubuntu 18.04の環境に作りました。

www.microsoft.com

また、他の環境を動かすために入れたものが変な影響を与えてくるのは嫌だったので、WSLのUbuntu環境をリセットして作業をしています。


前提

試してみてわかったのですが、このバインディングのサンプルを動かすには以下のものが必要です。

  • C/C++コンパイラなどの開発ツールチェーン
  • git
  • Python(pandas等の関数をサンプルコードで呼び出しているため)
  • R(ビルドの最後になってわかったのですが、3.5以上が必要です)

パッケージ等は依存関係を元にインストールする手順を想定しているので、インターネット接続できる環境で作業する前提です。

また、Ubuntuはrootユーザーにsuはできないので、作業は一般ユーザーで行い、特権が必要な時はsudoで行います。 (まぁ、分かっている人ばかりだと思いますが、一応)


事前作業

Apache Arrowのインストールをする時の手順の前段階で必要と思われる作業です。

OSの更新

何はともあれ、WSLのUbuntuをインストールした直後はパッケージがちょっと前のものだったりするので、パッケージの更新をしておきます。

sudo apt update
sudo apt upgrade

ツールチェーン等のaptパッケージインストール

コンパイラなどのツールチェーンと後続の処理で必要になるライブラリをインストールします。

sudo apt install build-essential libcurl4-openssl-dev libssl-dev

Pythonのインストール

ここでは3系のPythonをインストールします。 併せてPython上にpandas pyarrowパッケージもインストールしておきます。

sudo apt install python3 python3-pip python3-dev
sudo pip3 install pandas pyarrow

Gitの設定

今回の手順では直接は必要ありませんが、実際に開発をする時にcommitしたりpushする時に必要なのでここで設定しておきましょう。

git config --global user.name [あなたのGitユーザー名]
git config --global user.email [あなたのメールアドレス]

aptリポジトリの追加

Rの最新版を入れる必要がある関係上、リポジトリを追加します。 ここでは最新版のRのビルドを提供しているrstudioのサイトから取るように設定します。

cat /etc/apt/sources.list
sudo vi /etc/apt/sources.list

追加する内容は以下です。この行をファイルの最終行に追加してください。

deb https://cran.rstudio.com/bin/linux/ubuntu bionic-cran35/

追加が終わったら保存して、更新されていることを確認しましょう。

cat /etc/apt/sources.list

鍵の追加

次にrstudioのサーバーからの取得をするために鍵を追加します。

gpg --keyserver keyserver.ubuntu.com --recv-key E084DAB9
gpg -a --export E084DAB9 | sudo apt-key add -

パッケージリストを最新化した上でRをインストールします。

12/10時点ではR 3.5.1がインストールされました。

sudo apt update
sudo apt install r-base r-base-dev

aptパッケージの追加インストール

R上に devtools パッケージをインストールするために必要なaptパッケージを追加でインストールします。 aptパッケージインストールが済んだら、Rを起動します。(インストール作業をするので sudoで特権ユーザーとして起動します)

sudo apt-get install libcurl4-gnutls-dev libxml2-dev libssl-dev
sudo -i R

Rの追加パッケージをインストール

R上に devtools 等の追加パッケージをインストールします。 インストールが終わったら、q() で Rの環境を抜けます。

install.packages('devtools')
install.packages('reticulate')
install.packages("tibble")
q()

Apache Arrowのビルド準備

ここからはApache ArrowのRバインディングのページに書かれている手順をなぞります。

github.com

でも、結構足りない手順があったりするので、ここに書いた手順でやらないとエラーとかでハマります。

aptパッケージの追加インストール

Apache Arrowをビルドするために必要なパッケージをaptパッケージをインストールします。

sudo apt-get install cmake \
     libboost-dev \
     libboost-filesystem-dev \
     libboost-system-dev \
     libboost-regex-dev

libboost-regex-dev はC++版の手順には含まれていませんが、後で必要になったので入れています。

Apache Arrowのビルド

基本的には C++版を使うので、C++版の手順に従ってビルドします。

git clone https://github.com/apache/arrow.git
cd arrow/cpp
mkdir release
cd release

cmake .. -DCMAKE_BUILD_TYPE=Release
sudo make install

R版の手順には cmake の時に以下のフラグが付いていますが、これをつけると Ubuntu環境ではエラーになるので外しています。

-DARROW_BOOST_USE_SHARED:BOOL=Off

jmarroc関連のエラーは libjemalloc-dev、autotools-dev をインストールすることで解消されました。 jemallocは無ければ無いで問題ないそうです。もしjemalloc関連のエラーが出たら

-DARROW_JEMALLOC=OFF

で使わない(エラーにならない)ようにできます。

Rバインディングのインストール

Rを起動します。インストール作業をするので sudoで特権ユーザーとして起動します。

sudo -i R

Rバインディングのインストールを実行します。 ビルドに必要なものはここまでで準備できているはずなので、無事にパッケージのビルドとインストールができるはずです。

devtools::install_github("apache/arrow/r")

稼働確認

Rバインディングのページに有るサンプルをR上で動かして、エラーにならず実行できることを確認します。

library(arrow, warn.conflicts = FALSE)
library(tibble)
library(reticulate)

tf <- tempfile()

(tib <- tibble(x = 1:10, y = rnorm(10)))

arrow::write_arrow(tib, tf)

pa <- import("pyarrow")
as_tibble(pa$open_file(tf)$read_pandas())

まとめ

こんな感じで WSL上のUbuntu 18.04 LTS上でApache ArrowのRバインディングを動かす環境の構築をしました。 やっとこれで入り口にたった感じです。

ちなみに、ビルドなどがたくさん走るので、最初の手順からやると2,3時間はかかります。