LoginSignup
25
22

More than 5 years have passed since last update.

HiveからSparkに変えたら14時間分の集計バッチが3時間まで短縮できた話

Last updated at Posted at 2015-12-12

おきまりのやつ

CYBIRDエンジニア Advent Calendar 2015の13日目を担当します新卒入社3年目の@fuppiです。
分析基盤の開発・運用と予測モデルの構築をしています。

昨日は大先輩である@SayakaItoさんの「Unityで仮想現実にさわってみた」でした!
VRは、すごく興味があるのですが3D酔いするのがつらい…
ヘディングをするだけでも、かなり没入感を得られたようなので
BFB(弊社のフットボールゲーム)もVR対応したらおもしろいんじゃないでしょうか!!

はじめに

弊社の分析基盤はAmazon Web Service(以下AWS)を使って作られているので
AWS用語が出てきますがご了承ください。以下はこの記事に登場する各サービスの概要です。
S3: オンラインストレージサービス
EMR: Hadoopを使った、大量のデータを高いコスト効率で素早くかつ簡単に処理するためのウェブサービス
RDS: 自分でOSやRDBをインストールすることなくすぐに利用できるRDBサービス

HiveからSparkにしようとした経緯

■ 日次バッチがコケた時の再集計が大変
弊社では、DAUや売上などを、様々なセグメントに分けて可視化を行っています。
以前はHive(SQLライクなクエリで分散処理が行える)を使うことで、SQLでは捌ききれなかった大量のデータでも集計を行うことができ、めでだしめでたしだったのですが
日が立つに連れ、データ量だけでなく、新たに必要な指標がどんどん増え、気づけば日次バッチが14時間分(EMRクラスタは2つでそれぞれ7時間ずつかけて処理)。
バッチがコケた時の再集計が…

■ 過去分集計はもっと大変
新たな指標が追加される度に放たれる恐怖のワード

「過去分集計よろしくね」

おかげさまで、リリースから三年を迎えたタイトルもあるので
Hiveを使った集計はなかなか骨の折れる作業ですし、コストもかかります。

そこでどうにかできないものかと考え行き着いたのが

spark.png
https://ja.wikipedia.org/wiki/Apache_Spark

SparkはHiveと違い、インメモリで処理ができるため高速に処理ができます。
SparkSQLを使えば、さほどSQLと変りなく処理が書けますし、
足りない関数を補ったりもっと細かい処理をする場合は
現在対応しているJava・Scala・Python・Rのどれかを使って、処理を書くことも可能です。
幸い普段からPythonを扱っていたので、比較的すんなり開発にとりかかることが出来ました。

■ 将来性がある
Sparkは、機械学習用のライブラリが用意されていたり、ストリーミング処理もできるので
「バッチに時間がかかって困っている」、「将来機械学習やリアルタイム分析を行いたいと思っている」方は
Sparkを使ってみるのもいいのかなと思います。

分析環境の概要

構成図.png

■ データの流れ

  1. 1日1回各サービスのDBから、1日分のログを抽出しS3へ格納
  2. S3に溜まったログをEMRで集計し、集計結果を再度S3へ格納
  3. S3に置いた集計データをRDS(BIツールで参照するためのDB)へ格納

集計バッチの内容

■ 対象タイトル
11タイトル(分析対象コンテンツ)。
複数プラットフォーム展開しており、タイトルとプラットフォームの組み合わせは50ほど。

■ 指標
DAU、DPU、課金額などを色々な切り口(レベル、継続日数、ログイン頻度など)で分けて集計をする。

例)

レベル DAU DPU 課金額
1 100 5 5000
2 50 10 3000
3 5 4 100000

(今回のHive->Spark化は、タイトル毎の独自指標は対象外)

■ 時間・コスト
Hive: 1タイトル(1時間超え) x 11タイトル = 約14時間
Spark: 1タイトル(15分) x 11タイトル = 約3時間
(インスタンスタイプ・台数は同じ)

時間にして約1/5。
EMRの料金はクラスタの使用時間によって決まるので、コストに関しても同じく約1/5。

まとめ

Sparkは分散かつインメモリで処理が行えるため、大量データを高速に処理できます。
実際に、HiveからSparkに変えたことで
日次バッチが14時間 -> 3時間まで短縮され、コストも約1/5まで削減できました。

また機械学習のライブラリが用意されていることや
ストリーミング処理もできるため、分析の幅を広げやすい点も良いです。

終わりに

多少の学習コストがかかるとはいえ、処理の高速化による
時間短縮・コスト削減という目に見えるメリットだけでなく
「集計バッチがコケてました、復旧まで14時間待ってください」と
「集計バッチがコケてました、復旧まで3時間待ってください」
とでは、現場へ与える悪影響・自身の精神的ダメージも変わってきます。

特にJava・Scala・Python・Rを日々の業務で使っている方であれば
そこまで負担は大きくないと思うのでぜひ!

さてさて、明日のCYBIRDエンジニア Advent Calendar 2015は、
@yyama2さんの「Unity5.3のあの機能に触ってみた。」です。
@yyama2さんは、プログラミングの講師経験があるようなので、
とてもわかりやすく参考になる記事が出てくるのではないでしょうか!期待です!!

25
22
3

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
25
22