hbaseを用いたグラフdb「hornet」
DESCRIPTION
Hadoop Conference Japan 2013 WinterのLTで発表した資料です。TRANSCRIPT
HBaseを用いたグラフDB「Hornet」
株式会社サイバーエージェント アメーバ事業本部 Ameba Technology Laboratory 鈴木 俊裕
自己紹介
• 鈴木 俊裕 • 株式会社サイバーエージェント – アメーバ事業本部 – Ameba Technology Laboratory
• Hadoop/Hiveを用いたデータ解析基盤の運用、HBaseを用いたグラフDB「Hornet」の運用
• Twi<er @brfrn169
話すこと
• HBaseを用いたグラフDB「Hornet」について – 設計について – 運用について
• HBaseを知っている人向けです
Hornetについて
背景
• 昨年、「Ameba」のスマートフォン向けプラットフォームをリリース
背景
• デカグラフ構想 – 各サービスのユーザー層を「ミニグラフ」と位置づ
け、1つの巨大なスマートフォン向けサービス(デカグラフ)を構築するという構想
ミニグラフ
ミニグラフ
ミニグラフ
ミニグラフ
ミニグラフ
ミニグラフ
デカグラフ
背景
• そこで、ユーザのグラフ構造を保持するデータベースが必要 – データが大量になるのでスケールするデータベー
ス
HBase
なぜHBaseか
• スケールする • 書き込みが速い、そこそこの読み込み速度 • レンジスキャン • CAS操作、インクリメント操作 • 解析基盤にHadoopを用いていたため、ノウハ
ウがあった
設計について
Hornetのデータモデル
• プロパティグラフ
1
2
3
ノード リレーションシップ
follow
follow Name Toshihiro
age 29
ノードの プロパティ
Name Ichiro
Age 29
Name Masahiro
Age 27
date 2013-‐01-‐01
favorite true
date 2013-‐01-‐10
favorite false
リレーションシップの プロパティ
ノードID リレーションシップのtype
Hornetのアーキテクチャ
• HBase + Gateway(Java)
Client
Gateway Gateway Gateway
RPC
HBase
HDFS
Hornetのスキーマ(リレーションシップ)
• RowKey: – hash(startNodeId) + startNodeId + type + direcUon + (Long.MAX_VALUE -‐ Umestamp) + endNodeId
• ColumnFamily: – “h”
• Column: – “” (空のバイト配列)
• Value: – シリアライズしたプロパティ
Hornetのスキーマ(リレーションシップ)
• 例:リレーションシップの追加(1が2をフォローする)
1
2
3
follow
Name Toshihiro
age 29
Name Ichiro
Age 29
Name Masahiro
Age 27
date 2013-‐01-‐01
favorite true
Hornetのスキーマ(リレーションシップ)
• 例:リレーションシップの追加(1が2をフォローする)
RowKey Column Key
value
Hornetのスキーマ(リレーションシップ)
• 例:リレーションシップの追加(1が2をフォローする)
RowKey Column Key
value
hash(1) + 1 + follow + OUTGOING + 200 + 2 h: date=2013-‐01-‐01, favorite=true
hash(2) + 2 + follow + INCOMING + 200 + 1 h: date=2013-‐01-‐01, favorite=true
プロパティの値 ノードID
ノードIDのハッシュ値
方向
Long.MAX_VALUE -‐ Umstamp
ノードID
タイプ
Hornetのスキーマ(リレーションシップ)
• 例:リレーションシップの追加(1が3をフォローする)
1
2
3
follow
follow Name Toshihiro
age 29
Name Ichiro
Age 29
Name Masahiro
Age 27
date 2013-‐01-‐01
favorite true
date 2013-‐01-‐10
favorite false
Hornetのスキーマ(リレーションシップ)
• 例:リレーションシップの追加(1が3をフォローする)
RowKey Column Key
value
hash(1) + 1 + follow + OUTGOING + 200 + 2 h: date=2013-‐01-‐01, favorite=true
hash(2) + 2 + follow + INCOMING + 200 + 1 h: date=2013-‐01-‐01, favorite=true
Hornetのスキーマ(リレーションシップ)
• 例:リレーションシップの追加(1が3をフォローする)
RowKey Column Key
value
hash(1) + 1 + follow + OUTGOING + 100 + 3 h: date=2013-‐01-‐10, favorite=false
hash(1) + 1 + follow + OUTGOING + 200 + 2 h: date=2013-‐01-‐01, favorite=true
hash(3) + 3 + follow + INCOMING + 100 + 1 h: date=2013-‐01-‐10, favorite=false
hash(2) + 2 + follow + INCOMING + 200 + 1 h: date=2013-‐01-‐01, favorite=true
Hornetのスキーマ(リレーションシップ)
• 例:リレーションシップの取得(1がフォローしてる人を取得)
1
2
3
follow
follow Name Toshihiro
age 29
Name Ichiro
Age 29
Name Masahiro
Age 27
date 2013-‐01-‐01
favorite true
date 2013-‐01-‐10
favorite false
Hornetのスキーマ(リレーションシップ)
• 例:リレーションシップの取得(1がフォローしてる人を取得)
RowKey Column Key
value
hash(1) + 1 + follow + OUTGOING + 100 + 3 h: date=2013-‐01-‐10, favorite=false
hash(1) + 1 + follow + OUTGOING + 200 + 2 h: date=2013-‐01-‐01, favorite=true
hash(3) + 3 + follow + INCOMING + 100 + 1 h: date=2013-‐01-‐10, favorite=false
hash(2) + 2 + follow + INCOMING + 200 + 1 h: date=2013-‐01-‐01, favorite=true
hash(1) + 1 + follow + OUTGOING でプレフィックススキャン
Hornetのスキーマ(リレーションシップ)
• 例:リレーションシップの取得(1がフォローしてる人を取得)
RowKey Column Key
value
hash(1) + 1 + follow + OUTGOING + 100 + 3 h: date=2013-‐01-‐10, favorite=false
hash(1) + 1 + follow + OUTGOING + 200 + 2 h: date=2013-‐01-‐01, favorite=true
hash(3) + 3 + follow + INCOMING + 100 + 1 h: date=2013-‐01-‐10, favorite=false
hash(2) + 2 + follow + INCOMING + 200 + 1 h: date=2013-‐01-‐01, favorite=true
hash(1) + 1 + follow + OUTGOING でプレフィックススキャン
Hornetのスキーマ
• 設計のポイント – tall-‐narrow table
• データの偏りが起こらないように
– ノードIDのhash値をプレフィックス • 書き込み・読み込みの負荷分散
– 複数のプロパティの値をシリアライズして一行に • 使用メモリの節約
運用について
トピックス(1)
• 0.92.0系のHBaseと0.20.2系のHadoopを使っている(CDH)
• NNはFTサーバを使ってハードウェア冗長をしている – 当時はHAがなかった
• メジャーコンパクションは深夜に – メジャーコンパクション中はレスポンスタイムが上がる
• オートスプリットをONにしている – 一瞬レスポンスタイムが上がるが、現在のところ問題なし
トピックス(2)
• Zookeeperのセッションタイムアウトは短くしている(20秒) – ダウンタイムとのトレードオフ – 重いGCが起きたらRSが落ちてしまうかも(今のところ
落ちてない) • バックアップ – HBase-‐0.92.0ではレプリケーションがバグってて使え
なかった – スクリプトでWALをバックアップ用クラスタに転送して
適用している
障害事例(1)
• ハードウェア障害でRSがダウン – うまくフェイルオーバされた
• 該当Regionのダウンタイムは1分くらい
• 本番クラスタでMapReduceを行ったらRSが同時に7台死亡 – FullGCが発生 – 本番クラスタではMapReduce禁止
障害事例(2)
• アプリケーション側のバグで特定Rowに対する書き込み・読み込みが集中し、RSのCPUが100%に張り付いて重くなった – 該当RegionにメジャーコンパクションをかけたらCPU使用率が落ちた。KeyValueが増えすぎてScanのCPU負荷が上がった
– アプリケーション側のバグフィックス
ご清聴ありがとうございました