DMMゲームのログ解析~ログ収集と解析の概要~
現在オンラインゲームのバックエンド、KPIシステムを担当していますマサヨシです。
今回のブログでは【DMMオンラインゲームで実際に実装しているログとKPI】に関して3回にわたってご紹介致します。
DMMオンラインゲームでは、これまではオンラインゲームのプロジェクトごとに行っていたログの収集方法を統一し、プロジェクトに依存しない基本KPI機能とゲーム独自のKPI機能を実装するためのフレームワークを開発しましたのでその事例をもとにご紹介します。
ログ収集、解析の概要
まず、オンラインゲームのログ収集の全体像をご紹介します。
オンラインゲームのログ収集ではApacheやnginx、PHPのログをfluentdで収集しています。
fluentdに集めたログをHadoopの分散処理システムに保存し、HiveやImpalaで解析をする流れになっています。
ご存知の方も多いと思いますが、HiveとはHDFS上に格納したCSV、JSONなどを参照するテーブルを作成しSQLで問い合わせると、MapReduceジョブに変換されるというものです。
また、ImpalaはMapReduceとは異なる分散処理エンジンで、商用並列RDBMSに似たエンジンです。
Impalaの良さは可能な限りキャッシュし、高速に実行されるところにあります。
Hiveでは30秒以上かかるクエリもImpalaでは数秒で処理されます。
なのでオンラインゲームではバッチ処理はHive、リアルタイム処理はImpalaと使い分けて実装しています。
細かい説明を致します。
ゲームログの収集
ゲームログの集取では、PHPからのログをfluentdで収集しています。
fluentdの入力時にgame、ゲームID、アクセスの種類と3つタグをつけてログを収集しています。
アクセスの種類と言うのはアクセスや課金等です。
fluentdからはWebHDFSを使用してHadoopのHDFS上にストリーミングでログを保存していきます。
この時の保存先はタグの名前の通りの階層になっています。
httpdログ収集
次にhttpdのログの収集方法です。
httpdから出力したログをfluentdのinputプラグイン(tail)を利用してログ収集していきます。
こちらでもfluentdで設定したタグを3つつけています。
先頭からhttpd,ゲームID,そして、アクセスログ/エラーログです。
現状はアクセスログとエラーログの2種類を取得しています。
fluentdからhdfsへの出力方法は先ほどのゲームログの出力と同じです。
KPI試算
KPI計算は、まずPHPでHIVEにクエリを送り、受け取った結果をMySQLに格納します。
ここで他のKPI計算に必要となるKPIデータを、MySQLからHIVEにコピーします。ここでのKPIの計算はバッチ処理で行っています。
PHPのフレームワークにはLaravel5を使用しているので、バッチ処理はLaravel5のスケジューリング機能を利用してバッチの管理をしています。
スケジューリング機能をつかうことでソースコードで実行日時を管理できるので、cronの更新が不要になるので結構便利です。
計算済みのKPIはMySQLからPHPで取得します。
ログの検索や複雑なKPIの取得についてはImpalaにクエリを投げて、検索していきます。
まとめ
今回は【DMMオンラインゲームで実際に実装しているログとKPI】をテーマにした第1回目ということで、DMMオンラインゲームが実装するログ収集と解析の概要をご紹介しあした。
次回はログ収集でパフォーマンス向上のために活用している「Parquet」についてご紹介します。