CUBE SUGAR CONTAINER

技術系のこと書きます。

PySpark: Jupyter Notebook からローカルの PySpark ドライバを操作する

今回はローカルで動作している PySpark のドライバプログラムを Jupyter Notebook から操作する方法について。 ようするに Jupyter Notebook と PySpark (のドライバ) が同じマシン上で動く場合ということ。 この場合の設定内容はとてもシンプルで、環境変数を書き換えるだけで使えるようになる。

これがもし Jupyter Notebook と PySpark のホストが分かれていると、もうちょっと複雑になる。 具体的には Apache Ivy と SparkMagic というソフトウェアを連携させないといけない。 それについては今後改めて書くつもり。

使った環境は次の通り。

$ cat /etc/redhat-release
CentOS Linux release 7.4.1708 (Core)
$ uname -r
3.10.0-693.11.1.el7.x86_64
$ pyspark --version
Welcome to
      ____              __
     / __/__  ___ _____/ /__
    _\ \/ _ \/ _ `/ __/  '_/
   /___/ .__/\_,_/_/ /_/\_\   version 2.2.1
      /_/
                        
Using Scala version 2.11.8, OpenJDK 64-Bit Server VM, 1.8.0_161
Branch 
Compiled by user felixcheung on 2017-11-24T23:19:45Z
Revision 
Url 
Type --help for more information.
$ python3 -V
Python 3.6.4

ドライバのホストに Jupyter Notebook をインストールする

まずは PySpark のドライバを動かしているホストに Jupyter Notebook をインストールする。 どうせ後から必要になるので pandas とかも入れておくと良いかも。

$ sudo pip3 install jupyter pandas

PySpark が Jupyter Notebook を起動するように環境変数を設定する

続いては PySpark を使うときインタプリタとして Jupyter Notebook を使うように環境変数を設定する。

$ cat << 'EOF' >> ~/.bashrc
export PYSPARK_PYTHON=/usr/bin/python3
export PYSPARK_DRIVER_PYTHON=jupyter
export PYSPARK_DRIVER_PYTHON_OPTS='notebook' pyspark
EOF
$ source ~/.bashrc

後は通常通り PySpark を起動すれば、同時に Jupyter Notebook が使えるようになる。 この環境では YARN を使って Spark クラスタを構築した。 そのため --masteryarn を指定している。

$ pyspark --master yarn

あとはブラウザで Jupyter Notebook が動作している場所を開くだけ。

$ open http://localhost:8888

PySpark のドライバがリモートで動作している場合

作業しているホストがローカルホストでないときは PYSPARK_DRIVER_PYTHON_OPTS で Listen するアドレスを指定する。 任意のアドレスで Listen するときは、次のように --ip0.0.0.0 を指定する。

$ cat << 'EOF' >> ~/.bashrc
export PYSPARK_PYTHON=/usr/bin/python3.6
export PYSPARK_DRIVER_PYTHON=jupyter
export PYSPARK_DRIVER_PYTHON_OPTS='notebook --ip=0.0.0.0' pyspark
EOF

先ほど紹介したのと同じように起動する。

$ pyspark --master yarn

起動するとコンソールにトークンを含む URL が表示されるはず。

表示された URL を、必要に応じて IP アドレス部分を書き換えたらブラウザで開くだけ。

$ open http://192.168.33.10:8888/?token=XXXXX...

動作確認

Jupyter Notebook の画面が開いたら新しいノートブックを作成して、ちゃんと PySpark が動くか確認しよう。

例えば SparkContext がちゃんと使えるか、とか。

In:
sc

Out:
SparkContext

Spark UI

Version
v2.2.1
Master
yarn
AppName
PySparkShell

分散処理の部分がちゃんと動くかを確かめるためにワードカウントしてみたりね。

In:
rdd = sc.parallelize(['A', 'B', 'C', 'A'])
keyvalues = rdd.map(lambda x: (x, 1))
counts = keyvalues.reduceByKey(lambda a, b: a + b)
counts.collect()

Out:
[('A', 2), ('B', 1), ('C', 1)]

いじょう。

入門 PySpark ―PythonとJupyterで活用するSpark 2エコシステム

入門 PySpark ―PythonとJupyterで活用するSpark 2エコシステム