※筆者のような初心者レベルの記事です
SparkをJupyterで使いたい。
が、なんか環境構築がうまくいかない。最近の記事もない。
というかインストールはできたけどロクに動いてない。
環境変数も多分合ってる気がするんだけど、、、、これわっかんねー
となってしまった人向け。
スタート地点
- Jupyter、Python3、Spark(2.2.0)、Scala(2.11.8)、Sbt、JDK8、Dockerをインストール済み
- 非Anaconda
- JupyterでPython3が調子よく動いている
- spark-shellが調子よく動いている
- 筆者は怠け者の上、エンジニアリング力が低く、環境構築でよくギブアップしそうになる(する)<重要>
Notebookの選択肢
- Jupyter + Pyspark
- Zeppelin
- Jupyter + Toree
他にもありますがこの3つをやりました。
Jupyter + Pyspark
pip install pysparkで終わったはず。
MacとかPythonのきっちり動くパッケージマネージャは自分のようなザコにとって神に等しい存在です。
実務的にはこれで全然いいのですが、pysparkは、
- 今教科書にしたいと思っている本がscalaで書かれている
- scala使えるとなんかかっこいい気がする
といういかにもザコっぽい動機から一旦保留しました。
最終的はpyspark使う予定なんですが、scala触りたいので回り道をします。
Zeppelin
ここからだんだん本題です。
↓公式の記事まんまでよかったのですが、しょうもないところで時間を食いました。
つまずいたところ
localhost:8080をChromeで開いたとき、ERR_CONNECTION_REFUSEDになってZeppelinが表示されない。
(画面をきちんと見ていなかったため、CONNECTION_REFUSEDの文字に気づかず、「あ゛あ゛!?」ってなって、あれこれいじくり回していた)
InstallがSuccessで終わって、startとstopのときに、
Zeppelin start [ OK ]
Zeppelin stop [ OK ]
ってだけ出るようになったら知る限りちゃんと動いてます。
逆に環境変数とか下手にいじって怪我したときは、変なログがちょろっと出た。
解決策
Safariで開いたら動きました(ニッコリ
ザコなのでCONNECTION_REFUSEDに対応するという発想にはなりません。
ただ、Jupyterに比べてUIが使いづらいのと、foreach{println()}がなぜか出力されないので、Jupyter+Toreeに鞍替えしてみることにしました。
Jupyter + Toree
記事を書くことにした理由。
これですごく時間がかかってしまった。
つまずいたところ
記事を探すと、pip install toreeして、sudo jupyter toree install --replace --spark_home="xxx"しろってのがちょこちょこ見つかる。
その通りインストールするととりあえずJupyter上にscalaカーネルが登録されて、ノートブックが作れるようになる。
ノートブックを起動すると、kernel呼び出してます→Trustedってとりあえず出るんだけど、そのまま応答しないで以下のエラー。
- Java NoSuchMethodError(Hashset的なやつが見つからないらしい)
- からのワーニング: waiting timeout
で、オプション変えてみたり、環境変数変えてみたり、あれこれやって全然うまくいかず。
解決策
↓これが答えでした。自分でビルドしろとのこと。
記事内で紹介されているバグ報告
https://issues.apache.org/jira/browse/TOREE-336
pipで配布されるファイルが最新のspark/scalaに対応してないらしく、それを使う場合は今でも自分でmakeしないとダメだそうで。
というわけで、記事の通りにgitでクローンを持ってきて、Makefileを編集して自分でmakeします。
git clone git@github.com:apache/incubator-toree.git
ただ、Makefileはすでにspark/scalaの最新版に合わせて編集されていたので、やることなし。
(使用中のバージョンは、spark: 2.2.0、scala: 2.11.8)
APACHE_SPARK_VERSION?=2.2.0
SCALA_VERSION?=2.11
make release
makeの途中で「Jitpack.ioがないよエラー」が出ますが、これは無視してもうまいこと処理してくれました。
次に「Dockerのデーモンがいないよエラー」が出たので、これは出ないようにあらかじめDockerを起動してネットに繋いでから実行してください。
最後に「jovyanの権限がねーと必要なディレクトリにアクセスできんぞエラー」と「お前んとこのpipのバージョン古いんじゃねーのエラー」が出ます(多分Docker側の話だと思う)。
最後の最後でエラーかいという気持ちと、ジョブヤン誰という気持ちをひとまず抑えて、インストール用ファイル dist/toree-pip/toree-x.x.x.dev1.tar.gz が生成されていることを確認すると、問題なく生成されていると思うので、これをインストールして終わりです。
pip install dist/toree-pip/toree-x.x.x.dev1.tar.gz
Jupyterを起動するとscalaカーネルが登録されています。
適当にval作ってprintlnしたり、テキストデータをRDDにしたり、DataFrameにしたり、filterしたりmapしたりという操作ができることを確認しました。
(クラスタ云々については確認していません。)
微妙なところ
こうしてひとまず使える状態になったのですが、やっぱりZeppelinと同じで、foreach{println()}がなぜか出力されませんでした。
(対処法をご存知の方がいたら、コメントをいただけるとうれしいです )
後日追記
printはコンソール側に出力されることがわかりました。
↓あと、ここらへんが微妙にうまくいってませんでした。起動直後に「sc」を実行したときの出力とか。
こっちは困るまでは放置かなー。
おわりに
というわけで自分はJupyter+Toreeを動かすのにやたらと苦戦したので、(内容的には恥ずかしいレベルだと思いますが)同じような面倒に合う人が減ればいいなと思いメモを残しました。
それではみなさま快適な Spark/Jupyter 生活をお送りください。