[EMR]EMR NotebooksでSparkSQLを使う方法

2018.12.11

こんにちは、平野です。

先日「EMR Notebooks」をご紹介しました。

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

このノートブック上でSparkSQLを使ってあれこれしようとした所、どうしてもうまくいきませんでした。 結果としてHiveをインストールしたクラスタであれば動作することがわかったので、その手順についてご紹介します。

NotebookClusterでの失敗例

まずはEMR Notebooksを起動する際に、「クラスタを作成」を選択して作られたクラスタ(以降「NotebookCluster」と呼びます)で、実際にエラーが発生する様子を確認します。 具体的なクラスタ起動の手順は こちらの記事 を参照してください。

クラスタが起動したらノートブックを開き、以下のようにS3からファイル読み込み、DataFrameの作成を試みます。

df = spark.read.csv("s3://path/to/file")
df.show()

すると残念ならが下記のようなエラーになってしまいます。

S3からの読み込みだけでなく、Notebookのサーバのローカルに持ってきたファイルであっても同様のエラーになってしまうようでした。

さて、エラーの内容を見てみると、Unable to instantiate (...)SessionHiveMetaStoreという文字列が見えます。 察するにHiveのインストールが必要そうに見えますが、起動したクラスタにインストールされているアプリケーションを確認すると「Spark」と「Livy」しかありません。

「じゃあ、このクラスタにHiveを追加インストールすればいい」と考えたくなりますが、この発想はEMRとはなじみません。 まず「EMR Notebooks」はサーバーレスのサービスですので、そもそもNotebookClusterのサーバにログインすることはできません。 また、EMRに限らず分散処理環境のクラスタでは全ワーカーノードに必要なアプリケーションをインストールしなくてはいけませんが、それはブートストラップ(クラスタ立ち上げ時の追加処理)を使うのがEMRでの流儀です。

ということで、NotebookClusterを立てる時にHiveもインストールするというのが正しい方法ではあるのですが、しかし、NotebookClusterを立てる場合にはそのような設定は行うことができません。 下のスクリーンショットにも書かれている通り、カスタマイズしたクラスタを使用するには別途クラスタをしておく必要があるようです。

Hiveがインストールされたクラスタを立てる

ということで、一旦Notebookから離れてSparkSQLを使用するのに必要十分なEMRのクラスタを立ち上げてみます。 クイックオプションではSparkとHiveの両方がインストールされる選択肢がないので、詳細オプションからクラスタを立ち上げます。
私は詳細オプションから立ち上げるのが初めてだったので、理解の定着も兼ねて手順を書いておきます。

以下、詳細オプションの設定は4ページあるので、便宜上Page1〜4とします。

Page1

「リリース」としては最新を選びつつ、「Hadoop」「Spark」「Hive」「Livy」を選びます。
ノートブックをクラスタにアタッチする際、下記のように、「Livy」のインストールも必須になっているようなので忘れずに選択してください。

Page2

VPC、サブネット、インスタンスタイプを設定します。

ここはデフォルトのままで良いかと思いますが、一点注意したいポイントがあります。 それは、デフォルトで選ばれているインスタンスタイプの「m3.xlarge」は、「ap-northeast-1d」のAZでは利用できないということです。 私はこれに気づかずに、あーでもないこーでもないと時間を浪費してしまいました。 サブネットを選択する際には必ず確認しましょう。

Page3

「クラスター名」と、ログ記録の「S3フォルダー」を設定しました。 お試しなら「削除保護」のチェックは外してしまって良いでしょう。

Page4

Page1でHiveのインストールを指定したので特にサーバにログインする必要はないはずですが、EC2キーペアは一応設定しておきます。 他は特に変更していません。

これにてクラスタの設定は完了です。

ノートブックの起動、アタッチ

上で起動した(起動を待っている状態でも良い)クラスタに対してノートブックをアタッチします。

「既存のクラスター」をChooseします。

先ほど起動させたクラスタを指定します(画像はまだ起動を待っている状態)。

アタッチが完了したら下記の画面になります。 前回の記事でも書きましたが、「クラスターの状態」が「待機中」になるまではSparkは使えませんので、それまでは「オープン」を押さずにじっとお待ちください。

動作確認

クラスタが起動したら(「待機中」になったら)ノートブックをオープンし、最初と同じコードを書いてテストします。

df = spark.read.csv("s3://path/to/file")
df.show()

今度はきちんとファイルが読まれて、df.show()で内容も表示されました。

まとめ

EMR Notebooksではノートブックを立ち上げるついでにEMRクラスタを立ち上げることができます。 しかし、そこで立ち上がるNotebookClusterはインストールするアプリケーションが選択できずHiveがインストールされないため、SparkSQLを使うことができないようです。
そこで、あらかじめHiveをインストールしたクラスタを起動し、そこにノートブックをアタッチした所、問題なく動作しているようでした。

EMR Notebooksはリリースされてから日も浅いので、まだ少し使うにはコツがいるという印象ですね。 しかしそこはAWSのことですから、これからどんどん使いやすい形に洗練されていくかと思います。 何か修正されたらまたブログにて発信できればと思います!