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

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

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

DMMゲームのログ解析~Parquetについて~

こんにちは、オンラインゲームのバックエンド、KPIシステムを担当していますマサヨシです。
先日に引き続き【DMMオンラインゲームで実際に実装しているログとKPI】に関してご紹介する第2回です。
DMMゲームのログ解析~ログ収集と解析の概要~

第2回はログを実装する際に利用している"Parquet"についてご紹介します。
 

Parquetとは?

こちらは"Parquet"と書くのですが、「パーケイ」と読みます。
Parquetは何かというと、CSVやJSONのようにDBのレコードを格納できるデータフォーマットです。
Parquetはデータフォーマットの中でもカラムナーストレージフォーマットと呼ばれるもので、列方向にデータを格納しています。
そのためカラムへのアクセスが速く、特にSELECT,WHERE,GROUP BYの使用時に効果的です。
また、同じカラムには似たようなデータが格納されているため、他に比べて圧縮率が高くなる特徴があります。

例えばDateTime型だと、同じ日であれば、日付までは全く同じになるので圧縮がききます。
 

Parcuetのパフォーマンス検証

PurquetをHiveテーブルのデータ部分に使用すればパフォーマンスがよくなるのではないかと考え、今回は実際に検証したデータをご紹介致します。

f:id:dmmlabotech:20150702191542p:plain

 
テストに使用したデータは、2,889,708レコードをサンプルして作成したアクセスログです。
Apacheのaccess_logをFluentdで入力、解析しtsvにしてデータを作りました。


まずはデータサイズの比較結果です。
tsvのデータはおよそ1GB程度でした。
gzipで圧縮したものは192MBです。
parquetの無圧縮のデータが約622MB,それをgzipで圧縮したものが約135MBです。
parquetをgzip圧縮したデータは、tsvのgzip圧縮よりも小さくなっています。
 
 
次にそれぞれのデータの処理時間のデータ結果です。

 

比較にはこのようなユニークなIPをカウントするクエリを使いました。
SELECT COUNT(DISTINCT ip) FROM table_name;
 
結果はこちらです。
f:id:dmmlabotech:20150702191543p:plain
元々のtsv(テキスト)のファイルは15.49秒に対してgzipに圧縮すると11.51秒でした。
これはデータサイズが小さくなり、ディスクIOが減ったため速くなったと考えられます。

次に、Parquetの無圧縮のものを見ますと、こちらは7.2秒とtsvの無圧縮のものに比べて半分以下の処理時間になっています。
こちらはtsv(gzip)よりもさらに速くなっています。
Parquetはその特徴として不要なカラムにはアクセスしないため、速くなったと考えられます。

今回の例ですと、tsvはipというカラムを取得するために1行のデータの文字列をパースして参照するのに対して、Parquetはパースする必要がないので非常に速くなっています。
Parquetをgzip圧縮したものはデータサイズが小さくなっているので更に速くなっています。

Reduceの場合は1度参照したipとカウント数を参照するため、処理時間に差はありませんでした。
 

Parcuetの利用

f:id:dmmlabotech:20150702191544p:plain

DMMオンラインゲームのログ解析では、当日のデータはfluentdで取得し、tsvで保存しています。
そして日付変更時にParquetのテーブルへデータをコピーします。
コピーが終わったtsvのデータは削除していきます。
こうすることでデータを小さくすることができ、更にパフォーマンスを向上させることができました。
 

まとめ

前回はログ集取とKPI解析の概要を、今回はログ解析でのパフォーマンス向上させるParquetについて技術面でのご紹介をしてきました。

最終回となる次回はログ解析フレームワークを実装する際に困ったハマリポイントをお伝えします。