C/C++拡張されたPythonライブラリをCloudera Data Science WorkbenchとSparkクラスタで分散実行する

原文:Create conda recipe to use C extended Python library on PySpark cluster with Cloudera Data Science Workbench
原著&翻訳:有賀康顕

サンプルによるMeCabを使ったword cloud

Cloudera Data Science Workbench(CDSW)は、データサイエンティストに、Python、R、およびScalaを使用してエンタープライズデータにセキュアにアクセスできるようにします。 前回の記事(日本語)では、お気に入りのPythonライブラリをPySparkでApache Sparkクラスタで使用する方法を紹介しました。 Pythonの世界では、データサイエンティストはC/C ++などのネイティブ拡張を含むXGBoostなどのPythonライブラリを使用したいことがよくあります。 この記事では、この問題を解決してC拡張を使ってcondaレシピを作成する方法を示します。 レシピ作成のサンプルリポジトリはこちら、MeCabの分散実行のサンプルはこちら

condaパッケージの詳細については、公式ドキュメントを参照してください。 特にC拡張の場合、このチュートリアルは読みやすい便利なリソースです。

(オプション) Anaconda image for Dockerを用意する

今回は、Anaconda image for Dockerを使いこのレシピを作成しました。 Dockerコンテナを使用すると、ライブラリの互換性が保証されます。 また、環境が隔離されるので、システムPythonの環境とanacondaインストールしたPython環境の混在による、トラブルを回避できます。 特にmacOSユーザは、macOSに付属のCライブラリやビルドされたバイナリが、クラスタ必要とされるものと互換性がないため、Dockerコンテナ内にビルドする必要があります。

では、AnacondaのDockerイメージを準備しましょう。以下のコマンドは物理マシンで実行します。

$ docker pull continuumio/anaconda
$ docker run -i -v $(pwd):/root/mecab -t continuumio/anaconda /bin/bash

注:glibcの非互換性のため、Dockerイメージを使用しても、CentOS 6などの古いLinuxディストリビューションのパッケージを構築することはできない場合があります。

Conda向けの開発環境を準備する

公式ドキュメントにある通り、C/C++に依存するレシピを作るためには gcc/g++ をインストールする必要があります。 開発ツールが入っていない場合は、依存ツールのインストールを確実に行う必要があります。 このレシピでは、次のように必要なパッケージをインストールしてください(以下は、Debian/Ubuntuの例です)。

$ sudo apt-get install g++ autoconf make

condaレシピの開発をする前に、minicondaをinstallした後で、conda build toolをインストールします。

$ conda install conda-build
$ conda upgrade conda
$ conda upgrade conda-build

レシピを書く

ワーキングディレクトリを作成し、パッケージのメタ情報を meta.yaml に書きます。メタ情報は、パッケージ名、ソースのリポジトリ、依存関係を記述します。今回は、パッケージ名を mecab としました。

$ cd ~/
$ mkdir mecab
$ cd mecab

レシピの例:

package:
name: mecab
version: "0.996"

source:
git_url: https://github.com/taku910/mecab
git_rev: 32041d9504d11683ef80a6556173ff43f79d1268

build:
number: 0

Requirements:
Build:
- g++
run:
- libgcc

about:
home: http://taku910.github.io/mecab
license: BSD,LGPL,GPL

ビルドスクリプトを書く

パッケージをビルドをするためのスクリプトbuild.sh を書きます。

スクリプトの例:

# Build MeCab
cd mecab
./configure --prefix=$PREFIX --with-charset=utf8
make
make install
# Build dictionary for MeCab
cd ../mecab-ipadic
./configure --with-mecab-config=$PREFIX/bin/mecab-config --prefix=$PREFIX --with-charset=utf8 --with-dicdir=$PREFIX/lib/mecab/dic/ipadic
make
make install
# Build MeCab Python wrapper
cd ../mecab/python
swig -python -shadow -c++ ../swig/MeCab.i
python setup.py build
python setup.py install --prefix=$PREFIX

注: $PREFIX を各コンポーネントに対して設定するのを忘れないようにしてください。 $PREFIX はcondaをビルドするときに予約されている環境変数です。もし $PREFIX なしに依存するモジュールをビルドをすると、condaパッケージを固めるときにそれらのモジュールが含まれません。

パッケージをビルドする

それでは、パッケージをビルドしましょう。以下のコマンドを実行してcondaパッケージをtar.gzに圧縮します。

$ conda build .

ビルドが成功したら、ローカルのファイルを使ってインストールを試してみましょう。

$ conda install mecab --use-local

パッケージをAnacondaレポジトリにアップロードする

自分で作成したパッケージを配布したい場合、Anacondaが提供するレポジトリを使うことができます。アップロードには、anacondaクライアントが必要なため、condaコマンドからインストールします。

$ conda install anaconda-client

anaconda.org のアカウントを作成した後、ターミナルからログインをしパッケージをアップロードします。

$ anaconda login
# Input your anaconda.org username and password…
$ anaconda upload /opt/conda/conda-bld/linux-64/mecab-0.996-1.tar.bz2

ようやく、anacondaレポジトリからあなたのパッケージをインストールできるようになりました。

$ conda install -c <your-anaconda-name> mecab

注: <your-anaconda-name>はあなたの anaconda.org のアカウント名に置換してください

CDSW上でPySparkからパッケージを使うには

前回の記事と同様にcondaの仮想環境を作ることで、C拡張のあるPythonライブラリをSparkクラスタ上で実行できるようにします。まずは、condaの仮想環境を作ります。

$ conda create --copy -q -y -c chezou -n mecab_env python=2 mecab

仮想環境を作成すると、以下のようなディレクトリ構成になります。

~/.conda/envs/mecab_env/
bin/
conda-meta/
etc/
include/
lib/
libexec/
share/
ssl/

$PREFIX をビルドスクリプトに適切に含めていれば、このcondaの仮想環境下に全ての依存コンポーネントが入ります。condaは --copy オプションを使うことで、シンボリックリンクを使うことなく依存関係を仮想環境の中にインストールします。これが、C拡張も含めてSparkクラスタに配布できる理由です。

Sparkクラスタへの配布の仕方は前回の記事を参考にしてください。

英語:Use your favorite Python library on PySpark cluster with Cloudera Data Science Workbench
日本語:Sparkクラスタ上で好きなPythonライブラリをCloudera Data Science Workbenchから使う

まとめ

condaレシピを作り仮想環境を配布することで、C拡張を含んだPythonパッケージをSparkクラスタの各ノードでインストールすることなく使うことができるようになりました。これによりCloudera Data Science Workbenchから、好きなPythonパッケージをクラスタの設定を変更することなく実行できます。

Data Science Workbenchについて詳しくは公式サイトをご覧ください。
また、日本語のウェビナーでデモをご覧になれます。