Sparkling water on Hortonworks Sandbox

# はじめに

Azureで提供されているHortonworks Sandbox上で[Sparkling Water](https://github.com/h2oai/sparkling-water)をセットアップし、H2O Flow上でDeep LearningによるMNISTのモデル構築をしてみます。

なお、手元の環境は MacBook Air(Mac OS X El Capitan)です。


# AzureでのHortonworks Sandboxのセットアップ

まずこちらの[kkitaseさんの記事](http://qiita.com/kkitase/items/1d2e4662c2e8c9b0fd59)を参考に、AzureでHortonwork Sandboxをセットアップします。
仮想マシンのサイズは小さすぎるとアプリケーションを実行することができませんのでご注意を。今回はDS3_V2でプロビジョニングしました。

![Screenshot of Google Chrome (2016-12-19 2-59-45).png](https://qiita-image-store.s3.amazonaws.com/0/4110/850298bd-ece6-06fc-2222-e97bbee2f4d6.png)

仮想マシンの起動が完了したらまず`http://<sandbox-public-ip>:8888/`へアクセスし、必要事項を記入してTerms of Useへの同意にチェックをしてSubmitします。

次に、sshでサーバへアクセスしてAmbariの管理者パスワードを設定します。以下は.ssh/configの設定例です。

```:.ssh/config
Host *.azure
    User hssh
    UserKnownHostsFile /dev/null
    StrictHostKeyChecking no
    PasswordAuthentication no
    IdentitiesOnly yes
    LogLevel ERROR
    IdentityFile ~/.ssh/id_rsa
    ProxyCommand nohup ssh localhost -W $(echo %h | sed s/\\.azure//):%p
```

Azureのsandbox環境にログインし、`ambari-admin-password-reset`コマンドを実行してAmbari管理者のパスワードを設定します。

```shell-session
local$ ssh <sandbox-public-ip>.azure
sandbox$ sudo ambari-admin-password-reset
Please set the password for admin:
Please retype the password for admin:

中略

Waiting for server start....................
Ambari Server 'start' completed successfully.
```

パスワードが設定できたら`http://52.185.151.244:8080/`へアクセスし、`admin`ユーザとして先ほど設定したパスワードでログインします。左のメニューから`YARN`を選択し、`Configs`タブでNodeに割り当てるメモリ(`yarn.nodemanager.resource.memory-mb`)を`8GB`に設定しSaveボタンをクリックして反映します。反映時に依存する設定項目の推奨値が提示されるのでそのままOKをクリックします。

![Screenshot of Google Chrome (2016-12-19 3-24-43).png](https://qiita-image-store.s3.amazonaws.com/0/4110/dde07d23-756a-8652-2352-0f12dc0ba68e.png)

![ss001.png](https://qiita-image-store.s3.amazonaws.com/0/4110/3867a186-b537-eaa1-e6c7-05b9e5dbddf7.png)

反映後、再起動の必要なサービスのメニュー横にアイコンが表示されるので、各サービスを再起動します。

![Screenshot of Google Chrome (2016-12-19 3-37-40).png](https://qiita-image-store.s3.amazonaws.com/0/4110/2920bd5f-6d2a-c483-126f-6eb7ce2224ef.png)


# Sparkling Waterのインストール

Sandbox環境にsshでログインし、wgetでSparkling Waterのzipアーカイブをダウンロード・展開します。

```shell-session
local$ ssh <sandbox-public-ip>.azure
sandbox$ wget http://h2o-release.s3.amazonaws.com/sparkling-water/rel-1.6/8/sparkling-water-1.6.8.zip
sandbox$ unzip sparkling-water-1.6.8.zip
```

`HADOOP_CONF`を設定し、spark-submitでSparkling Waterをデプロイします。

```shell-session
sandbox$ export HADOOP_CONF_DIR=/etc/hadoop/conf
sandbox$ spark-submit --class water.SparklingWaterDriver --master yarn-client --num-executors 3 --driver-memory 1g --executor-memory 1g --executor-cores 1 sparkling-water-1.6.8/assembly/build/libs/*.jar
16/12/18 18:51:10 INFO REPLClassServer: Directory to save .class files to = /tmp/spark-c4c1570e-c560-411a-97b5-bb762a880d5b
16/12/18 18:51:11 WARN NativeCodeLoader: Unable to load native-hadoop library for your platform... using builtin-java classes where applicable

中略

Sparkling Water Context:
 * H2O name: sparkling-water-hssh_-1726962807
 * cluster size: 3
 * list of used nodes:
  (executorId, host, port)
  ------------------------
  (2,sandbox.hortonworks.com,54323)
  (3,sandbox.hortonworks.com,54321)
  (1,sandbox.hortonworks.com,54325)
  ------------------------

  Open H2O Flow in browser: http://<sandbox-local-ip>:<port> (CMD + click in Mac OSX)
```

これでSparklink Waterが起動し、`http://<sandbox-local-ip>:<port>`へアクセスすることでブラウザからWeb UIを利用することができるようになりました。なお、起動中に下記のようなエラーが表示された場合は、前述したYARNでのNodeへの割り当てメモリ設定がうまくいっていない可能性があります。

```
Initial has not accepted any resources; check your cluster UI to ensure that workers are registered and have sufficient memory
```

Sparkling Waterのログに出力されたURLはローカルIPになっているため、sshのPortForwardingなどを利用するか、もしくは[sshuttle](https://github.com/apenwarr/sshuttle)というssh proxyなどを利用してアクセスする必要があります。sshuttleを利用する場合は下記のように実行します。

```shell-session
local$ sshuttle --dns -r <sandbox-public-ip>.azure <sandbox-local-ip>
```

これで先ほどのspark-submitのログに表示されていたURL`http://<sandbox-local-ip>:<port>/`にアクセスすると、H2O Flowの画面が表示されます。

![ss002.png](https://qiita-image-store.s3.amazonaws.com/0/4110/078b6b6c-15d6-9475-2354-36303195b93a.png)


# H2O FlowによるMNIST

起動したH2O Flowを使ってMNISTのサンプルを実行してみます。Web UIの右カラムにある`view example Flows`をクリックして`DeepLearning_MNIST.flow`を選択し、Notebookをロードします。

![Screenshot of Google Chrome (2016-12-19 4-15-34).png](https://qiita-image-store.s3.amazonaws.com/0/4110/15b12ac9-3a7d-23e7-c954-777a7b3e0e08.png)

![Screenshot of Google Chrome (2016-12-19 4-15-21).png](https://qiita-image-store.s3.amazonaws.com/0/4110/2027bb6c-763e-8fc5-5895-95807c5ae128.png)

![Screenshot of Google Chrome (2016-12-19 4-19-18).png](https://qiita-image-store.s3.amazonaws.com/0/4110/70108333-ac2a-c75a-9eb9-570d16b25680.png)

メニューのRun AllボタンをクリックするとNotebookの内容が一通り実行されます。このあたりの操作はSandboxに含まれるZeppelinとほぼ同様です。

![Screenshot of Google Chrome (2016-12-19 4-20-04).png](https://qiita-image-store.s3.amazonaws.com/0/4110/1856a181-b8b7-cd81-937c-0738e0500c65.png)

実行が完了すると、Resultsセクション以下に実行結果のグラフ及びメトリクスをまとめた表が出力され、学習したモデルの詳細について確認することができます。

![Screenshot of Google Chrome (2016-12-19 4-34-48).png](https://qiita-image-store.s3.amazonaws.com/0/4110/3d2152fb-e7db-d205-602e-069121ab86fa.png)
![Screenshot of Google Chrome (2016-12-19 4-35-09).png](https://qiita-image-store.s3.amazonaws.com/0/4110/37e500d8-b998-8aa0-8a1e-477b5dfd1f55.png)


# まとめ

Hortonworks Sandbox上にSparkling Waterをセットアップし、Web UI上からMNISTのサンプルを実行できるところまでを確認しました。Sparkで利用できるDeep Learning　Frameworkとしては、他にもCaffe on SparkやTensorflow on Spark、DeepLearning4Jなどがありますが、最もセットアップの敷居が低く、開発も継続的に進められているのがこのSparkling Waterという印象でした。