hbase スキーマ設計のポイント
TRANSCRIPT
![Page 1: HBase スキーマ設計のポイント](https://reader036.vdocuments.site/reader036/viewer/2022070519/58f29abe1a28ab0e0c8b459b/html5/thumbnails/1.jpg)
1
HBaseスキーマ設計のポイント
2013.3松井
![Page 2: HBase スキーマ設計のポイント](https://reader036.vdocuments.site/reader036/viewer/2022070519/58f29abe1a28ab0e0c8b459b/html5/thumbnails/2.jpg)
2
HBase でSNS の
データストレージ
やりたいこと
![Page 3: HBase スキーマ設計のポイント](https://reader036.vdocuments.site/reader036/viewer/2022070519/58f29abe1a28ab0e0c8b459b/html5/thumbnails/3.jpg)
3
SNS によくある問題
ユーザデータの肥大化
スケールアウトしない
パフォーマンス
悪化
![Page 4: HBase スキーマ設計のポイント](https://reader036.vdocuments.site/reader036/viewer/2022070519/58f29abe1a28ab0e0c8b459b/html5/thumbnails/4.jpg)
4
• 優れた書き込み・読み出し性能
• 自動シャーディング(データ分散)
• 自動フェイルオーバー(障害復旧)
• 行レベルでのアトミック性の保証
(更新の一貫性)
HBase の優れた点のおさらい
![Page 5: HBase スキーマ設計のポイント](https://reader036.vdocuments.site/reader036/viewer/2022070519/58f29abe1a28ab0e0c8b459b/html5/thumbnails/5.jpg)
5
HBase 特有のスキーマ設計
![Page 6: HBase スキーマ設計のポイント](https://reader036.vdocuments.site/reader036/viewer/2022070519/58f29abe1a28ab0e0c8b459b/html5/thumbnails/6.jpg)
6
SNS タイムラインの機能要件は?
自分+友達の投稿を表示
最新投稿順に並べたい
指定件数で次へ次へ
![Page 7: HBase スキーマ設計のポイント](https://reader036.vdocuments.site/reader036/viewer/2022070519/58f29abe1a28ab0e0c8b459b/html5/thumbnails/7.jpg)
7
結論、 HBase でのタイムラインのテーブル設計はこうなった
RowkeyTL のユーザ ID + リバース timestamp + 投稿したユーザ ID
ColumnFamily: Qualifiermanga : title タイトル : nickname ニックネーム : like_count いいね数 : koma_count コメント数
![Page 8: HBase スキーマ設計のポイント](https://reader036.vdocuments.site/reader036/viewer/2022070519/58f29abe1a28ab0e0c8b459b/html5/thumbnails/8.jpg)
8
デモ
![Page 9: HBase スキーマ設計のポイント](https://reader036.vdocuments.site/reader036/viewer/2022070519/58f29abe1a28ab0e0c8b459b/html5/thumbnails/9.jpg)
9
RDB じゃない!
理解のポイント
![Page 10: HBase スキーマ設計のポイント](https://reader036.vdocuments.site/reader036/viewer/2022070519/58f29abe1a28ab0e0c8b459b/html5/thumbnails/10.jpg)
10
• JOIN ができない• 並べ替えができない
RDB ではないことによる制約
![Page 11: HBase スキーマ設計のポイント](https://reader036.vdocuments.site/reader036/viewer/2022070519/58f29abe1a28ab0e0c8b459b/html5/thumbnails/11.jpg)
11
JOIN と並べ替えができる場合
User
Manga
FriendJOIN
+並べ替え
![Page 12: HBase スキーマ設計のポイント](https://reader036.vdocuments.site/reader036/viewer/2022070519/58f29abe1a28ab0e0c8b459b/html5/thumbnails/12.jpg)
12
JOIN できない = 同じデータをコピーして保持
User
Manga
Friend
TimeLine
![Page 13: HBase スキーマ設計のポイント](https://reader036.vdocuments.site/reader036/viewer/2022070519/58f29abe1a28ab0e0c8b459b/html5/thumbnails/13.jpg)
13
• 行レベルでのアトミック性の保証 - 同じ Rowkey での更新状態の一貫性。 - 他の KVS ( Cassandra 、 MongoDB など)に
比べて データの一貫性と速度を両立。
• INDEX が 1 箇所にだけある - Rowkey には検索インデックス
RDB に近いところ
![Page 14: HBase スキーマ設計のポイント](https://reader036.vdocuments.site/reader036/viewer/2022070519/58f29abe1a28ab0e0c8b459b/html5/thumbnails/14.jpg)
14
INDEX が1箇所
• データは以下の順でソートされて格納されている
RowkeyColumnFamily
QualifierTimestamp
![Page 15: HBase スキーマ設計のポイント](https://reader036.vdocuments.site/reader036/viewer/2022070519/58f29abe1a28ab0e0c8b459b/html5/thumbnails/15.jpg)
15
• JOIN &並べ替えができない
→ 非正規化&複製2. INDEX が1箇所
→ Rowkey で検索
Hbase の特徴 まとめ
![Page 16: HBase スキーマ設計のポイント](https://reader036.vdocuments.site/reader036/viewer/2022070519/58f29abe1a28ab0e0c8b459b/html5/thumbnails/16.jpg)
16
RowKey を活かす。
いいたいこと
= RowKey だけで検索できるようにする!
![Page 17: HBase スキーマ設計のポイント](https://reader036.vdocuments.site/reader036/viewer/2022070519/58f29abe1a28ab0e0c8b459b/html5/thumbnails/17.jpg)
17
• タイムラインの要件
1.指定した件数の自分+友達のデータを取得できる。
(クエリではユーザ ID と件数を指定する)
2.最新順で並んでいる。
要件を考えてから Rowkey を設計する
![Page 18: HBase スキーマ設計のポイント](https://reader036.vdocuments.site/reader036/viewer/2022070519/58f29abe1a28ab0e0c8b459b/html5/thumbnails/18.jpg)
18
• auto increment しない! ( = 意味のないキーはつくらない)
• フィルターしない!中身は見ない! (カラム単位のインデックスは使えない
ので )☓
RDB のノウハウを下手に利用しない
![Page 19: HBase スキーマ設計のポイント](https://reader036.vdocuments.site/reader036/viewer/2022070519/58f29abe1a28ab0e0c8b459b/html5/thumbnails/19.jpg)
19
•レンジ SCAN•リバース Timestamp
Rowkey の検索手法
![Page 20: HBase スキーマ設計のポイント](https://reader036.vdocuments.site/reader036/viewer/2022070519/58f29abe1a28ab0e0c8b459b/html5/thumbnails/20.jpg)
20
SCAN ( Java API )Rowkey の範囲検索
ユーザ ID を Prefix にすることで、対象のデータの範囲の StartRow / StopRow
を決定できる。
ユーザ ID をキーにした検索
![Page 21: HBase スキーマ設計のポイント](https://reader036.vdocuments.site/reader036/viewer/2022070519/58f29abe1a28ab0e0c8b459b/html5/thumbnails/21.jpg)
21
リバース timestamp
最新投稿を上にソートするテクニック
(新しい時間が小さい値になる)
Long.MAX_VALUE - 現在時間 ( 9223372036854775807 )
最新順に並べる
![Page 22: HBase スキーマ設計のポイント](https://reader036.vdocuments.site/reader036/viewer/2022070519/58f29abe1a28ab0e0c8b459b/html5/thumbnails/22.jpg)
22
100 _ 9223370672552094052 _ 1100 _ 9223370672551411750 _ 52100 _ 9223370672550612514 _ 100101 _ 9223370672551093583 _ 79101 _ 9223370672551093583 _ 7101 _ 9223370672550612514 _ 100102 _ 9223370672551093583 _ 79103…
実際のデータ
![Page 23: HBase スキーマ設計のポイント](https://reader036.vdocuments.site/reader036/viewer/2022070519/58f29abe1a28ab0e0c8b459b/html5/thumbnails/23.jpg)
23
テーブル設計まとめ
「 DDI 」- Denormalization ( 非正規化 )
-Duplication ( 複製 )
-Intelligent Keys ( インテリジェントキー )
![Page 24: HBase スキーマ設計のポイント](https://reader036.vdocuments.site/reader036/viewer/2022070519/58f29abe1a28ab0e0c8b459b/html5/thumbnails/24.jpg)
24
性能評価
![Page 25: HBase スキーマ設計のポイント](https://reader036.vdocuments.site/reader036/viewer/2022070519/58f29abe1a28ab0e0c8b459b/html5/thumbnails/25.jpg)
25
どのぐらいスピードが出るのか?
• 書き込みの速度
• 読み込みの速度
しりたいこと
![Page 26: HBase スキーマ設計のポイント](https://reader036.vdocuments.site/reader036/viewer/2022070519/58f29abe1a28ab0e0c8b459b/html5/thumbnails/26.jpg)
26
友達のタイムラインに猛烈にコピーしまくる
timeline
複製の懸念
POST timeline
timeline
timeline
timeline
timeline
timeline
投稿
+
timeline
timeline
timeline
timeline
![Page 27: HBase スキーマ設計のポイント](https://reader036.vdocuments.site/reader036/viewer/2022070519/58f29abe1a28ab0e0c8b459b/html5/thumbnails/27.jpg)
27
この設計で ちゃんと速度出るの?
疑問
![Page 28: HBase スキーマ設計のポイント](https://reader036.vdocuments.site/reader036/viewer/2022070519/58f29abe1a28ab0e0c8b459b/html5/thumbnails/28.jpg)
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 スキーマ設計のポイント](https://reader036.vdocuments.site/reader036/viewer/2022070519/58f29abe1a28ab0e0c8b459b/html5/thumbnails/29.jpg)
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 スキーマ設計のポイント](https://reader036.vdocuments.site/reader036/viewer/2022070519/58f29abe1a28ab0e0c8b459b/html5/thumbnails/30.jpg)
30
全体レコード数 平均応答ミリ秒1000 件 0 ~ 4ms
250 万件 0 ~ 4ms
3 億 5000 万件 0 ~ 4ms
TIMELINE テーブル へ 単発の PUT (書き込み)
![Page 31: HBase スキーマ設計のポイント](https://reader036.vdocuments.site/reader036/viewer/2022070519/58f29abe1a28ab0e0c8b459b/html5/thumbnails/31.jpg)
31
タイムラインテーブルへバッチ PUT (同時書き込み=同時コピー数)
全体レコード数 友達数 平均応答ミリ秒3 億 5000 万件 10 人 0 ~ 4ms
1000 人 70 ~ 120ms
10000人 500 ~ 1200ms
![Page 32: HBase スキーマ設計のポイント](https://reader036.vdocuments.site/reader036/viewer/2022070519/58f29abe1a28ab0e0c8b459b/html5/thumbnails/32.jpg)
32
SCAN (レンジ検索)
全体レコード数 自分のレコード数 平均応答
ミリ秒3 億 5000 万件 10 件 0 ~ 10ms
1000 件 0 ~ 10ms
10000 件 0 ~ 10ms
![Page 33: HBase スキーマ設計のポイント](https://reader036.vdocuments.site/reader036/viewer/2022070519/58f29abe1a28ab0e0c8b459b/html5/thumbnails/33.jpg)
33
初回の SCAN (リージョンルックアップ)は遅い
全体レコード数 平均応答ミリ秒10 万件 0 ~ 10ms
8000 万件 50 ~ 90ms
3 億 5000 万件 100 ~ 500ms
![Page 34: HBase スキーマ設計のポイント](https://reader036.vdocuments.site/reader036/viewer/2022070519/58f29abe1a28ab0e0c8b459b/html5/thumbnails/34.jpg)
34
まとめ
![Page 35: HBase スキーマ設計のポイント](https://reader036.vdocuments.site/reader036/viewer/2022070519/58f29abe1a28ab0e0c8b459b/html5/thumbnails/35.jpg)
35
• Row Key を第一に考えて行う
• フィルターを使わずに STARTROW とエンドキーを指定したスキャン
で シンプルに行うことが有効
設計のまとめ
![Page 36: HBase スキーマ設計のポイント](https://reader036.vdocuments.site/reader036/viewer/2022070519/58f29abe1a28ab0e0c8b459b/html5/thumbnails/36.jpg)
36
• 読み書きはレコードの母数に関係なく速い
• リージョンの初回ルックアップに多少時間がかかる
性能評価のまとめ
![Page 37: HBase スキーマ設計のポイント](https://reader036.vdocuments.site/reader036/viewer/2022070519/58f29abe1a28ab0e0c8b459b/html5/thumbnails/37.jpg)
37
ご清聴ありがとうございました