EMR上のJupyter4.xからPySparkを使ってみた


Amazon EMRで立ち上げたSparkクラスタにJupyterを入れて
その上でPySparkを使う際に、詰まった点の対処法まとめ。

EMR立ち上げ

今回は検証用で

アプリケーション : All Applications: Hadoop 2.6.0, Hive 1.0.0, Hue 3.7.1, Mahout 0.11.0, Pig 0.14.0, and Spark 1.5.0
インスタンスタイプ : m3.xlarge
インスタンス数 : 1台
アクセス権限 : デフォルト

を用意。

Hueを入れる場合は、Hueが8888ポートを使用するため
Jupyterが8888ポート(デフォルト)を使用できなくなる。
その場合は、PCからアクセスできるように
セキュリティグループで穴をあける。

Python2.6 -> Python2.7へ

EMRで起動したEC2は、Pythonのバージョンが2.6.9なので、2.7に変更する。
元々2.7はインストールされているため、リンク先を変えるだけ。

sudo unlink /usr/bin/python
sudo ln -s /usr/bin/python2.7 /usr/bin/python

pip2.6 -> pip2.7へ

pipはアップグレードをして、リンク先を変更。

sudo pip install -U pip
sudo ln -s /usr/bin/pip-2.7 /usr/bin/pip

Jupyterのインストール

現在(2015年10月)だと、Jupyter4.0.6がインストールされる。

sudo pip install jupyter

Jupyterの起動

jupyter-notebook

プロファイルの作成について

テンプレート設定ファイルを作成(出力先は~/.jupyter/jupyter_notebook_config.py)

jupyter notebook --generate-config
~/.jupyter/jupyter_notebook_config.py
c = get_config()

c.NotebookApp.ip = '*'
c.NotebookApp.open_browser = False
c.NotebookApp.port = 8888

Hueを入れた場合は、c.NotebookApp.portに
セキュリティグループであけた8888以外のポートを設定。

profileというものはJupyter4.Xから、なくなったみたい?
configオプションを使えば、設定ファイルを指定できる。
例)

jupyter-notebook --config='~/.ipython/profile_nbservers/ipython_config.py'

環境変数のJUPYTER_CONFIG_DIRにディレクトリパスを指定すれば
そのディレクトリ内のjupyter_notebook_config.pyを読み込むようになる。

Jupyter上でSparkを使えるようにする

spark.masterをyarnからlocalに変更。
(これをしないと、SparkContextが止まってしまっていた)

/usr/lib/spark/conf/spark-defaults.conf
# spark.master yarn
spark.master local

前は、~/.ipython/profile_<profile名>/startup/00-<profile名>-setup.pyで
Sparkの準備をしていたものの、それもできなくなったため
Jupyter Notebook上で以下のコマンドを実行している。

export SPARK_HOME='/usr/lib/spark'
import os
import sys

spark_home = os.environ.get('SPARK_HOME', None)
if not spark_home:
    raise ValueError('SPARK_HOME environment variable is not set')
sys.path.insert(0, os.path.join(spark_home, 'python'))
sys.path.insert(0, os.path.join(spark_home, 'python/lib/py4j-0.8.2.1-src.zip'))

execfile(os.path.join(spark_home, 'python/pyspark/shell.py'))

ファイルにして読み込みでも良いかも。