zeppelin_classic_logo

先日、EMRのバージョン5.0.0がリリースされ、Zeppelinから「Sandbox」の文字が外されました。
ということで、Amazon Elastic MapReduce上のZeppelinのConfiguration方法について解説してみます。

NotebookをS3に保存する例

これだけで分かる人も多いと思うので、まずは手っ取り早く具体例から。

[
  {
    "Classification": "zeppelin-env",
    "Configurations": [
      {
        "Classification": "export",
        "Configurations": [],
        "Properties": {
          "ZEPPELIN_NOTEBOOK_STORAGE": "org.apache.zeppelin.notebook.repo.S3NotebookRepo",
          "ZEPPELIN_NOTEBOOK_S3_BUCKET": "YOUR_S3_BUCKET",
          "ZEPPELIN_NOTEBOOK_S3_USER": "YOUR_USER_NAME"
        }
      }
    ],
    "Properties": {}
  }
]

解説

Configuring Applications | AWS Documentation に従って設定用JSONを作成し、クラスタ起動時にCLIまたはマネジメントコンソールから指定することで、EMR上の各アプリケーションの設定を変更することができます。

上記ページ中にある Configuration Classifications が設定できる項目の一覧になります。
capacity-scheduler の用に備考欄に Change values in Hadoop's capacity-scheduler.xml file. とある通り、本来の設定ファイルのいずれに対応しているか明言されているものは良いのですが、 zeppelin-env の場合は Change values in the Zeppelin environment. とあり、一体どの設定ファイルに対応して、どういう形式で書けば良いのか初見では分かりにくいですよね……)

zeppelin-env は、本来の設定ファイル zeppelin-env.sh に対応しています。
このシェル中では、下記のように設定するため、最初の例にある通り Configurations でネストさせる形で記述する必要があります。

export ZEPPELIN_NOTEBOOK_STORAGE = org.apache.zeppelin.notebook.repo.S3NotebookRepo
export ZEPPELIN_NOTEBOOK_S3_BUCKET = YOUR_S3_BUCKET
export ZEPPELIN_NOTEBOOK_S3_USER = YOUR_USER_NAME

良くある間違い(私もやりました…)としては、 zeppelin-site.xml の設定に従うのかと思い、下記のように記述してしまうケースですが、こちらは反映されません。

[
  {
    "Classification": "zeppelin-env",
    "Configurations": [],
    "Properties": {
      "zeppelin.notebook.storage": "org.apache.zeppelin.notebook.repo.S3NotebookRepo",
      "zeppelin.notebook.s3.bucket": "YOUR_S3_BUCKET",
      "zeppelin.notebook.s3.user": "YOUR_USER_NAME"
    }
  }
]

反映されない設定項目達

Apache Zeppelin | AWS Documentation に下記のような記述があります。

Zeppelin does not use some of the settings defined in your cluster’s spark-defaults.conf configuration file (though it instructs YARN to allocate executors dynamically if you have enabled that setting). You must set executor settings (such as memory and cores) on the Interpreter tab and then restart the interpreter for them to be used.

つまり、EMR上のZeppelinでは、Sparkのメモリやコアの設定などの一部の設定については、spark-defaults.confから設定を引き継がないようになっています。
ZeppelinのInterpreter設定から設定する必要があるようです。