「Amazon EMR クラスターでホストされているウェブサイトの表示」(とSparkのデバッグ)

# はじめに
EMR上で、SparkをYarn-clusterで動かしていると、「Exception in thread "main" org.apache.spark.SparkException: Application finished with failed status...」などと抽象的なエラーが出て、苛立つことがあるかと思います。

まあ、Masterノード上では「なんかエラー吐いた」ってことしかわからなくて、詳細は実際にそれ実行したノードで見てねって話なんですけど。

その辺の細かい情報、Yarn上で実行したアプリケーションのstdout, stderrなどは、EMRクラスタ上のMasterノードにホストされている、HadoopのResource Manegerからリンクをたどっていけば見れるわけですが、lynxでターミナル上でそれを見るのは正直苦行ですね。。。

あと、Gangliaというクラスタへの負荷状況が見れるアプリケーションがEMRの作成時に追加インストール可能ですが、これを確認するのはlynxではまあ無理です。

ということで、普通のWebブラウザで見たいわけですが、それには一手間必要です。具体的には以下のドキュメント。

[Amazon EMR クラスターでホストされているウェブサイトの表示](http://docs.aws.amazon.com/ja_jp/ElasticMapReduce/latest/DeveloperGuide/emr-web-interfaces.html)

0. ローカルマシンのSSHクライアントを、ポートフォワードするモード(Socks: port8157)で待ち受けしておく
1. ローカルマシンのブラウザから、FoxyProxyを使って、EMRクラスタへのWeb接続要求をlocalhostのSocks: port8157へ送る
2. port8157にWeb接続要求が来たら、「ローカルマシン」と「EMRクラスタ」の間を「**SSHトンネリング(ポートフォワード)**」でつないで、要求をフォワードする

すると、EMRクラスタのWeb UI見れますよって話です。

以下では、主にWindowsでの設定手順を書いておきます。

# Steps

## ブラウザの設定

### FoxyProxyのインストール

まあブラウザの設定でsocksを設定してもいいのですが、ここではAWSのチュートリアルに従って、Firefoxのアドオン「FoxyProxy」を使います。

Firefoxで、以下からインストール
[FoxyProxy](https://addons.mozilla.org/ja/firefox/addon/foxyproxy-standard/)

### foxyproxy-settings.xmlを作成

AWSのドキュメント「[オプション 2、パート 2: マスターノードでホストされるウェブサイトを表示するようにプロキシを設定する](http://docs.aws.amazon.com/ja_jp/ElasticMapReduce/latest/DeveloperGuide/emr-connect-master-node-proxy.html)」に、EMRクラスタへの接続に便利な設定が乗っているので、これをインポートすることでFoxyProxyの設定をします。

`foxyproxy-settings.xml`というファイルをUTF8で作って、中身を以下のようにします。

```xml:foxyproxy-settings.xml
<?xml version="1.0" encoding="UTF-8"?>
<foxyproxy>
   <proxies>
      <proxy name="emr-socks-proxy" id="2322596116" notes="" fromSubscription="false" enabled="true" mode="manual" selectedTabIndex="2" lastresort="false" animatedIcons="true" includeInCycle="true" color="#0055E5" proxyDNS="true" noInternalIPs="false" autoconfMode="pac" clearCacheBeforeUse="false" disableCache="false" clearCookiesBeforeUse="false" rejectCookies="false">
         <matches>
            <match enabled="true" name="*ec2*.amazonaws.com*" pattern="*ec2*.amazonaws.com*" isRegEx="false" isBlackList="false" isMultiLine="false" caseSensitive="false" fromSubscription="false" />
            <match enabled="true" name="*ec2*.compute*" pattern="*ec2*.compute*" isRegEx="false" isBlackList="false" isMultiLine="false" caseSensitive="false" fromSubscription="false" />
            <match enabled="true" name="10.*" pattern="http://10.*" isRegEx="false" isBlackList="false" isMultiLine="false" caseSensitive="false" fromSubscription="false" />
            <match enabled="true" name="*10*.amazonaws.com*" pattern="*10*.amazonaws.com*" isRegEx="false" isBlackList="false" isMultiLine="false" caseSensitive="false" fromSubscription="false" />
            <match enabled="true" name="*10*.compute*" pattern="*10*.compute*" isRegEx="false" isBlackList="false" isMultiLine="false" caseSensitive="false" fromSubscription="false" />
	  </matches>
         <manualconf host="localhost" port="8157" socksversion="5" isSocks="true" username="" password="" domain="" />
      </proxy>
   </proxies>
</foxyproxy>
```

要点は、「Port: 8157のsocksに」「ec2とかaws.comとかいうドメイン名のWeb接続要求を飛ばす」って設定を「emr-socks-proxy」って名前で保存するよことですね。

### FoxyProxyの設定

FireFoxのツールメニューにFoxyProxyが現れていると思うので、オプションを選びます。
![foxyproxy1 - コピー.png](https://qiita-image-store.s3.amazonaws.com/0/69525/bbbeb0ef-7ce8-5d97-1077-737d27c550f0.png)

「ファイル」メニュー -> 「Import Setting」で、先ほどつくった`foxyproxy-settings.xml`を取り込みます。
![foxyproxy3 - コピー.png](https://qiita-image-store.s3.amazonaws.com/0/69525/4af33e35-86ee-cc62-cf3d-ee24e550bc72.png)

emr-socks-proxyという名前で設定が出来てれば成功。ブラウザ側の設定は以上です。

## SSHの設定

### SSHクライアント: Rlogin

WindowsでEC2につないでる方は、puttyを使っているんでしょうか。正直、鍵ファイルをppkに変換しろとか面倒なので、個人的にはRLoginをつかっています。

[Nanno Home Page - RLogin](http://nanno.dip.jp/softlib/man/rlogin/)

### SSHトンネリング (ポートフォワード)の設定

RLoginの場合は、起動すると「Server Select」が空の状態で立ち上がると思いますが、「新規」を押して、以下を入力。

![rlogin1 - コピー.png](https://qiita-image-store.s3.amazonaws.com/0/69525/70819754-f568-6bcc-e83b-7e4e43f11e42.png)

0. エントリー: 適当に接続名を入力(ここでは「EMR Tunnel」としておきました)
1. Server Address: EMRクラスタのMaster Nodeのアドレス
2. User Name: hadoop
3. SSH Identity key: 参照ボタンを押して.pemファイルを選択
4. 最後に、左側のメニューの「サーバ」 -> 「プロトコル」を押して、詳細設定ページへ

![rlogin2 - コピー.png](https://qiita-image-store.s3.amazonaws.com/0/69525/a3d568a7-ce0c-654d-63fc-9b9ea13a38a7.png)

0. 「ポートフォワード」ボタンを押す
1. 「新規」を押す
2. Listernedの設定を「Local Socks」「localhost: 8157」で設定
3. Connectの方は空で。
4. 「ポートフォワードのみを行う」にチェックするかどうかはお好み次第

RLoginを使ってない人はトンネリングかポートフォワードの設定を探して、適宜読み替えてください。

# 実際に接続してみる

## SSHクライアントでEMRクラスタに接続して、socksの待ち受けをする

普通にSSHでつなぐのと同じく、SSHクライアントで先ほど作った接続設定を選んで「接続」ボタンを押します。

なお、「ポートフォワードのみを行う」を選択していると、コマンド入力を受け付けない待ち受けモードになって、SSHトンネリングしてるlogがコンソールに出てくる形になります。つながり具合が見えるんで私はそれでやってますね。

(同時にコマンドも打ちたい場合はポートフォワードしない接続設定を作っておいて、それを別窓を立ち上げる形になりますが)

## FireFoxでプロクシ設定をOnにする
FireFoxの「ツール」メニューより、先ほど作った設定を選べばよろしです
![foxyproxy4 - コピー.png](https://qiita-image-store.s3.amazonaws.com/0/69525/05d6565e-6490-1fb4-a0da-7c495ef0613e.png)

## HadoopのResourceManagerに接続する

この状態で、Firefoxから「http://[master-public-dns-name]:9026/」につなぐと、HadoopのResourceManagerが見えるはず。

![hadoopui1 - コピー (2).png](https://qiita-image-store.s3.amazonaws.com/0/69525/4c45e01c-ea19-a4f4-49ea-afbf57bf0c5b.png)


application_idのところをクリックして、logをみてみる
![hadoopui2 - コピー.png](https://qiita-image-store.s3.amazonaws.com/0/69525/a70598dd-1519-deeb-9fc4-7ec596d8ca2a.png)

stderr, stdoutが見れますね
![hadoopui3 - コピー.png](https://qiita-image-store.s3.amazonaws.com/0/69525/c3b6865e-6bcd-ba28-17db-eb4eee689994.png)

stdoutがこんな感じで。コード内のprintlnはここに出てきます。
![hadoopui4 - コピー.png](https://qiita-image-store.s3.amazonaws.com/0/69525/ac1304b2-fa6f-55a2-6336-841d47aacb4c.png)

後はprintlnデバッグでもしつつ、健やかなEMRライフをお過ごしください。

## Gangliaに接続する

EMRのクラスタ作るとき、Gangliaをインストールする設定にしてると、サーバへの負荷が見えて便利です。
![ganglia0 - コピー.png](https://qiita-image-store.s3.amazonaws.com/0/69525/703302a9-c336-95fa-6383-d06c158df773.png)

赤が負荷大。水色はニート。この場合、クラスタ5台で立てては見たけれど、仕事してないやつがいますね。台数減らすか、コードを見直すかという対策が必要そうですね。
![ganglia - コピー.png](https://qiita-image-store.s3.amazonaws.com/0/69525/24318ff3-23e1-a593-8510-5e4e4f7b72ef.png)

## その他のWeb UI@EMRクラスタ上

Hueとかimparaもこの方法でweb uiが見えるので、必要に応じてaddtional applicationに設定してみてみると捗るかもですね。詳細は以下にて。

[Amazon EMR クラスターでホストされているウェブサイトの表示](http://docs.aws.amazon.com/ja_jp/ElasticMapReduce/latest/DeveloperGuide/emr-web-interfaces.html)