once upon a time,

Iris Tradをビール片手に聞くのが好きなエンジニアが、機械学習やRubyにまつわる話を書きます

JupyterからSpark clusterを操作できるlivy + sparkmagicを試してみた

Spark Summit 2016でもトークがあったSparkのREST serverであるlivyですが、MicrosoftがHDInsight上のSpark clusterとJupyterをlivyを使って繋げられるようにしたと聞いて、早速試してみました。

Jupyterって何?という方は簡単に言うと、ブラウザで各種言語のREPLが動くものと思ってもらえばいいです。 詳細は過去に書いた以下の記事を読んでみてください。

techlife.cookpad.com

livyとは

livyはSpark clusterをコントロールするためのREST Serverです。 Microsoftはこれとjupyter notebookのsparkmagicを使ってHDInsightとjupyterをつなげるようにしているそうです。

MSの取り組みはSpark Summit 2016のトークがわかりやすいです。 Livy: A REST Web Service For Apache Spark | Schedule | Spark Summit 2016

このsparkmagicの構成図がわかりやすいですね。

https://github.com/jupyter-incubator/sparkmagic/raw/master/screenshots/diagram.png

なぜlivyがいるのか?

Sparkは通常gatewayにつないで処理をするが、ユーザー管理は通常のHadoopと同じ形になります。つまり、localにsparkユーザーみたいなのが必要とかになってちょっと面倒。 とはいえ、jupyter server立ててそこのユーザーと同期するというのも面倒くさい。 livyを使えばREST server経由でSparkの処理を行うことが可能になります。

livyのサイトで言われている利点としては以下のとおりです。

  • 複数のSpark job、複数のクライアントから使える長時間動くSparkContextを持てる
  • cacheしたRDDやDataFramesを複数のジョブやクライアントで共有できる
  • 複数のSparkContextを同時に管理でき、YARN/Mesosで動くクラスターがLivy Serverの代わりにfault toleranceとconcurrencyを実現する
  • JobはprecompileされたjarやコードスニペットJava/Scala client API経由でsubmitされる
  • Apache Licenseで100% オープンソース

それだけだと僕にはあまり嬉しさがわかりにくかったのですが、手元で管理したJupyterと繋げられるようになるというのが個人的には最大のヒットでした。 Jupyterはcookpadのblogにも書きましたが、データエンジニアリングや機械学習系の取り組みをメモして共有するのにはとても便利なので、クラスターのSparkがあたかもlocalにあるように操作できるのはとてもありがたいですね。

予め用意するもの

準備

重要なレポジトリは以下の2つ。

まずはlivyからいれていきます。

Rをインストールする

requirementsに書かれているので一応用意しました。

$ sudo yum install -y epel-release
$ sudo yum install -y R

livyをbuildする

$ git clone git@github.com:cloudera/livy.git
$ cd livy
$ mvn -Dspark.version=1.6.0 -DskipTests clean package

今回試した時はtestがこけたので、-DskipTestsをつけました

livyを起動する

今回はCloudera Manager経由でsparkを入れたので、環境変数をこんな感じでセットします。

$ export SPARK_HOME=/opt/cloudera/parcels/CDH-5.7.1-1.cdh5.7.1.p0.11/lib/spark
$ export HADOOP_CONF_DIR=/etc/hadoop/conf

livy.confに以下の1行を追加しないとYARN modeで起動しない

livy.server.session.factory = yarn

ここまでできたら、livy serverを起動します

$ ./bin/livy-server

別のterminalで動作確認をする

$ curl localhost:8998/sessions
{"from":0,"total":0,"sessions":[]}

デフォルトで8998番のportが使われるので、必要に応じてportを開けるなりsshでport forwardingしてください。

jupyter側のsparkmagicの準備

sparkmagicにあるとおりにinstallします。

$ pip install sparkmagic
$ jupyter nbextension enable --py --sys-prefix widgetsnbextension 

wrapper kernelを入れます。 pip show sparkmagicのLocation以下で実行します。以下の場合だと /Users/ariga/.virtualenvs/ibis/lib/python3.5/site-packages になります。

$ pip show sparkmagic
---
Metadata-Version: 2.0
Name: sparkmagic
Version: 0.2.3
Summary: SparkMagic: Spark execution via Livy
Home-page: https://github.com/jupyter-incubator/sparkmagic/sparkmagic
Author: Jupyter Development Team
Author-email: jupyter@googlegroups.org
Installer: pip
License: BSD 3-clause
Location: /Users/ariga/.virtualenvs/ibis/lib/python3.5/site-packages
Requires: ipywidgets, pandas, ipython, requests, mock, autovizwidget, numpy, nose, ipykernel, notebook, hdijupyterutils
Classifiers:
  Development Status :: 4 - Beta
  Environment :: Console
  Intended Audience :: Science/Research
  License :: OSI Approved :: BSD License
  Natural Language :: English
  Programming Language :: Python :: 2.6
  Programming Language :: Python :: 2.7
  Programming Language :: Python :: 3.3
  Programming Language :: Python :: 3.4
$ cd /Users/ariga/.virtualenvs/ibis/lib/python3.5/site-packages
$ jupyter-kernelspec install sparkmagic/kernels/sparkkernel
$ jupyter-kernelspec install sparkmagic/kernels/pysparkkernel

~/.sparkmagic/config.jsonexampleをもとに入れます。

jupyter notebookの起動

起動する前に、curlでlocalからlivyに通信できるか確認しましょう。

$ curl YOUR_HOSTNAME:8998/sessions

jupyter notebookでいつもどおり起動をしてPySparkを選べばOK

notebookの例はこちら

gist.github.com

gistには出てませんが、こんな感じでSparkに対してSQLで処理した結果を簡単にvisualiseできます。sparkmagicすごい!

f:id:chezou:20160712155306p:plain

%%localでlocalのcontextに行ったりするのがまだなれないですが、magic commandの %%sqlで実行した結果をDataFrameで受け取れたりと、いろいろ便利そうです。

参考URL