More Related Content Similar to 20141106_cwt-zenmyo-naito (20) More from cyberagent (20) 20141106_cwt-zenmyo-naito5. 5
Ameba Technology Laboratoryについて
•Amebaの大規模データを集約的に扱う組織
•2011年4月に開設、現在約25名が所属
株式会社サイバーエージェント
推薦
フィルタリング
ログ解析 データマイニング
検索
大規模 分散処理
(ログ解析基盤) 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クエリ実行
ジョブステータス取得
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化も検討中
株式会社サイバーエージェント 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
<投稿情報 (シリアライズ)> 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 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 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
最後に
•Ameba Technology Laboratoryではエンジニアを募集して います!
•akb-lab@cyberagent.co.jp
•Hadoop / データマイニング / 機械学習/ 検索 などに 興味がある人はお声がけください。
株式会社サイバーエージェント