MapRではYARNに関連するLoggingとして以下の3つのオプションを指定できます。
- Local logging
- YARN log aggregation
- Centralized logging (MapRのみ)
各オプションの特徴は以下のようにまとめられます
オプション | 対応アプリケーションのタイプ | ログ格納場所 | リアルタイム性 |
---|---|---|---|
Local logging | MR1, MR2, Yarn applications (non-MR) | ローカル | YES |
YARN log aggregation | MR2, Yarn applications (non-MR) | HDFS (MapR-FS) | NO |
Centralized logging | MR1, MR2 | HDFS (MapR-FS) | YES |
本記事ではこの3つのオプションの簡単な説明とセットアップについて説明していきます。
ただし、MR はv2に関してのみの説明となります。
1. Local logging
デフォルトの設定となります。
この場合、ログはローカルのファイルシステムに出力されるだけで、アグリゲーションされません。
この場合、ログを見ようとする場合は、ResourceManagerのWebUIなどから実行されたホストを探して、そのログを見る、といったフローになります。
MR2のログの場所はデフォルトで以下のパスとなります。
/opt/mapr/hadoop/hadoop-<version>/logs/userlogs/<application ID>/
2. yarn log aggregation
yarn log aggregationではローカルにログを書き出した後に、HDFS(MapR-FS)上に移動されます。
こちらはapache hadoop で実装されている機能となります。
有効化する際には以下のファイルを編集する必要があります。
yarn-site.xml
を編集して、log aggregationをenableします。
パス
/opt/mapr/hadoop/hadoop-2.7.0/etc/hadoop/yarn-site.xml
以下を追加
<property>
<name>yarn.log-aggregation-enable</name>
<value>true</value>
</property>
MapRのデフォルトであるノンセキュアなクラスタではyarn-env.sh
も編集する必要があります
パス
/opt/mapr/hadoop/hadoop-2.x/etc/hadoop/yarn-env.sh
以下を追加
export MAPR_IMPERSONATION_ENABLED=1
このあと、クラスタのNodeManagerを全て再起動してください。
デフォルトではアプリケーションの実行後にローカルからHDFS (MapR-FS)上の以下のパスにログが移動されます。
/tmp/logs/<実行ユーザ>/logs/<アプリケーションID>/
以下のコマンドでログを参照できます。
$ yarn logs -applicationId <アプリケーションID>
HDFS上のファイルはwrite-onceなので、ログの参照はアプリケーションの実行後に可能となります。
ResourceManagerのWebUIからも参照可能にするためには、Job History Serverも再起動して下さい。
centralized log aggregation
centralized log aggregationはMapR特有の機能となり、ログはアプリケーション実行中からMapR-FS上に格納されます。
そのため、ローカルのディスク容量を気にする必要がありません。
また、MapR-FSでは追記が可能なため、リアルタイムでの参照も可能となります。
ただし、centralized log aggregationが利用可能なのはMR, MR2に関してのみとなり、MR以外のYARNアプリケーションでは利用できません。
有効化する際には、yarn-site.xmlに以下の設定を追加します。
<property>
<name>yarn.use-central-logging-for-mapreduce-only</name>
<value>true</value>
</property>
追加後にnodemanager, resourcemanagerを再起動してください。
有効後にMR2アプリケーションを実行すると、デフォルトではMapR-FS上の以下のパスにログが記載されます。
/var/mapr/local/<host>/logs/yarn/userlogs/<アプリケーション>/<コンテナ>
上記のログをリアルタイムで参照しようとすると以下のようなコマンドになるため、パスが長くなり結構大変です
$ tail -f /mapr/<クラスタ名>/var/mapr/local/<host>/logs/yarn/userlogs/<アプリケーション>/<コンテナ>
これの対応として以下の用にシムリンクを作成出来ます。
$ maprcli job linklogs -jobid <アプリケーションID> -todir <参照先MapR-FSパス>
参照先のMapR-FSパスを/tmp/centralにすると、ログの参照パスは以下のようになります
$ ls /mapr/<ホスト名>/tmp/central/<アプリケーションID>/hosts/<host>/<コンテナ>