37
1 HBase ススススススススススス 2013.3 スス

HBase スキーマ設計のポイント

Embed Size (px)

Citation preview

Page 1: HBase スキーマ設計のポイント

1

HBaseスキーマ設計のポイント

2013.3松井

Page 2: HBase スキーマ設計のポイント

2

HBase でSNS の

データストレージ

やりたいこと

Page 3: HBase スキーマ設計のポイント

3

SNS によくある問題

ユーザデータの肥大化

スケールアウトしない

パフォーマンス

悪化

Page 4: HBase スキーマ設計のポイント

4

• 優れた書き込み・読み出し性能

• 自動シャーディング(データ分散)

• 自動フェイルオーバー(障害復旧)

• 行レベルでのアトミック性の保証

(更新の一貫性)

HBase の優れた点のおさらい

Page 5: HBase スキーマ設計のポイント

5

HBase 特有のスキーマ設計

Page 6: HBase スキーマ設計のポイント

6

SNS タイムラインの機能要件は?

自分+友達の投稿を表示

最新投稿順に並べたい

指定件数で次へ次へ

Page 7: HBase スキーマ設計のポイント

7

結論、 HBase でのタイムラインのテーブル設計はこうなった

RowkeyTL のユーザ ID + リバース timestamp + 投稿したユーザ ID

ColumnFamily: Qualifiermanga : title タイトル : nickname ニックネーム : like_count いいね数 : koma_count コメント数

Page 8: HBase スキーマ設計のポイント

8

デモ

Page 9: HBase スキーマ設計のポイント

9

RDB じゃない!

理解のポイント

Page 10: HBase スキーマ設計のポイント

10

• JOIN ができない• 並べ替えができない

RDB ではないことによる制約

Page 11: HBase スキーマ設計のポイント

11

JOIN と並べ替えができる場合

User

Manga

FriendJOIN

+並べ替え

Page 12: HBase スキーマ設計のポイント

12

JOIN できない = 同じデータをコピーして保持

User

Manga

Friend

TimeLine

Page 13: HBase スキーマ設計のポイント

13

• 行レベルでのアトミック性の保証 - 同じ Rowkey での更新状態の一貫性。 - 他の KVS ( Cassandra 、 MongoDB など)に

比べて データの一貫性と速度を両立。

• INDEX が 1 箇所にだけある - Rowkey には検索インデックス

RDB に近いところ

Page 14: HBase スキーマ設計のポイント

14

INDEX が1箇所

• データは以下の順でソートされて格納されている

RowkeyColumnFamily

QualifierTimestamp

Page 15: HBase スキーマ設計のポイント

15

• JOIN &並べ替えができない

→ 非正規化&複製2. INDEX が1箇所

→ Rowkey で検索

Hbase の特徴 まとめ

Page 16: HBase スキーマ設計のポイント

16

RowKey を活かす。

いいたいこと

= RowKey だけで検索できるようにする!

Page 17: HBase スキーマ設計のポイント

17

• タイムラインの要件

1.指定した件数の自分+友達のデータを取得できる。

(クエリではユーザ ID と件数を指定する)

2.最新順で並んでいる。

要件を考えてから Rowkey を設計する

Page 18: HBase スキーマ設計のポイント

18

• auto increment しない! ( = 意味のないキーはつくらない)

• フィルターしない!中身は見ない! (カラム単位のインデックスは使えない

ので )☓

RDB のノウハウを下手に利用しない

Page 19: HBase スキーマ設計のポイント

19

•レンジ SCAN•リバース Timestamp

Rowkey の検索手法

Page 20: HBase スキーマ設計のポイント

20

SCAN ( Java API )Rowkey の範囲検索

ユーザ ID を Prefix にすることで、対象のデータの範囲の StartRow / StopRow

を決定できる。

ユーザ ID をキーにした検索

Page 21: HBase スキーマ設計のポイント

21

リバース timestamp

最新投稿を上にソートするテクニック

(新しい時間が小さい値になる)

Long.MAX_VALUE  - 現在時間 ( 9223372036854775807 )

