[新機能]EMR NotebooksでJupyterNotebookがサーバーレスで使用できるようになりました!

こんにちは、平野です。

EMRで立ち上げたクラスタ上でSparkを動かしてみよう、と思ってポチポチと作業を始めてみたのですが、先日社内チャットで「NotebookもAWSで立てられる」という話を見たのを思い出したので、その「EMR Notebooks」を試してみました。 ちなみにこの機能のリリースは2018/11/19だったようです。

Notebookを立ち上げるのにクラスタが必要?

Notebookを立ち上げるためには当然そのためのマシンが必要だろ、ということで「まずはクラスタを起動して」と思っていたのですが、その前になんとなく左のメニューの「Notebook」を開き、「「Notebookを作成」を選んでみると・・・

「クラスターを作成する」の選択肢が!

そう、EMR NotebooksでPySparkを使用する場合には、 「Notebookを立ち上げたいなー。じゃあまずはクラスタを作らないとな・・・」というのではなく 「Notebook立ち上げよ。あ、その時クラスタも必要だから、それもついでに作っといて」 という感じでクラスタを立ち上げることができるんです。

Notebookの立ち上げ。ついでにクラスタも

ということで、こちらの画面から必要な箇所の設定をしてNotebookを立ち上げます。ついでにクラスタも立ち上げます。

お試しなので、注目すべきは以下だけかと思います。

  • ノートブックの名前
    • デフォルト値がないので、適当に入力します。「MyNotebook-01」としました。
  • クラスターを作成する
    • 今回の目玉です。こちらを選びましょう。
  • インスタンス
    • 唯一にして最大の悩み所です。まずはデフォルトのまま、「m3.xlarge」を1つ、にしてみました。
  • ノートブックの場所
    • 作成するノートブックはS3上に保存されますので、保存するバケットを選択します。

最低限の設定は以上ですので「ノートブックの作成」で次へ進みます。

すると以下のような画面になり、5秒ほど待つと「オープン」がクリックできるようになりますので、これでJupyterNotebookが開きます。

見知った画面が出てきますので、あとはここでPySparkを動かしてと・・・

「sparkなんてない!!」と言われました。。

ここ、かなりハマりポイントかと思うのですが、「Notebookがオープンできるようになったからと言ってSparkが使用できるわけじゃない」のだそうです。

ここでちょっと冷静になって見ると、先ほど「ノートブック作成」のボタンを押してから5秒程度でノートブックが使えるようになりました。 しかし、これってEMRでクラスタが立ち上がるまでの時間に比べて圧倒的に短いです。 ということはまだクラスタは立ち上がってないのでは?
そう思って先ほどの画面を確認してみると、下部に「クラスターのステータス:開始中」というのが見えます。 「開始中」という日本語は曖昧ですが、これはまだクラスタの起動が完了していない状態を表しています。 やっぱりまだSparkは使えないんですね。

ということで、5分くらい待つと「クラスターのステータス:待機中」となります。 これまた表現が曖昧ですが、これがクラスタの起動が完了したサインですので、改めてノートブックを立ち上げます。 先ほど開いたノートブックはブラウザのタブを閉じて終了し、改めて「オープン」をクリックするのが確実なようです。

動作確認

今度はPySparkが使用可能になっているはずです。 普通のPySpark同様、最初から

  • sc = SparkContext
  • spark = SparkSession

は用意されていますので、まずはparallelizeで動作確認してみます。

PySparkが使える状態になった初回の実行時には下記のようにStarting Spark applicationという表示が現れ、1分くらい経過したのちにYARN_Application_IDなどが表示され、その後コーディングした処理が動きます。

上手くいきました。

次にファイルの入力ということで、S3に置いたファイルをtextFileで読み込んでみます。

こちらも問題ありませんね。 「▼Spark Job Progress」をクリックすると、進行中のジョブの状態を確認することもできます(画像はジョブ終了後の様子です)。 これは普通のJupyterにはない、EMR Notebooksの機能になります。 大きいデータを流していないのでまだ有り難みを享受できてはいませんが。。

クラスタからの情報の確認

マネジメントコンソールに戻って、クラスタの情報を見てみます。

クラスタを選択したあと「アプリケーションの履歴」タブを開くと、先ほど開始されたアプリケーションIDが「実行中」になっていることが確認できます。
ちなみにこの「実行中」というのは、Sparkのaction(collectとかsaveAsTextとか、実際にデータを読み書きする処理)が実行されている状態ではなく、Sparkを使用しているPythonが「実行中」という意味です。 collectなどの処理が終わっているのにずっと実行中と表示されますが、「何か見知らぬ処理が動いている!?」と早とちりすることのなきよう。もちろん私はしばらくこれに悩みました。

ノートブックとクラスタの削除

使い終わったらノートブックを削除します。 やり方は「削除」ボタンを押すだけです。 ノートブック一覧から「削除」でも良いです。

しかし、これで安心してはいけません。

ノートブックを削除してもクラスタは削除されませんので、忘れずにクラスタも削除しておきましょう。
ノートブックとクラスタは、今回たまたま同時に起動させただけで、それぞれ独立した存在です。 なのであくまでも新規作成したクラスタにノートブックをアタッチしているのだと考えた方が、クラスタの消し忘れがなくて良いかと思います。

一方で、一つのクラスタに対して複数のノートブックをアタッチすることも可能ですので、そのような用途ではそのままクラスタを使い回してもOKです。

保存されたノートブックの確認

ノートブックやクラスタを削除しても、保存した(自動保存されるのであまり意識しませんが)ノートブックは、最初に設定したS3のバケットに保存されています。

(Sparkが使えなくて試行錯誤した結果として死屍累々のノートブックの中に、先ほどの例で示したノートブックIDのものがありました)

終わりに

最初は普通にEMR場でSparkを使うだけのつもりでしたが、ちょうどよくリリースがあったので、EMRの新機能「EMR Notebooks」をご紹介しました。

正直、従来通りEMRクラスタを立ち上げてサーバ上でJupyterを実行するのと、作業量としては大しては変わらないです。 しかし、ユーザが「こういう処理をやりたい」と考えたところを起点として、

  1. こういう処理をやりたい
  2. Sparkで、ノートブック上でやるイメージが頭に浮かぶ
  3. ノートブックを立ち上げる

というように、「クラスタを立ち上げる」という本質ではない部分がほとんど完全に覆い隠されているということに感銘を受けました。 これがサーバーレスってやつかぁ、と感慨深いです。 そしてまた、EMRにとっては「クラスタの作成なんて造作もないことだ」という感覚が強烈にプッシュされていて、なんて恐ろしい子!な感じです。

S3にあるファイルをSparkで処理したいという時に、サッと処理を始められる方法として、機会があればお試し頂ければと思います。

参考情報