はじめに
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 クラスターでホストされているウェブサイトの表示
- ローカルマシンのSSHクライアントを、ポートフォワードするモード(Socks: port8157)で待ち受けしておく
- ローカルマシンのブラウザから、FoxyProxyを使って、EMRクラスタへのWeb接続要求をlocalhostのSocks: port8157へ送る
- port8157にWeb接続要求が来たら、「ローカルマシン」と「EMRクラスタ」の間を「SSHトンネリング(ポートフォワード)」でつないで、要求をフォワードする
すると、EMRクラスタのWeb UI見れますよって話です。
以下では、主にWindowsでの設定手順を書いておきます。
Steps
ブラウザの設定
FoxyProxyのインストール
まあブラウザの設定でsocksを設定してもいいのですが、ここではAWSのチュートリアルに従って、Firefoxのアドオン「FoxyProxy」を使います。
Firefoxで、以下からインストール
FoxyProxy
foxyproxy-settings.xmlを作成
AWSのドキュメント「オプション 2、パート 2: マスターノードでホストされるウェブサイトを表示するようにプロキシを設定する」に、EMRクラスタへの接続に便利な設定が乗っているので、これをインポートすることでFoxyProxyの設定をします。
foxyproxy-settings.xml
というファイルをUTF8で作って、中身を以下のようにします。
<?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が現れていると思うので、オプションを選びます。
「ファイル」メニュー -> 「Import Setting」で、先ほどつくったfoxyproxy-settings.xml
を取り込みます。
emr-socks-proxyという名前で設定が出来てれば成功。ブラウザ側の設定は以上です。
SSHの設定
SSHクライアント: Rlogin
WindowsでEC2につないでる方は、puttyを使っているんでしょうか。正直、鍵ファイルをppkに変換しろとか面倒なので、個人的にはRLoginをつかっています。
SSHトンネリング (ポートフォワード)の設定
RLoginの場合は、起動すると「Server Select」が空の状態で立ち上がると思いますが、「新規」を押して、以下を入力。
- エントリー: 適当に接続名を入力(ここでは「EMR Tunnel」としておきました)
- Server Address: EMRクラスタのMaster Nodeのアドレス
- User Name: hadoop
- SSH Identity key: 参照ボタンを押して.pemファイルを選択
- 最後に、左側のメニューの「サーバ」 -> 「プロトコル」を押して、詳細設定ページへ
- 「ポートフォワード」ボタンを押す
- 「新規」を押す
- Listernedの設定を「Local Socks」「localhost: 8157」で設定
- Connectの方は空で。
- 「ポートフォワードのみを行う」にチェックするかどうかはお好み次第
RLoginを使ってない人はトンネリングかポートフォワードの設定を探して、適宜読み替えてください。
実際に接続してみる
SSHクライアントでEMRクラスタに接続して、socksの待ち受けをする
普通にSSHでつなぐのと同じく、SSHクライアントで先ほど作った接続設定を選んで「接続」ボタンを押します。
なお、「ポートフォワードのみを行う」を選択していると、コマンド入力を受け付けない待ち受けモードになって、SSHトンネリングしてるlogがコンソールに出てくる形になります。つながり具合が見えるんで私はそれでやってますね。
(同時にコマンドも打ちたい場合はポートフォワードしない接続設定を作っておいて、それを別窓を立ち上げる形になりますが)
FireFoxでプロクシ設定をOnにする
FireFoxの「ツール」メニューより、先ほど作った設定を選べばよろしです
HadoopのResourceManagerに接続する
この状態で、Firefoxから「http://[master-public-dns-name]:9026/」につなぐと、HadoopのResourceManagerが見えるはず。
application_idのところをクリックして、logをみてみる
stdoutがこんな感じで。コード内のprintlnはここに出てきます。
後はprintlnデバッグでもしつつ、健やかなEMRライフをお過ごしください。
Gangliaに接続する
EMRのクラスタ作るとき、Gangliaをインストールする設定にしてると、サーバへの負荷が見えて便利です。
赤が負荷大。水色はニート。この場合、クラスタ5台で立てては見たけれど、仕事してないやつがいますね。台数減らすか、コードを見直すかという対策が必要そうですね。
その他のWeb UI@EMRクラスタ上
Hueとかimparaもこの方法でweb uiが見えるので、必要に応じてaddtional applicationに設定してみてみると捗るかもですね。詳細は以下にて。