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

20141106_cwt-zenmyo-naito

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