もう1年以上前の話になりますが、NetflixがSpark対応のScala用ノートブックPolynoteをOSS化したという話がありました。
既存のノートブックではScalaを使っていてもコード補完などがあまり効かないものが多く、まとまったコードを書くときは結局IDEを使うという感じになりがちなのですが、PolynoteはScalaを第一言語としてサポートする珍しいノートブックで、コード補完などの機能も充実しているようなので遅ればせながら試してみました。
インストール
Sparkを使う場合、まずは先にSparkをインストールしておく必要があります。とりあえずローカルモードで動かすだけであればSparkのリリースディストリビューションをダウンロードして適当なディレクトリに展開しておくだけでOKですが、Polynoteは内部的にspark-submit
コマンドを実行するので、最低限の設定としてSPARK_HOME/bin
ディレクトリを環境変数PATH
に追加しておく必要があります。
続いてPolynoteのリリースページからpolynote-dist.tar.gz
をダウンロードして適当なディレクトリに展開します。
必要なPythonライブラリをインストールしてからpolynote.py
を実行するとhttp://localhost:8192/でノートブックが起動します。
$ pip install -r requirements.txt $ ./polynote.py
Sparkを使うにはノートブックの設定でspark.master
を設定しておく必要があります(設定の変更後は「Save」もしくは「Save & Restart」をクリックして設定を反映する必要があります)。
使ってみる
ノートブックのセルにはMonaco Editorが使われており、確かにScalaのコード補完もばりばり効きますし、変数のインスペクションができたりと、Scala向けに作られているだけのことはあります。SparkのDataFrameだけでなくScalaのコレクションをプロットすることもできます。
これはSparkを使わなくてもちょっとしたScalaコードを動かしたりするのにいいかも…と思ったのですが、少し使っているとかなり編集がもっさりしてきてカーソルを動かすだけでも一瞬間が開いてしまう感じになってしまいました。
ローカルで動かしていたのでマシンスペックの問題もあるのかもしれませんが、ちょっとしたScalaコードを1セル内で編集しているだけでこのもっさり感だとちょっとPolynote上でScalaコードを編集するのは厳しいかもしれないという気がしました。機能的にはよさげなだけに勿体ないなぁという気持ちです。
Polynoteの実装について
PolynoteはScalaで書かれているようなので軽くコードも読んでみました。
Polynote、コード補完に必要なインデックスはClassGraphというライブラリを使って自前で集めているっぽい。あとはScalaコンパイラを使ってパースしたツリーの情報と組み合わせて補完候補を抽出している感じ。https://t.co/L14jlThxmT
— Naoki Takezoe (@takezoen) May 3, 2021
まだ正確に把握できてないけどSparkとの連携はPolynoteのLocalKernelをSpark上で動かすプログラムをspark-submitで送りつけてPolynote側で動いているRemoteKernelと通信するという感じっぽい。https://t.co/EMhlrQux7Y
— Naoki Takezoe (@takezoen) May 3, 2021
PolynoteのScalaコードは全部ZIOで書かれておりZLayerも使われている。HTTPサーバもjava.nioを使ったZIOベースのものをスクラッチしているというエクストリームっぷり。フロントエンドはTypeScriptだけどフレームワークは使わずにDOMで頑張っている。https://t.co/XFhyAD7GhL
— Naoki Takezoe (@takezoen) May 3, 2021
ちょっと変わったところだとSparkのScalaのバージョンにあわせてspark-submitする際のクラスパスを変更する処理があったりする。SparkのScalaのバージョンの取得方法が面白い。原始的だけどなるほどーという感じ。https://t.co/ZQxgUTckDE
— Naoki Takezoe (@takezoen) May 3, 2021
まとめ
Polynote、もうちょっとサクサク動くようになってほしい!