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 ご清聴ありがとうございました。
© Copyright 2024