最新順に並べる

Page 22: HBase スキーマ設計のポイント

22

100 _ 9223370672552094052 _ 1100 _ 9223370672551411750 _ 52100 _ 9223370672550612514 _ 100101 _ 9223370672551093583 _ 79101 _ 9223370672551093583 _ 7101 _ 9223370672550612514 _ 100102 _ 9223370672551093583 _ 79103…

実際のデータ

Page 23: HBase スキーマ設計のポイント

23

テーブル設計まとめ

「 DDI 」- Denormalization ( 非正規化 )

-Duplication ( 複製 )

-Intelligent Keys ( インテリジェントキー )

Page 24: HBase スキーマ設計のポイント

24

性能評価

Page 25: HBase スキーマ設計のポイント

25

どのぐらいスピードが出るのか?

• 書き込みの速度

• 読み込みの速度

しりたいこと

Page 26: HBase スキーマ設計のポイント

26

友達のタイムラインに猛烈にコピーしまくる

timeline

複製の懸念

POST timeline

timeline

timeline

timeline

timeline

timeline

投稿

timeline

timeline

timeline

timeline

Page 27: HBase スキーマ設計のポイント

27

この設計で ちゃんと速度出るの?

疑問

Page 28: HBase スキーマ設計のポイント

28

• HBase/Hadoop には CDH を使用– Cloudera‘s Distribution, including Apache Hadoop 4.2.0-1

• hadoop-2.0.0+922

• hbase-0.94.2+202

• 評価用環境としてアプリクラウドを利用– 仮想サーバー S x 8 台

• 仮想 CPU 4個、ディスク容量 320 GB 、メモリ容量 16GB

評価環境

Page 29: HBase スキーマ設計のポイント

29

評価環境

IP HDFS (HA/QJM) HBase ZooKeeper Other

10.112.21.20 Apache/AP

10.112.21.21 NameNode JournalNode HMaster ZooKeeper

10.112.21.22 NameNode (stand-by) JournalNode HMaster ZooKeeper

10.112.21.23 JournalNode ZooKeeper JobTracker

10.112.21.24 DataNode RegionServer TaskTracker

10.112.21.25 DataNode RegionServer TaskTracker

10.112.21.26 DataNode RegionServer TaskTracker

10.112.21.27 DataNode RegionServer TaskTracker

Page 30: HBase スキーマ設計のポイント

30

全体レコード数 平均応答ミリ秒1000 件 0 ~ 4ms

250 万件 0 ~ 4ms

3 億 5000 万件 0 ~ 4ms

TIMELINE テーブル へ 単発の PUT (書き込み)

Page 31: HBase スキーマ設計のポイント

31

タイムラインテーブルへバッチ PUT (同時書き込み=同時コピー数)

全体レコード数 友達数 平均応答ミリ秒3 億 5000 万件 10 人 0 ~ 4ms

1000 人 70 ~ 120ms

10000人 500 ~ 1200ms

Page 32: HBase スキーマ設計のポイント

32

SCAN (レンジ検索)

全体レコード数 自分のレコード数 平均応答

ミリ秒3 億 5000 万件 10 件 0 ~ 10ms

1000 件 0 ~ 10ms

10000 件 0 ~ 10ms

Page 33: HBase スキーマ設計のポイント

33

初回の SCAN (リージョンルックアップ)は遅い

全体レコード数 平均応答ミリ秒10 万件 0 ~ 10ms

8000 万件 50 ~ 90ms

3 億 5000 万件 100 ~ 500ms

Page 34: HBase スキーマ設計のポイント

34

まとめ

Page 35: HBase スキーマ設計のポイント

35

• Row Key を第一に考えて行う

• フィルターを使わずに STARTROW とエンドキーを指定したスキャン

で シンプルに行うことが有効

設計のまとめ

Page 36: HBase スキーマ設計のポイント

36

• 読み書きはレコードの母数に関係なく速い

• リージョンの初回ルックアップに多少時間がかかる

性能評価のまとめ

Page 37: HBase スキーマ設計のポイント

37

ご清聴ありがとうございました