AmebaにおけるHBase活用事例

AmebaにおけるHBase活用事例
株式会社サイバーエージェント
技術本部
善明晃由、内藤遥
株式会社サイバーエージェント
本日の内容
•  Amebaについて
•  HBase活用事例
•  ログ解析基盤Patriot
•  投稿監視システムOrion
•  トレンド分析システム
2
Amebaについて
株式会社サイバーエージェント
Ameba事業
スマートフォン向けの「Ameba」を中心に事業展開
ブログだけではなく様々なコミュニティサービスやゲームを提供
4
株式会社サイバーエージェント
Ameba Technology Laboratoryについて
•  Amebaの大規模データを集約的に扱う組織
•  2011年4月に開設、現在約25名が所属
ログ解析
検索
データマイニング
大規模
分散処理
(ログ解析基盤)
推薦
フィルタリング
5
ログ解析基盤Patriotにおける
HBase
7
Amebaのログ解析基盤:Patriot
•  Amebaのサービス共通のログ解析基盤
•  Ameba Technology Laboratoryで開発・運用
•  サービスのユーザ行動の分析、アクセスログの集計など
•  レコメンド等の大規模データ活用による機能の提供
•  Hadoopクラスタ上に構築
• 
• 
• 
• 
HDFSにログデータを集約
Hive/MapReduceを用いた集計
HBaseを用いて処理結果を活用
Flumeを用いたデータ収集
株式会社サイバーエージェント
【Logサーバ】
ログの一時集約
ログ転送(SCP)
MySQLレプリ
システム構成
ログ整形
Hiveインポート
Ameba
サービス
ログのリアルタイム転送
(Flume)
HiveJobをキック
【Batchサーバ】
ワークフロー
スケジューラ
Hadoop
クラスタ
サマリView、
アドホックHiveクエリ
(自作WebUI)
【外部連携サーバ】
サマリーデータ取得
Hiveクエリ実行
ジョブステータス取得
各部門の
レポーティングツール
8
株式会社サイバーエージェント
Amebaのログ解析基盤:Patriot
昨年のCloudera World Tokyo で運用体制等について紹介
http://www.slideshare.net/cyberagent/cloudera-worldtokyo-2013
9
株式会社サイバーエージェント
システム概要(HBase関連)
•  Hiveの集計結果をHBaseに出力
•  HBaseのデータをレポーティングツールなどに出力
•  用途に応じて複数のテーブル(スキーマ)を利用
•  アクセス解析、行動ログ解析、など
アクセス
解析
ログ
ログ
ログ
ログ
ログ
(Hive)
行動ログ
解析
集計結果
(HBase)
10
株式会社サイバーエージェント
HBaseスキーマの例
アクセスログ解析
RowKey
ColumnFamily
<サービス名>-<デバイス種別>- a
<パス>-<日付>-<指標名>-<集
計種別>-<集計対象>
Column
<Hour>?
Value
<集計結果>
•  指標名;pv、レスポンスタイムなど
•  集計種別/集計区分:リファラ、検索ワードなど
•  Hour
•  日時集計では空文字、時間単位の集計のみ[0-24]
•  集計対象に任意の文字列が入りうるためColumnに分離
11
株式会社サイバーエージェント
HBaseを利用する上での課題
•  スキーマの管理が分散
•  Hiveからの入力、レポーティングへの出力、管理ツール(CLI)
•  データの管理確認が面倒
•  CLIがイマイチ
• 
手動でrowkeyの作成、など
•  スキーマ毎に管理ツールをつくるのも手間
• 
byte[]の連結と分割
•  大量のデータの入出力
•  細粒度での集計
•  データの修正
12
株式会社サイバーエージェント
HBaseを利用する上での課題(例)
•  誤って書き込まれたデータの削除
•  不正なログ、Hiveクエリのミス
•  毎回フィルタを追加するのは面倒
指標名
値
service1-pv
12345
service1-unknown1 -999
service1-unknown2 -999
service1-uu
300
集計結果
(HBase)
変なデータ
が見える
13
株式会社サイバーエージェント
HBaseを利用する上での課題(例)
•  指標名が統一されてない
•  複数人、複数部門がバッチ処理を追加
•  レポートの作成が複雑
指標名
値
service1-uu
1000
service2-dau
2000
service3-uu
3000
集計結果
(HBase)
修正対象データ
(実際は大量、数年分)
指標名
値
service1-uu
1000
service3-uu
3000
service2のデー
タがみえない
14
株式会社サイバーエージェント
汎用HBaseラッパー(Blackhawk)
•  スキーマ定義を一元管理し、アプリケーションデータとKeyValue
との変換を実現
•  byte[]を意識せずにKeyValueデータをあつかうインタフェース
•  SQLライクなクエリ
• 
CLI、JDBCドライバ
•  Hive Integration
• 
HBaseの多様なスキーマに対してHiveで処理
Relation定義
Schema定義
スキーマ
リポジトリ
SELECT *
FROM patriot-kpi
WHERE service = ‘ameba’
AND indicator = ‘uu’
Blackhawk
Schema定義
Scan table: patriot-pac3
{"startRow":"ameba-uu",”
stopRow":"ameba-uv”, "families":{"data":["ALL"]}}
15
株式会社サイバーエージェント
スキーマの定義DDL
•  定義したモデルに対してKeyValueの各要素中の属性の配置を記
述
•  各属性に区切りを示す修飾子を設定(suffix(“-”))
define primary schema v1 for apdata {
table "anapat",
row suffix(“-”){service}:suffix(“-”){dev}:suffix(“-”)
{path}:regexp("[0-9]{4}-[01][0-9]-[0-3][0-9]"){dt}:"-”:suffix(“-”)
{indicator}:suffix("-"){target_type}:target_value,
family "a",
qualifier hour,
value val
};
16
株式会社サイバーエージェント
17
動作例
KeyValue → アプリケーションデータ
RowKey
define primary schema v1 for apdata {
ameba-pc…
/-2014-11-06-pv-search-word
row suffix(“-”){service}:
suffix(“-”){dev}:
suffix(“-”){path}:
regexp("[0-9]{4}-[01][0-9]-[0-3][0-9]"){dt}:"-”:
suffix(“-”){indicator}:
service=ameba,
suffix("-"){target_type}:
dev= pc,
target_value,
path=/,
…
dt=2014-11-06,
};
indicator=pv,
target_type=search, target_value=word
株式会社サイバーエージェント
利用例1
誤って書き込まれたデータの削除
指標名
値
service1-pv
12345
service1-unknown1
-999
service1-unknown2
-999
service1-uu
300
集計結果
(HBase)
変なデータ
が見える
DELTE FROM apdata WHERE service = ‘serivce1’ AND indicator like
‘unknown%’
対象範囲をScanし、
条件を満たすKeyValueに対してDeleteを発行
18
株式会社サイバーエージェント
19
利用例2
•  指標名が統一されてない
修正対象データ
(実際は大量、数年分)
指標名
値
service1-uu
1000
service2-dau
2000
service3-uu
3000
集計結果
(HBase)
指標名
値
service1-uu
1000
service3-uu
3000
service2のデー
タがみえない
hive –e “INESRT OVERWRITE TABLE patdata
SELECT service, ‘uu’ AS indicator,,,
大量のKVをMapReduceで
FROM patdata WHERE indicator = ‘dau’
容易に修正
株式会社サイバーエージェント
利用例3
•  JDBCドライバにより開発を効率化
•  HBaseのAPIを知らなくても利用可能
•  性能が必要な場合はある程度の知識は必要
•  KeyValueとの変換処理は実装不要
Ameba
サービス
必要な機能の
実装に集中
Hadoop
クラスタ
20
株式会社サイバーエージェント
現在の取り組み
•  スキーマ変換
•  設計に失敗したスキーマの処理
• 
Wide-tableなど
•  用途に応じたスキーマを容易に追加可能な枠組み
• 
サービス毎のレポート → 指標毎のレポート
•  ユーザ管理データとの連携
•  複数のサービスのグループ化
•  ユーザが管理するHBaseテーブルをHiveの集計で利用
•  OSS化も検討中
21
株式会社サイバーエージェント
PatriotにおけるHBase
l  主にHiveの集計結果の管理に利用
l  独自のツールを開発して運用を効率化
l  不正なデータの調査、修正
l  JDBCドライバ等で周辺プロダクトの開発を簡素化
l  HBase Hive Integarionを用いHiveとの連携
l  関連ツール
l  Apache Phoenix, Hive組み込みのHBase-Hive Integration
l  任意のスキーマに対応可能なわけではない
22
Ameba投稿監視システムOrionにおける
HBase
株式会社サイバーエージェント
Ameba投稿監視システム Orion
•  健全性の担保を目的に、Amebaでのユーザ投稿テキスト、投稿
画像を一元的に管理し、投稿内容の監視を支援するシステム
•  約2500万投稿/day
•  約150人のオペレータによる監視
24
株式会社サイバーエージェント
25
Ameba投稿監視システム Orion
•  機能要件
•  日ごとに投稿データを監視、時系列の古いものから処理していく
•  未処理の投稿データに関しては、オペレータが重複して
監視しないようにする (二重監視の防止)
株式会社サイバーエージェント
Ameba投稿監視システム Orion
•  スキーマ設計
RowKey
<監視カテゴリID>_<監視状態ID>_
<投稿時間>_<投稿ID>
ColumnFamily
v
Column
Value
<投稿情報
(シリアライズ)>
26
株式会社サイバーエージェント
Ameba投稿監視システム Orion
•  スキーマ設計
RowKey
<監視カテゴリID>_<監視状態ID>_
<投稿時間>_<投稿ID>
ColumnFamily
v
Column
Value
<投稿情報
(シリアライズ)>
監視対象をグルーピングしたID
このIDごとに投稿データが監視される
27
株式会社サイバーエージェント
Ameba投稿監視システム Orion
•  スキーマ設計
RowKey
<監視カテゴリID>_<監視状態ID>_
<投稿時間>_<投稿ID>
ColumnFamily
Column
v
投稿データの監視状態
0: 未処理
1: 監視中
2: 監視済
Value
<投稿情報
(シリアライズ)>
28
株式会社サイバーエージェント
Ameba投稿監視システム Orion
•  スキーマ設計
RowKey
ColumnFamily
<監視カテゴリID>_<監視状態ID>_
<投稿時間>_<投稿ID>
v
UNIX時間
例)2014/11/01 00:00:00
->1414767600000
Column
Value
<投稿情報
(シリアライズ)>
29
株式会社サイバーエージェント
Ameba投稿監視システム Orion
•  スキーマ設計
RowKey
ColumnFamily
<監視カテゴリID>_<監視状態ID>_
<投稿時間>_<投稿ID>
Column
v
投稿データを識別するID
Value
<投稿情報
(シリアライズ)>
30
株式会社サイバーエージェント
Ameba投稿監視システム Orion
•  スキーマ設計
RowKey
ColumnFamily
<監視カテゴリID>_<監視状態ID>_
<投稿時間>_<投稿ID>
v
Column
Value
<投稿情報
(シリアライズ)>
カラムファミリー、カラムは
全ての値に付随して保存されるため、
なるべく短くする(カラムは空)
31
株式会社サイバーエージェント
Ameba投稿監視システム Orion
•  スキーマ設計
RowKey
ColumnFamily
<監視カテゴリID>_<監視状態ID>_
<投稿時間>_<投稿ID>
v
Column
Value
<投稿情報
(シリアライズ)>
投稿データ、オペレータ対応情報など
シリアライズして容量の節約
キーがソートされたキーバリューストア
として利用可能
32
株式会社サイバーエージェント
Ameba投稿監視システム Orion
例)監視カテゴリID:1 の 2014/11/01の未処理データを監視
33
株式会社サイバーエージェント
Ameba投稿監視システム Orion
例)監視カテゴリID:1 の 2014/11/01の未処理データを監視
•  データ取得(全体像)
Step2: ロック
Step3: ロック取得
ZooKeeper
Step8: ロック解除
Step1: HTTPリクエスト
Step9: データ取得
Step4: Scan
Step5: データ取得
API
Step6: Put
Step7: Delete
HBase
34
株式会社サイバーエージェント
Ameba投稿監視システム Orion
例)監視カテゴリID:1 の 2014/11/01の未処理データを監視
•  監視カテゴリのロック
•  ZooKeeperを使って監視カテゴリごとにロックを取得する
Step2: ロック
監視カテゴリID=1
ZooKeeper
Step3: ロック取得
成功するまでリトライ
Step1: HTTPリクエスト
API
35
株式会社サイバーエージェント
Ameba投稿監視システム Orion
例)監視カテゴリID:1 の 2014/11/01の未処理データを監視
•  開始キー、終了キーを生成
• 
• 
開始キー: 1_0_1414767600000 終了キー: 1_0_1414854000000
2014/11/01 00:00:00
2014/11/02 00:00:00
未処理
•  行キーは昇順にソートされているため、時系列の古いデータから取得可能
Step4: Scan
Step5: データ取得
API
HBase
36
株式会社サイバーエージェント
Ameba投稿監視システム Orion
例)監視カテゴリID:1 の 2014/11/01の未処理データを監視
•  HBaseからデータ取得
クエリ(Scan)
開始キー: 1_0_1414767600000 終了キー: 1_0_1414854000000
カラムファミリー: v
取得件数: 100件
行キー: 1_0_1410793312345_83B197E4
行キー: 1_0_1410793312345_83B197E4
値: <投稿データ>
検索結果
値: <投稿データ>
行キー: 1_0_1414767612345_83B197E4
値: <投稿情報>
Step4: Scan
Step5: データ取得
API
HBase
37
株式会社サイバーエージェント
Ameba投稿監視システム Orion
例)監視カテゴリID:1 の 2014/11/01の未処理データを監視
•  行キーの更新
•  監視状態IDを0(未処理) -> 1(監視中)に変更
•  行キーが変わるため、Put、Deleteの処理を連続して行う
クエリ(Put)
行キー: 1_1_1414767612345_83B197E4
カラムファミリー: v
値: <投稿情報>
クエリ(Delete)
行キー: 1_0_1414767612345_83B197E4
カラムファミリー: v
API
Step6: Put
Step7: Delete
HBase
38
株式会社サイバーエージェント
Ameba投稿監視システム Orion
例)監視カテゴリID:1 の 2014/11/01の未処理データを監視
•  監視カテゴリのロック解除、データ取得
ZooKeeper
Step8: ロック解除
監視カテゴリID=1
Step9: データ取得
API
39
株式会社サイバーエージェント
Ameba投稿監視システム Orion
例)監視カテゴリID:1 の 2014/11/01の未処理データを監視
•  オペレータによる目視監視
•  投稿データに対応情報を付与
行キー: 1_0_1410793312345_83B197E4
行キー: 1_0_1410793312345_83B197E4
値: <投稿データ>
値: <投稿データ>
行キー: 1_1_1414767612345_83B197E4
値: <投稿情報(更新)>
40
株式会社サイバーエージェント
Ameba投稿監視システム Orion
例)監視カテゴリID:1 の 2014/11/01の未処理データを監視
•  HBaseにデータを格納
•  監視状態IDを1(監視中) -> 2(監視済)に変更
クエリ(Put)
行キー: 1_2_1414767612345_83B197E4
カラムファミリー: v
値: <投稿情報(更新)>
Put
API
クエリ(Delete)
行キー: 1_1_1414767612345_83B197E4
カラムファミリー: v
Delete
HBase
41
トレンド分析システムにおける
HBase
株式会社サイバーエージェント
トレンド分析システム
•  各サービスの検索ワードやハッシュタグ、投稿画像など、幅広いオブジェクトの
トレンドを分析、検知するシステム
•  Daily、Hourlyなどの時系列ごとにオブジェクトに対するアクティビティ
(検索した、いいねを押したなど)をカウント
43
株式会社サイバーエージェント
トレンド分析システム
•  機能要件
•  オブジェクトの急上昇ランキングの提供(バッチ処理)
•  オブジェクトの時系列データの提供(オンライン処理)
44
株式会社サイバーエージェント
トレンド分析システム
•  スキーマ設計
RowKey
ColumnFamily
Column
Value
<サービスID>_<日時フォーマット>_
<カテゴリID>_<サブカテゴリID>_
<オブジェクト>
d
<count>
…
h
<count>
… m
<count>
45
株式会社サイバーエージェント
トレンド分析システム
•  スキーマ設計
RowKey
ColumnFamily
Column
Value
<サービスID>_<日時フォーマット>_
<カテゴリID>_<サブカテゴリID>_
<オブジェクト>
d
<count>
…
h
<count>
… m
<count>
サービスを一意に
識別するID
46
株式会社サイバーエージェント
トレンド分析システム
•  スキーマ設計
RowKey
ColumnFamily
Column
Value
<サービスID>_<日時フォーマット>_
<カテゴリID>_<サブカテゴリID>_
<オブジェクト>
d
<count>
…
h
<count>
… m
<count>
時系列の種類ごとに
フォーマットされた日時
Daily -> yyyyMMdd
Hourly -> yyyyMMddHH
10分ごと -> yyyyMMddHHm0
47
株式会社サイバーエージェント
トレンド分析システム
•  スキーマ設計
RowKey
ColumnFamily
Column
Value
<サービスID>_<日時フォーマット>_
<カテゴリID>_<サブカテゴリID>_
<オブジェクト>
d
<count>
…
h
<count>
… m
<count>
『検索ワード』、『投稿画像』
など、カテゴリを識別するID
48
株式会社サイバーエージェント
トレンド分析システム
•  スキーマ設計
RowKey
ColumnFamily
Column
Value
<サービスID>_<日時フォーマット>_
<カテゴリID>_<サブカテゴリID>_
<オブジェクト>
d
<count>
…
h
<count>
… m
<count>
『投稿画像』 の 『いいね』、
『コメント』など、カテゴリを
更に細分化するID (任意)
49
株式会社サイバーエージェント
トレンド分析システム
•  スキーマ設計
RowKey
ColumnFamily
Column
Value
<サービスID>_<日時フォーマット>_
<カテゴリID>_<サブカテゴリID>_
<オブジェクト>
d
<count>
…
h
<count>
… m
<count>
『検索ワード』の『AKB』など、
集計対象となるオブジェクト
50
株式会社サイバーエージェント
トレンド分析システム
•  スキーマ設計
RowKey
ColumnFamily
Column
Value
<サービスID>_<日時フォーマット>_
<カテゴリID>_<サブカテゴリID>_
<オブジェクト>
d
<count>
…
h
<count>
… m
<count>
時系列の種類によって
カラムファミリーを分ける
Daily -> d
Hourly -> h
10分ごと -> m
51
株式会社サイバーエージェント
トレンド分析システム
•  スキーマ設計
RowKey
ColumnFamily
Column
Value
<サービスID>_<日時フォーマット>_
<カテゴリID>_<サブカテゴリID>_
<オブジェクト>
d
<count>
…
h
<count>
… m
<count>
オブジェクトに対する
アクティビティのカウント
HBaseのカウンタ機能を利用
52
株式会社サイバーエージェント
トレンド分析システム
例1) アメブロの検索ワード急上昇ランキング
•  時系列の種類:Hourly
•  集計期間: 2014/11/01 0時 ~ 2014/11/02 0時
53
株式会社サイバーエージェント
トレンド分析システム
例1) アメブロの検索ワード急上昇ランキング
•  開始キー、終了キーを生成 (0時 ~ 1時)
•  開始キー: 1_2014110100_1
•  終了キー: 1_2014110100_2
アメブロの
サービスID
Hourlyの
フォーマット
『検索ワード』の
カテゴリID
54
株式会社サイバーエージェント
トレンド分析システム
例1) アメブロの検索ワード急上昇ランキング
•  データ取得 (0時 ~ 1時)
行キー: 1_0_1410793312345_83B197E4
値: <投稿データ>
行キー: 1_0_1410793312345_83B197E4
検索結果
値: <投稿データ>
行キー: 1_2014110100_1_AKB
値: 100
クエリ(Scan)
開始キー: 1_2014110100_1 終了キー: 1_2014110100_2
カラムファミリー: h
Scan
Batch
データ取得
HBase
55
株式会社サイバーエージェント
トレンド分析システム
例1) アメブロの検索ワード急上昇ランキング
•  24時間分のデータを1時間ごとに取得
•  データ整形後、変化点検出のロジックを使ってオブジェクトごと
に急上昇の度合いを算出 -> ランキング生成
56
株式会社サイバーエージェント
トレンド分析システム
例2) アメブロの検索ワード 『AKB』 の時系列データ取得
•  時系列の種類:Daily
•  集計期間: 2013/11/01 00:00 ~ 2014/11/01 00:00
57
株式会社サイバーエージェント
トレンド分析システム
例2) アメブロの検索ワード 『AKB』 の時系列データ取得
•  データ取得
•  Result[] get(List<Get> gets) のクライアントAPIを利用(Java)
•  集計期間内で日ごとの行キー、Getインスタンスを生成
• 
行キー: 20131101_1_AKB ~ 20141031_1_AKB 行キー: 1_0_1410793312345_83B197E4
行キー: 1_0_1410793312345_83B197E4
検索結果
値: <投稿データ>
値: <投稿データ>
行キー: 1_20131101_1_AKB
値: 1000
クエリ(Get)
行キー: 1_20131101_1_AKB カラムファミリー: d
Get
API
データ取得
HBase
58
株式会社サイバーエージェント
トレンド分析システム
例2) アメブロの検索ワード 『AKB』 の時系列データ取得
•  管理ツールでグラフ化
59
株式会社サイバーエージェント
トレンド分析システム
例2) アメブロの検索ワード 『AKB』 の時系列データ取得
•  管理ツールでグラフ化
2014/05/25 AKB48握手会傷害事件
2014/02/25 AKB48グループ大組閣祭り
(AKB48グループ内の
人事異動を発表するイベント)
2014/06/08
大島優子卒業コンサート
60
株式会社サイバーエージェント
まとめ
•  ログ解析基盤PatriotにおけるHBase
•  HBaseのデータ管理を効率化するツール
•  Ameba投稿監視システムOrionにおけるHBase
•  二重監視を防ぐ仕組み
•  トレンド分析システムにおけるHBase
•  オブジェクトのランキング、時系列データ提供のためのスキーマ設計
61
株式会社サイバーエージェント
「HBase徹底入門」鋭意執筆中です!2015年初旬発売予定!
•  本の内容(予定)
Ø  第1部 HBaseの基礎
HBaseの基礎について解説します。
チュートリアルでHBaseを動かします。
Ø  第2部 HBaseを用いたアプリケーシ
ョン開発
Java API、HBaseのスキーマ設計の
考え方、アプリケーション設計の流れを
解説します。
Ø  第3部 HBaseクラスタの構築・運用
クラスタ設計についての考え方、構
築方法、運用方法について解説します。
Ø  第4部 HBaseの高度なトピック
※画像はイメージです
パフォーマンス・チューニング、
HBaseのエコシステムなどについて解説
します。
62
株式会社サイバーエージェント
最後に
•  Ameba Technology Laboratoryではエンジニアを募集して
います!
•  [email protected]
•  Hadoop / データマイニング / 機械学習/ 検索 などに
興味がある人はお声がけください。 63
ご清聴ありがとうございました。