Sparkジョブの履歴をSpark History Serverに取り込む

#目的

Apache SparkのWebUIはアプリケーションのデバッグにとても役立ちます。

デバッグのため、このWeb UIを使って本番環境で取得したログを検証環境で確認したいことがあります。
取得したイベントのログをSparkのHistory Serverに渡すことで、本番環境のイベントログを手元の環境で見ることができて便利です。(Thanks! @kmizumar)
今回はCDH5.7の環境で検証しました。

__(2016/7/20 Clouderaのライセンスによりログが取得できないため一部記載を変更）__

#環境
* Spark 1.6
* CDH5.7
* Cloudera Manager 5.7

#HueからHive on Sparkでクエリを実行
今回Sparkを実行したのはCloudera Manager5.7で構築したYARNの環境です。HiveをSpark上で実行するために、HueのHiveクエリエディタからクエリの実行前に以下のオプションを指定します。

```
set hive.execution.engine=spark
```

![sparkhistory0.png](https://qiita-image-store.s3.amazonaws.com/0/13776/7dd21e8c-60e1-e6f4-2518-5ce63ffe13c9.png)


#Sparkのイベントログを収集 (Cloudera Enterprise ライセンスがある場合）
Cloudera Enteprise ライセンスがある場合、Cloudera ManagerのUIからイベントログを収集できます。（ライセンスがない場合はイベントログを直接コピーします。手順は後述）

##Cloudera ManagerでYARNのアプリケーションを表示
Cloudera Managerでは、クラスタで実行された、YARN(MapReduceやSpark)やImpalaアプリケーションの履歴が一覧ができます。以下のスクリーショットはYARNで実行されたアプリケーションを表示しています。
![sparkhistory1.png](https://qiita-image-store.s3.amazonaws.com/0/13776/bb56a634-f3c5-d09e-533a-75cfa1d0003f.png)

##アプリケーションの診断データを収集
先ほど実行したHive on Spark(Sparkアプリケーション)の診断データを右側のメニューから取得します。

![sparkhistory2.png](https://qiita-image-store.s3.amazonaws.com/0/13776/90564797-4d3f-971d-62e4-7931d8c4e841.png)

![sparkhistory3.png](https://qiita-image-store.s3.amazonaws.com/0/13776/0680fbe5-e162-a3c1-cced-833f0ee48284.png)

Clouderaのサブスクリプションを契約している場合はサポートに診断データを送ることもできますが、今回は「診断データの収集」ボタンをクリックしてダウンロードしました。「結果データのダウンロード」ボタンを押して各診断情報やメタデータがアーカイブされダウンロードします。
![sparkhistory4.png](https://qiita-image-store.s3.amazonaws.com/0/13776/41ca793a-4885-149e-fc87-eb852c06eeda.png)

ダウンロードされたのは次のファイルです。

```
12c8052f-d78f-4a8e-bba4-a55a2d141fcc.default.20160714-07-56-02.support-bundle.zip
```

##ローカル環境で表示する
###ダウンロードデータをSparkの検証環境にアップロード
ダウンロードしたデータをローカルのSpark環境にアップロードし、中身を見てみましょう。

```
[kawasaki@localhost Desktop]$ unzip -l 12c8052f-d78f-4a8e-bba4-a55a2d141fcc.default.20160714-07-56-02.support-bundle.zip
Archive:  12c8052f-d78f-4a8e-bba4-a55a2d141fcc.default.20160714-07-56-02.support-bundle.zip
  Length      Date    Time    Name
---------  ---------- -----   ----
      485  07-14-2016 00:56   arguments.json
   198309  07-14-2016 00:56   YarnApplicationDiagnosticsCollection-1802.tgz
      179  07-14-2016 00:56   cm_version.json
    62158  07-14-2016 00:56   cm_http_instrumentation.json
       53  07-14-2016 00:56   bundle-meta.json
        1  07-14-2016 00:56   ticket_number.txt
      158  07-14-2016 00:56   license.json
      630  07-14-2016 00:56   performance-data.json
       80  07-14-2016 00:56   trial_status.json
  2176204  07-14-2016 00:56   scm-cluster-description.json
   207009  07-14-2016 00:56   cm_deployment.json
        1  07-14-2016 00:56   comments.txt
---------                     -------
  2645267                     12 files
[kawasaki@localhost Desktop]$
```

###zipファイルを展開

```
[kawasaki@localhost Desktop]$ unzip 12c8052f-d78f-4a8e-bba4-a55a2d141fcc.default.20160714-07-56-02.support-bundle.zip
Archive:  12c8052f-d78f-4a8e-bba4-a55a2d141fcc.default.20160714-07-56-02.support-bundle.zip
  inflating: arguments.json
  inflating: YarnApplicationDiagnosticsCollection-1802.tgz
  inflating: cm_version.json
  inflating: cm_http_instrumentation.json
  inflating: bundle-meta.json
  inflating: ticket_number.txt
  inflating: license.json
  inflating: performance-data.json
  inflating: trial_status.json
  inflating: scm-cluster-description.json
  inflating: cm_deployment.json
  inflating: comments.txt
[kawasaki@localhost Desktop]$
```

ここで展開されたファイルのうち、YarnApplication*.tgzファイルにイベントログが含まれています。（それ以外の情報はCloudera Managerのメタデータなどです）。tgzファイルを展開しましょう。

```
[kawasaki@localhost Desktop]$ tar xvf YarnApplicationDiagnosticsCollection-1802.tgz
diagnostics/
diagnostics/command.log
diagnostics/layout_version.txt
diagnostics/application_1468417076413_0022/
diagnostics/application_1468417076413_0022/spark_event_logs.zip
diagnostics/application_1468417076413_0022/app_info.json
diagnostics/application_1468417076413_0022/app_attempts.json
diagnostics/application_1468417076413_0022/aggregated_logs/
diagnostics/application_1468417076413_0022/aggregated_logs/application_1468417076413_0022/
diagnostics/application_1468417076413_0022/aggregated_logs/application_1468417076413_0022/nightly57-3.gce.cloudera.com_8041
diagnostics/application_1468417076413_0022/aggregated_logs/application_1468417076413_0022/nightly57-4.gce.cloudera.com_8041
[kawasaki@localhost Desktop]$
```

ここで展開されたspark_event_logs.zipがイベントログです。zipファイルを展開しましょう。

```
[kawasaki@localhost Desktop]$ unzip diagnostics/application_1468417076413_0022/spark_event_logs.zip
Archive:  diagnostics/application_1468417076413_0022/spark_event_logs.zip
  inflating: application_1468417076413_0022_1
[kawasaki@localhost Desktop]$
```

###イベントログをSpark History Serverのログディレクトリにアップロード

展開したファイルをSpark History Serverにアップロードしましょう。アップロード先はspark.history.fs.logDirectoryプロパティで指定され、今回の環境ではhdfs://localhost:8020/user/spark/applicationHistoryになっています。

```
[kawasaki@localhost Desktop]$ hdfs dfs -put diagnostics/application_146841 /user/spark/applicationHistory
application_1468416381293_0021/ application_1468417076413_0022/
```


#Sparkのイベントログを収集 (Cloudera Managerを使わない場合）
Cloudera Managerを使わない場合は、イベントログファイルを取得してHistory Serverにアップロードします。設定に依存しますが、イベントログはhdfs://<NameNode>:8020/user/spark/applicationHistory 以下に生成されてます。

Sparkのジョブを実行した環境でログをダウンロードします。

```
[kawasaki@hoge Desktop]$ hdfs dfs -ls /user/spark/applicationHistory
Found 1 items
-rwxrwx--    1 kawasaki spark    716000 2016-07-19 15:50  /user/spark/applicationHistory/application_1468417076413_0022
[kawasaki@hoge Desktop]$ hdfs dfs -get /user/spark/applicationHistory/application_1468417076413_0022
[kawasaki@hoge Desktop]$

```

ダウンロードしたファイルをアップロードします。

```
[kawasaki@localhost Desktop]$ hdfs dfs -put 
application_1468416381293_0022 /user/spark/applicationHistory
```


#Spark History ServerのWebUIで表示
http://<spark history server>:にアクセスして表示します。ローカルで取得したのと同様に表示できますね！Enjoy！

<img width="1183" alt="sparkhistory5.png" src="https://qiita-image-store.s3.amazonaws.com/0/13776/41013e36-aca3-8922-b83d-fa3ae18b970b.png">

<img width="1180" alt="sparkhistory6.png" src="https://qiita-image-store.s3.amazonaws.com/0/13776/72174045-cc1a-feed-fd85-8000321e7695.png">

<img width="1167" alt="sparkhistory7.png" src="https://qiita-image-store.s3.amazonaws.com/0/13776/b7ec9cd6-8bef-541c-e250-03242cc33271.png">



# 参考情報
http://spark.apache.org/docs/1.6.2/monitoring.html
> If Spark is run on Mesos or YARN, it is still possible to reconstruct the UI of a finished application through Spark’s history server, provided that the application’s event logs exist. You can start the history server by executing: