サイバーエージェント 秋葉原ラボのHBase活
用事例
2018 Mar 15
CyberAgent, Inc. All Rights Reserved
1
● 梅田 永介
● 2012年6月入社
● 秋葉原ラボ所属 エンジニア
● データ解析基盤Patriotの開発・運用、グラフ構造を格納す
るためのデータベースの運用、その他いろいろなHBaseク
ラスタの運用
● HBase徹底入門という本を執筆しました
● 注目しているOSS
○ https://github.com/brfrn169/graphbase
※Hortonworks鈴木さんが作ってるグラフデータベース
自己紹介
2
株式会社サイバーエージェント
【設立】
1998年3月18日(サイバーの日)
もうすぐ設立20周年!!!
【事業内容】
メディア事業・インターネット広告事業・ゲーム事業・投資育成事業
【連結社員数】4,523 名 (2017年9月末時点)
【オフィス】 東京(渋谷/秋葉原)・大阪・福岡など
会社概要
3
サイバーエージェントの主な事業
4
● メディア事業部門に属する研究開発組織
● 2011年4月開設
● 現在、約34名が在籍
秋葉原ラボ
大規模
分散処理
情報検索
機械学習
データ
マイニング
マルチ
メディア
情報処理
5
● 事例紹介
○ データ解析基盤Patriot
○ ストリーム処理エンジン
● 運用改善
○ いろいろなツール
本日の内容
6
● 事例紹介
○ データ解析基盤Patriot
○ ストリーム処理エンジン
● 運用改善
○ いろいろなツール
本日の内容
7
● Hadoopベースのデータ解析基盤
○ HDFS, YARN, Hive, HBase, Flume, Spark, etc
○ 独自のワークフロースケジューラ(Patriot Workflow Scheduler)を
用いて集計などを行う
○ Apache Bigtopで内製化したパッケージを使用
● メディアサービスのデータを集約
○ 2.5 PB / 3.0 PB (3 replica)
■ 5〜7 TB / day
○ 約700テーブル、12,000,000パーティション
○ 6000スケジュールジョブ + アドホックジョブ
システム概要
8
● 構成管理
○ AnsibleでInventoryを環境ごとに用意
● 監視・モニタリング
○ Sensu, Grafana/OpenTSDB
○ Kafka Manager
○ Burrow
システム概要
● HBase 1.3.1 + patch
● Hadoop 2.8.1 + patch
● Spark 2.1.0 + patch
● Hive 2.1.1 + patch
● Zookeeper 3.4.6
● Flume 1.8.0 (trunk) + patch
● Presto YARN 1.5
○ Presto 0.193
○ Slider 0.92.0
● Kafka 0.11.0
● Zeppelin 0.7.3 + patch
利用中のパッケージ
10
パブリッククラウドレコメンデーションシステム
システム構成
Patriot
データ転送管理
ストリーム処理エンジン
HTTP API
/ WebUIMySQL
etc..
Logs
11
● ログデータの集計結果の集約
● レコメンデーションジョブの処理結果の集約
● モニタリングデータの集約
PatriotにおけるHBaseの役割
12
● Flume、MySQLレプリケーションなどで収集したデータを
Hiveを用いて集計している
● Hiveで集計された結果はHBaseに集約され、WebUIや
HTTP APIなどから参照される
ログデータの集計結果の集約
13
● FlumeなどでデータをHDFSに保存
ログデータの集計結果の集約
14
HDFS
YARN
HBase
Spark MapReduce
Hive
Patriot
Workflow
Scheduler
HTTP API
/Web UI
flume
● Patriot Workflow Schedulerが集計Jobを起動
ログデータの集計結果の集約
15
HDFS
YARN
HBase
Spark MapReduce
Hive
Patriot
Workflow
Scheduler
集計Job 集計Job HTTP API
/Web UI
flume
Hive on MapReduce
or
Hive on Spark
● 集計結果をHBaseに出力
ログデータの集計結果の集約
16
HDFS
YARN
HBase
Spark MapReduce
Hive
Patriot
Workflow
Scheduler
集計Job 集計Job HTTP API
/Web UI集計結果
集計結果
flume
● HBaseに出力した結果をWeb UIなどで参照
ログデータの集計結果の集約
17
HDFS
YARN
HBase
Spark MapReduce
Hive
Patriot
Workflow
Scheduler
集計Job 集計Job HTTP API
/Web UI集計結果
集計結果
flume
● 内製のHBaseスキーマ管理ライブラリ(Blackhawk)を用い
て管理
スキーマ
18
● スキーマ定義を一元管理し、アプリケーションデータと
HBaseのKeyValueの変換を実現
● SQLライクなクエリでKeyValueを扱うことができる
○ CLI、JDBCドライバを提供
● Hive Integration
○ HBaseの多様なスキーマに対してHiveで処理することが可能
● 今後はHBase以外もサポートする汎用的なものになる予
定
Blackhawk
19
● 使用例
○ スキーマ定義の登録
○ データの登録
○ データの参照
Blackhawk
20
● スキーマ定義の登録
Blackhawk
スキーマリポジトリ
(Zookeepr,HBaseなど)
Blackhawk
21
define relation example{
service string key,
action string key,
val number
};
define primary schema s_example for
example{
table "example-metrics",
row suffix("-"){service}:{action}:,
family "f",
qualifier “”,
value val
};
● スキーマ定義の登録
Blackhawk
スキーマリポジトリ
(Zookeepr,HBaseなど)
Blackhawk
22
relation定義
schema定義
define relation example{
service string key,
action string key,
val number
};
define primary schema s_example for
example{
table "example-metrics",
row suffix("-"){service}:{action}:,
family "f",
qualifier “”,
value val
};
● データの登録
Blackhawk
スキーマリポジトリ
(Zookeepr,HBaseなど)
Blackhawk
23
relation定義
schema定義
insert into example
values(‘foo’,’bar’,1000);
HBase
example
define relation example{
service string key,
action string key,
val number
};
define primary schema s_example for example{
table "example-metrics",
row suffix("-"){service}:{action}:,
family "f",
qualifier “”,
value val
};
RowKey Column value
● データの登録
Blackhawk
スキーマリポジトリ
(Zookeepr,HBaseなど)
Blackhawk
24
relation定義
schema定義
insert into example
values(‘foo’,’bar’,1000);
HBase
example
define relation example{
service string key,
action string key,
val number
};
define primary schema s_example for example{
table "example-metrics",
row suffix("-"){service}:{action}:,
family "f",
qualifier “”,
value val
};
RowKey Column value
put ‘example-metrics’,’foo-bar’,’f:’,1000
● データの登録
Blackhawk
スキーマリポジトリ
(Zookeepr,HBaseなど)
Blackhawk
25
relation定義
schema定義
insert into example
values(‘foo’,’bar’,1000);
HBase
example
RowKey Column value
foo-bar f: 1000
define relation example{
service string key,
action string key,
val number
};
define primary schema s_example for example{
table "example-metrics",
row suffix("-"){service}:{action}:,
family "f",
qualifier “”,
value val
};
put ‘example-metrics’,’foo-bar’,’f:’,1000
● データの参照
Blackhawk
スキーマリポジトリ
(Zookeepr,HBaseなど)
Blackhawk
26
relation定義
schema定義
select * from example
where
service=’foo’ and action=’bar’;
HBase
example
RowKey Column value
foo-bar f: 1000
define relation example{
service string key,
action string key,
val number
};
define primary schema s_example for example{
table "example-metrics",
row suffix("-"){service}:{action}:,
family "f",
qualifier “”,
value val
};
● データの参照
Blackhawk
スキーマリポジトリ
(Zookeepr,HBaseなど)
Blackhawk
27
relation定義
schema定義
scan 'example',
{STARTROW=>’foo-bar’,
STOPROW=>’foo-bas’}
HBase
example
RowKey Column value
foo-bar f: 1000
define relation example{
service string key,
action string key,
val number
};
define primary schema s_example for example{
table "example-metrics",
row suffix("-"){service}:{action}:,
family "f",
qualifier “”,
value val
};
select * from example
where
service=’foo’ and action=’bar’;
● データの参照
Blackhawk
スキーマリポジトリ
(Zookeepr,HBaseなど)
Blackhawk
28
relation定義
schema定義
scan 'example',
{STARTROW=>’foo-bar’,
STOPROW=>’foo-bas’}
HBase
example
RowKey Column value
foo-bar f: 1000
define relation example{
service string key,
action string key,
val number
};
define primary schema s_example for example{
table "example-metrics",
row suffix("-"){service}:{action}:,
family "f",
qualifier “”,
value val
};
select * from example
where
service=’foo’ and action=’bar’;
● データの参照
Blackhawk
スキーマリポジトリ
(Zookeepr,HBaseなど)
Blackhawk
29
relation定義
schema定義
scan 'example',
{STARTROW=>’foo-bar’,
STOPROW=>’foo-bas’}
HBase
example
RowKey Column value
foo-bar f: 1000
define relation example{
service string key,
action string key,
val number
};
define primary schema s_example for example{
table "example-metrics",
row suffix("-"){service}:{action}:,
family "f",
qualifier “”,
value val
};
select * from example
where
service=’foo’ and action=’bar’;
| service | action | val |
-----------+----------+---------
| foo | bar | 1000 |
● Patriot上の大規模データを活用し、ユーザ一人一人に
あったコンテンツのレコメンドを提供
● レコメンデーションジョブがレコメンデーションのための
データを作成し、HBaseに集められる
● HBaseに集められたデータはHBaseのレプリケーション機
能により、別クラスタのHBaseに書き込まれる
レコメンデーションのためのデータの集約
30
レコメンデーションのためのデータの集約
31
外部データソース
(S3、GCS、REST API、...)
HDFS
YARN
HBase
Spark
Recommendation Job
Reporting Job
レシピ
レコメンデーション
システムHBase
データソースやアルゴリズム、フィルタなど
の処理のパイプラインをレシピと呼ばれる1
つのファイルで管理
Patriotクラスタ 別のクラスタ
レコメンデーションのためのデータの集約
32
外部データソース
(S3、GCS、REST API、...)
HDFS
YARN
HBase
Spark
Recommendation Job
Reporting Job
レシピ
レコメンデーション
システムHBase
別のクラスタ
レコメンデーションジョブの処理結果は
HBaseに出力される
Patriotクラスタ
レコメンデーションのためのデータの集約
33
外部データソース
(S3、GCS、REST API、...)
HDFS
YARN
HBase
Spark
Recommendation Job
Reporting Job
レシピ
レコメンデーション
システムHBase
Replication
別のクラスタ
PatriotクラスタのHBase -> 別のクラスタの
HBaseにRepliacation機能による書き込み
Patriotクラスタ
レコメンデーションのためのデータの集約
34
外部データソース
(S3、GCS、REST API、...)
HDFS
YARN
HBase
Spark
Recommendation Job
Reporting Job
レシピ
レコメンデーション
システムHBase
別のクラスタPatriotクラスタ
万が一Patriotクラスタに問題が発生したと
しても、レコメンデーションシステムは処理を
継続できる
● Sensu + 独自プラグインで各コンポーネントのメトリクスを
取得し、OpenTSDBに集約
● 集約したメトリクスはGrafanaで可視化
メトリクスデータの集約
35
● 時系列データベース
● HBaseのユースケースとして有名
● HBase以外にもCassandra,Google Cloud Bigtableなど
もバックエンドストレージとして利用可能
● Async HBaseという独自のHBase非同期クライアントを用
いている
● Grafanaとも連携可能
OpenTSDB
36
● 監視対象サーバのsensu-clientが各コンポーネントのメト
リクスを収集してsensu-serverに送信
モニタリングデータの流れ
sensu-server Grafana
監視対象サーバ
各コンポーネント
(HDFS,HBaseなど)
sensu-client
自作plugin
OpenTSDB
(HBase)
37
監視対象サーバ
各コンポーネント
(HDFS,HBaseなど)
sensu-client
自作plugin
監視対象サーバ
各コンポーネント
(HDFS,HBaseなど)
sensu-client
自作plugin
● sensu-serverはsensu-clientから受け取ったデータを加工
してOpenTSDBに登録
○ この時、どのサーバの情報かをタグとして設定
モニタリングデータの流れ
sensu-server Grafana
監視対象サーバ
各コンポーネント
(HDFS,HBaseなど)
sensu-client
自作plugin
OpenTSDB
(HBase)
38
監視対象サーバ
各コンポーネント
(HDFS,HBaseなど)
sensu-client
自作plugin
監視対象サーバ
各コンポーネント
(HDFS,HBaseなど)
sensu-client
自作plugin
● GrafanaはOpenTSDBを参照しグラフを描画
モニタリングデータの流れ
sensu-server Grafana
監視対象サーバ
各コンポーネント
(HDFS,HBaseなど)
sensu-client
自作plugin
OpenTSDB
(HBase)
39
監視対象サーバ
各コンポーネント
(HDFS,HBaseなど)
sensu-client
自作plugin
監視対象サーバ
各コンポーネント
(HDFS,HBaseなど)
sensu-client
自作plugin
● 温かみのある手運用 + 独自ツール
○ 独自ツールに関しては後述
○ 手運用部分に関してはクラスタ管理ツール開発中
● HBaseのバックアップ
○ Snapshotを作ってバックアップサーバにExportSnapshot
運用
40
● ソフトウェアの継続的なのバージョンアップ
● Blackhawkを発展させ、HBase以外にも適用できるように
● OpenTSDBのデータの活用
これからの予定
41
● 事例紹介
○ データ解析基盤Patriot
○ ストリーム処理エンジン
● 運用改善
○ いろいろなツール
本日の内容
42
● SQLライクな独自のクエリ言語「ZeroQL」を登録しておくこ
とでログ(JSON形式)をリアルタイムに処理することができ
る
システム概要
SELECT
count(*) AS foo, sum(`...`) AS bar
FROM
flume(`.datetime`) DISTINCT ON `.uuid` FOR 10m
WHERE ` ... `
GROUP BY `{
user_id: ...
}`
PARTITION BY user_id
INTERVAL 1d, NONE
GET /v1/report.json?column.user_id=1
HTTP/1.1 200 OK
Content-type: application/json
{
“rows”: [
{
“user_id”: 1,
“foo”: 100,
“bar”: 200
}
[
}
ZeroQL データ取得例
43
● サポートしている集約関数
○ COUNT(*) : イベントの件数
○ SUM(...) : 合計
○ MAX(...) : 最大値
○ MIN(...) : 最小値
○ LATEST(...) : 最新値
○ LATEST_N(..., n) : 最新のn件
○ LATEST_SET_N(..., n) : 最新のn件(重複を除く)
システム概要
44
● レコメンデーション、広告配信、プッシュ通知などの配信制
御・精度向上、各種指標のリアルタイムのレポーティング
などで活用
● 現在3クラスタ
○ プライベートクラウド/AWS(HBase用・DynamoDB用)
● 使用しているディストリビューション
○ CDH5.11.1 + patch
■ HBASE-18042 など
システム概要
45
アーキテクチャ
46
アーキテクチャ
47
Write Read
アーキテクチャ
48
前提条件
・イベントは重複して届くことがある
・イベントが届く順序は保証されない
Event Processor
49
Event Processor
50
イベントが届く順序が保証されないため、ど
のような順序で到着しても問題ないように処
理する
→ 可換モノイドとしてデータ構造と処理を抽
象化
モノイドに関しては以前別のイベントで発表した
資料に説明があるのでそちらを参照願います。
https://www.slideshare.net/EiichiSato/zero-802
37397
Event Processor
51
イベントが重複して届く可能性があるため重
複イベントを除外する必要がある
→ Redisに到着したイベントの IDを一定期間
保持し、重複チェックに用いる
Event Processor
52
書き込みデータの数が最大数 (設定値)を超えるか、
最小滞在時間(設定値)を超えるまでバッファリングさ
れる。また、同一RowKeyに対する操作であれば操
作をまとめる
→書き込み数を安定化することで HBaseなのどスト
レージへの負荷を安定させる効果がある
Event Processor
53
モノイドによってIncrement,Put,CheckAndPutを使
い分ける。
CheckAndPutでは競合が発生する可能性がある
→競合が起こった場合は指数バックオフにより一定
時間後にリトライ(ジッターも用いる)する
Event Processor
54
モノイドによってIncrement,Put,CheckAndPutを使
い分ける。
CheckAndPutでは競合が発生する可能性がある
→競合が起こった場合は指数バックオフにより一定
時間後にリトライ(ジッターも用いる)する
このシステム的に短時間の書き込みロストが許容さ
れている
→Async WALを有効(putするときのDurabilityに
ASYNC_WALを設定)にする
アーキテクチャ
55
Query Server
56
Query Server
57
このシステムは複数のサービスから使われている
ため、単一のサービスがすべてのリソースを専有す
ることを防止する必要がある
→テーブルごとの同時リクエスト数が上限 (設定値)
を超えた場合503を返す(クライアント側でリトライ処
理が必要。指数バックオフ &ジッター推奨)
Query Server
58
キャッシュにデータがなければ
ストレージから取得
● ZeroQLの内容により変化
スキーマ
59
スキーマ
60
SELECT
count(*) AS foo
FROM
flume(`.datetime`) DISTINCT ON `.uuid` FOR 10m
WHERE ` ... `
GROUP BY `{
user_id: .user_id,
device: .device
}`
PARTITION BY user_id
INTERVAL 1d
ZeroQL
スキーマ
61
SELECT
count(*) AS foo
FROM
flume(`.datetime`) DISTINCT ON `.uuid` FOR 10m
WHERE ` ... `
GROUP BY `{
user_id: .user_id,
device: .device
}`
PARTITION BY user_id
INTERVAL 1d
ZeroQL
ZeroQL
アクセス局所性のため、 PARTITION BY
user_id, page_idだったとしても、hashは
user_idだけを使うなど工夫している
スキーマ
62
SELECT
count(*) AS foo
FROM
flume(`.datetime`) DISTINCT ON `.uuid` FOR 10m
WHERE ` ... `
GROUP BY `{
user_id: .user_id,
device: .device
}`
PARTITION BY user_id
INTERVAL 1d
ZeroQL
ZeroQL
スキーマ
63
SELECT
count(*) AS foo
FROM
flume(`.datetime`) DISTINCT ON `.uuid` FOR 10m
WHERE ` ... `
GROUP BY `{
user_id: .user_id,
device: .device
}`
PARTITION BY user_id
INTERVAL 1d
ZeroQL
ZeroQL
スキーマ
64
SELECT
count(*) AS foo
FROM
flume(`.datetime`) DISTINCT ON `.uuid` FOR 10m
WHERE ` ... `
GROUP BY `{
user_id: .user_id,
device: .device
}`
PARTITION BY user_id
INTERVAL 1d
ZeroQL
ZeroQL
● G1GC
○ YouAreDeadExceptionの回避
● GCが一時的に止まる
○ http://www.evanjones.ca/jvm-mmap-pause.html
■ GCオプションに「-XX:+PerfDisableSharedMem」を設定
● RegionServer Group based Assignment
○ 特定のtableのRegionを特定のRegionServerのグループに割り
当てることができる
■ 障害時の影響範囲を限定することができる
● callqueueの分割
○ 書き込みの負荷が読み込みに影響するのを防止
HBaseのチューニング
65
● HMasterのデッドロック防止
○ HBASE-11290
■ hbase.assignment.zkevent.workers = 1 で回避
● BoundedByteBufferPoolを使わないようにする
○ HBaseはBoundedByteBufferPoolを使用してヒープの断片化を
防いでいるが、G1GCの場合は不要
● HBASE-17072 (CPU usage starts to climb up to 90-100% when
using G1GC; purge ThreadLocal usage)
○ 秋葉原ラボのメンバーが活躍
HBaseのチューニング
66
● Cloudera Managerによる管理
● HBaseのバックアップ
○ Snapshotを作ってS3にExportSnapshot
● slaveサーバ(DataNode + RegionServer)の増設を自動
化
○ 急なリクエストの増加にも耐えられるように
○ Cloudera Manager APIでの操作を含めたAMIの作成
運用
67
● いろいろなストレージへの対応
○ Apache Phoenix / Redis Cluster
● Join機能の実装
● 集約関数の追加
● 性能面のさらなる改善
これからの予定
68
● 事例紹介
○ データ解析基盤Patriot
○ ストリーム処理エンジン
● 運用改善
○ いろいろなツール
本日の内容
69
● HBaseにはHBase ShellというCLIが付属しているがやや
熟練者向けのイメージ
● 熟練者でなくても扱うためのツールが欲しかったので随時
ツールを作成している
● 現在は以下のツールが存在する
○ テーブル管理ツール
○ Replication peer管理ツール
○ RegionServer Group管理ツール
いろいろなツール
70
● Namespaceの一覧表示
● Namespaceの作成・削除
● Tableの一覧表示
● Tableの作成・変更・削除
● ColumnFamilyの作成・変更・削除
テーブル管理ツール
71
テーブル作成例
72
テーブル作成例
73
テーブル作成例
74
● Replication Peerの一覧表示
● Replication Peerの追加・削除
○ TableやColumnFamily指定も可能
● Replication Peerの有効化・無効化
Replication Peer管理ツール
75
Replication Peer追加例
76
Replication Peer追加例
77
Replication Peer追加例
78
● RegionServer Groupの一覧表示
● RegionServer Groupの追加・削除
● RegionServer GroupへのRegionServer割当
● RegionServerを別Groupへ移動
● RegionServer GroupへのTable割当
RegionServer Group管理ツール
79
Groupの追加
80
Groupの追加
81
Groupの追加
82
RegionServerの割当変更
83
RegionServerの割当変更
84
RegionServerの割当変更
85
● 乱立気味のHBaseクラスタの統合
○ DC移設に便乗
○ RegionServer Group based Assignmentの活用
○ 統合クラスタはHBase2.0で構築予定
■ 正式版のリリースはいつなのか
● 継続的な運用改善
今後の課題と展望
86
87
ご清聴ありがとうございました

サイバージェント 秋葉原ラボのHBase 活用事例