DMM.comラボエンジニアブログ

DMM.comラボのエンジニアブログです。DMM.comを支える技術について書いています。

DMM insideに引っ越しました。 移転先はこちら -> https://inside.dmm.com/

DMMゲームのログ解析~ログ収集と解析の概要~

現在オンラインゲームのバックエンド、KPIシステムを担当していますマサヨシです。

今回のブログでは【DMMオンラインゲームで実際に実装しているログとKPI】に関して3回にわたってご紹介致します。

DMMオンラインゲームでは、これまではオンラインゲームのプロジェクトごとに行っていたログの収集方法を統一し、プロジェクトに依存しない基本KPI機能とゲーム独自のKPI機能を実装するためのフレームワークを開発しましたのでその事例をもとにご紹介します。

ログ収集、解析の概要

f:id:dmmlabotech:20150702191500p:plain

 

まず、オンラインゲームのログ収集の全体像をご紹介します。

オンラインゲームのログ収集ではApacheやnginx、PHPのログをfluentdで収集しています。

fluentdに集めたログをHadoopの分散処理システムに保存し、HiveやImpalaで解析をする流れになっています。

ご存知の方も多いと思いますが、HiveとはHDFS上に格納したCSV、JSONなどを参照するテーブルを作成しSQLで問い合わせると、MapReduceジョブに変換されるというものです。

また、ImpalaはMapReduceとは異なる分散処理エンジンで、商用並列RDBMSに似たエンジンです。

Impalaの良さは可能な限りキャッシュし、高速に実行されるところにあります。

Hiveでは30秒以上かかるクエリもImpalaでは数秒で処理されます。

なのでオンラインゲームではバッチ処理はHive、リアルタイム処理はImpalaと使い分けて実装しています。

細かい説明を致します。 

ゲームログの収集

f:id:dmmlabotech:20150702191501p:plain


ゲームログの集取では、PHPからのログをfluentdで収集しています。

fluentdの入力時にgame、ゲームID、アクセスの種類と3つタグをつけてログを収集しています。

アクセスの種類と言うのはアクセスや課金等です。

fluentdからはWebHDFSを使用してHadoopのHDFS上にストリーミングでログを保存していきます。

この時の保存先はタグの名前の通りの階層になっています。

 

httpdログ収集

f:id:dmmlabotech:20150702191540p:plain

次にhttpdのログの収集方法です。

httpdから出力したログをfluentdのinputプラグイン(tail)を利用してログ収集していきます。

こちらでもfluentdで設定したタグを3つつけています。

先頭からhttpd,ゲームID,そして、アクセスログ/エラーログです。

現状はアクセスログとエラーログの2種類を取得しています。

fluentdからhdfsへの出力方法は先ほどのゲームログの出力と同じです。

 

KPI試算

f:id:dmmlabotech:20150702191541p:plain

KPI計算は、まずPHPでHIVEにクエリを送り、受け取った結果をMySQLに格納します。

ここで他のKPI計算に必要となるKPIデータを、MySQLからHIVEにコピーします。ここでのKPIの計算はバッチ処理で行っています。

PHPのフレームワークにはLaravel5を使用しているので、バッチ処理はLaravel5のスケジューリング機能を利用してバッチの管理をしています。

スケジューリング機能をつかうことでソースコードで実行日時を管理できるので、cronの更新が不要になるので結構便利です。

計算済みのKPIはMySQLからPHPで取得します。

ログの検索や複雑なKPIの取得についてはImpalaにクエリを投げて、検索していきます。

 

まとめ

今回は【DMMオンラインゲームで実際に実装しているログとKPI】をテーマにした第1回目ということで、DMMオンラインゲームが実装するログ収集と解析の概要をご紹介しあした。

次回はログ収集でパフォーマンス向上のために活用している「Parquet」についてご紹介します。