hbase workshop in tokyo #001
DESCRIPTION
Presentation for HBase Workshop in Tokyo #001 May 20th, 2011TRANSCRIPT
HBase ワークショップ (第1回)アプリケーション設計1
by Tatsuya Kawano <http://twitter.com/tatsuya6502>2011年5月20日
1
2011年5月22日日曜日
[ ]自己紹介 Twitter: @tatsuya6502個人研究として、2009年秋から HBase を評価
ここ5年間は金融系のソフトウェアエンジニアをしてました
20年ほど前は TANDEM という分散コンピュータのシステム管理者をしてました
グラフィックデザイナーでもある(あった)ニューヨークの美大を卒業し数年間、現地アメリカ企業に勤務
6502は、高校時代に使っていた Apple II のCPU名
HBase エバンジェリスト!
2
2011年5月22日日曜日
[ ]転職しましたジェミナイ・モバイル・テクノロジーズでNOSQLデータベース「Hibari / 雲雀」の開発に関わってます
http://www.geminimobile.jp/
3
2011年5月22日日曜日
[ ]HBaseの英語ドキュメントが日本語に翻訳されました! (2011年5月2日公開)
あしたのオープンソース研究所http://oss.infoscience.co.jp/
4
2011年5月22日日曜日
[ ]ワークショップの進めかた
5
2011年5月22日日曜日
[ ]全6回5/20(金) アプリケーション設計1
6/16(木) HBaseのアーキテクチャ
7/15(金) OS、ハードウェア、ネットワーク
8/24(水) 運用
9月後半 アプリケーション設計2
10月後半 テスト、パフォーマンスチューニング
詳しくは http://j.mp/HBase3 大文字小文字は正確に
6
2011年5月22日日曜日
[ ]本日のお題:アプリケーション設計HBaseの性能特性と HBaseの用途(向き・不向き)
設計上の注意点(テーブル設計、行キーの分散)
API利用上の注意点
Map Reduce利用時の注意点
Twitter ハッシュタグ #hbaseworkshop
7
2011年5月22日日曜日
[ ]HBaseの用途について
8
2011年5月22日日曜日
[ ]HBaseの特徴柔軟なテーブル構造
事前に定義するのはカラムファミリーのみ
強い一貫性
古いデータが見えることがない(縮退時も同様)
大規模データ向け
自動シャーディング
高可用性 (HA) ̶ 故障を優雅に扱う
数十億件を超えたあたりから本領発揮9
2011年5月22日日曜日
[ ]HBaseの特徴インデックスを持たない。行(row) はキー順に格納される
単純化されたクエリ。SQLはサポートしない
テーブルの join はサポートしない
Hadoop Map Reduce (MR) をネイティブにサポート
10
2011年5月22日日曜日
[ ]柔軟なテーブル構造
11http://www.slideshare.net/clehene/hbase-and-hadoop-at-adobe2011年5月22日日曜日
[ ]write性能 と read性能のトレードオフ
一般的なRDB: read 性能 > write 性能
HBase: read 性能 < write 性能
(詳しくは、第2回 アーキテクチャで説明します)
12
2011年5月22日日曜日
[ ]read 性能を引き出すための設計
行キーの設計(分散させつつ、局所性を持たせる)
テーブルの設計(非正規化) 行キーの選択
(後ほどディスカッション)
13
2011年5月22日日曜日
[ ]Facebook メッセージング
14
2011年5月22日日曜日
[ ]Adobe Systems
15
2011年5月22日日曜日
[ ]Adobe Systems
16
2011年5月22日日曜日
[ ]Adobe Systems
17
2011年5月22日日曜日
[ ]Mozilla Soccoro
18
2011年5月22日日曜日
[ ]Mozilla Soccoro
19
2011年5月22日日曜日
[ ]OpenTSDB
20
2011年5月22日日曜日
[ ]OpenTSDB
21
2011年5月22日日曜日
[ ]Lily CMS
22
2011年5月22日日曜日
[ ]HBaseをどんな用途に使いたいですか?
23
2011年5月22日日曜日
[ ]行キーの設計とリージョン分割
24
2011年5月22日日曜日
[ ]データ操作の基本API
put 行を挿入または上書き
get 指定したキーを持つ行を取得
scan キーの昇順に複数の行を取得(降順は不可)
delete 指定したキーを持つ行を削除
25
2011年5月22日日曜日
[ ]データ操作の基本API (CAS操作)
checkAndPut
checkAndDelete
incrementColumnValue
26
2011年5月22日日曜日
[ ]自動シャーディングテーブルは行キーでソートされている
テーブルサイズが拡大すると、キー空間を自動的に分割する
分割した各領域を「リージョン」と呼ぶ
27
[00 - ) [00 - )
[00 - 62)
[62 - )
[00 - 62)
[62 - )
[00 - 28)
[28 - 62)
[62 - 80)
[80 - )
2011年5月22日日曜日
[ ]自動シャーディングリージョンはクラスター上の各ノードにランダムに配置される(1ノードあたり数十~数百リージョン)
28
[00 - 05)
[00 - 05)
[05 - 12)
[12 - 18)
[18 - 22)
[18 - 22)
[05 - 12)
[12 - 18)
2011年5月22日日曜日
[ ]write時に考慮すること
行キーの値の分布に気を配る(分散させる)
連番だと1つのリージョンにアクセスが集中するのでNG
これをホットスポットと言います
キーの重複に注意
putにはユニーク制約がないので、他の行を上書きしてしまう可能性がある
29
2011年5月22日日曜日
[ ]read時に考慮すること
データの局所性(ローカリティ)が重要
ローカリティを持たせることで、関連する行をまとめて scan できる
ランダムなキー(例:UUID)は避けたほうがよい
検索条件を吟味し、検索に適したキーを設計する
30
2011年5月22日日曜日
[ ]行キーの例Webコンテンツを格納するテーブル
行キー → <逆順のURL>
org.apache.hbase
org.apache.hbase.wiki
org.apache.hbase.wiki.home
org.apache.hbase.wiki.faq
org.apache.zookeeper
31
2011年5月22日日曜日
[ ]行キーの例ユーザーの行動ログ
行キー → <user> - <Long.MAX_VALUE - System.currentTimeMills()> -<event id>
0001122-200023402-010 ・・・10:10:42 am
0001122-200050000-009 ・・・10:08:29 am
0003344-200098881-550
32
2011年5月22日日曜日
[ ]行キーの分散が難しいとき
キーが連番の場合はどうしたらいいのか?(例:伝票番号)
Saltテクニック
行キーの先頭にランダムな文字を追加する例:0~9(10種類) A~Z(26種類)
検索では、本来のキーと全ての文字との組み合わせを使う
例:伝票番号 00100を検索0-00100、1-00100、2-00100 ... 9-00100
33
2011年5月22日日曜日
[ ]バランサーについて
34
2011年5月22日日曜日
[ ]どんな行キーをお使いですか?
35
2011年5月22日日曜日
[ ]テーブルの設計
36
2011年5月22日日曜日
[ ]カラムファミリー
行の一貫性は、カラムファミリーをまたがって保証される
カラムファミリーごとに別のファイルに格納される
ローカリティ
テーブル構造
37
2011年5月22日日曜日
[ ]非正規化により苦手な read を克服
やってはいけないこと
1 + N 回 get問題
テーブルの非正規化
38
2011年5月22日日曜日
[ ]正規化されたテーブル
39http://www.mediawiki.org/wiki/Manual:Database_layout/ja
ページ(記事) 変更履歴 本文
MediaWiki のテーブル設計(MySQL)
外部リンク サイト内リンク
1
1 0..*
0..*
2011年5月22日日曜日
[ ]変更履歴と本文は、タイムスタンプで表現
リンクの一覧は、カラム番号で表現
テーブルの非正規化の例
40
2011年5月22日日曜日
[ ]OpenTSDB
Read の性能向上のために複数行の情報を1行にまとめる
例) 行:分単位、カラムファミリー:5秒単位
データのパッキング
41
2011年5月22日日曜日
[ ]テーブル設計で工夫している点、悩んでいる点は?
42
2011年5月22日日曜日
[ ]APIでハマりやすいポイント
43
2011年5月22日日曜日
[ ]new Configuration() は重い操作
HTableはスレッドセーフではない
タイムスタンプを指定する時は注意が必要
ビギナーがはまりやすい落とし穴
44
2011年5月22日日曜日
[ ] new Configuration()
45
2011年5月22日日曜日
[ ]HTable はスレッドセーフでない
46
2011年5月22日日曜日
[ ]Delete 操作の怪
47
2011年5月22日日曜日
[ ]タイムスタンプを指定する時の注意
48
2011年5月22日日曜日
[ ]カラムファミリー名・カラム名は短めに
49
2011年5月22日日曜日
[ ]クライアントからの行ロックは推奨しない
リージョンのflushで解除されてしまう
Lily の RowLog ライブラリーがおすすめ
複数行のトランザクション
50
2011年5月22日日曜日
[ ] // === ステップ1 === // 各テーブルの put の準備
Put putA = new Put(テーブルAの行キー); putA.set(テーブルAの更新後の値);
Put putB = new Put(テーブルBの行キー); putB.set(テーブルBの更新後の値);
Put putC = new Put(テーブルCの行キー); putC.set(テーブルCの更新後の値);
複数行のトランザクション
51
2011年5月22日日曜日
[ ] // === ステップ2 === // テーブルBとCテーブルの更新内容を RowLog に登録する。 // テーブルAの行の RowLog 用カラムファミリーに登録される。
RowLogMessage walB = wal.putMessage(rowA, Bytes.toBytes("テーブルB"), putB, putA)
RowLogMessage walC = wal.putMessage(rowA, Bytes.toBytes("テーブルC"), putC, putA)
複数行のトランザクション
52
2011年5月22日日曜日
[ ]複数行のトランザクション
53
// === ステップ3 === // 更新の前提条件チェックと、テーブルAの更新。 // ここでは、前提条件として、テーブルAの指定したカラムの更新前の値と // 現在の値を比較し、それらが同一なら、他のプロセスと競合していないと // みなして更新する。
boolean tableA_updated = テーブルA.checkAndPut(更新前の値、putA);
boolean tableB_updated = false; boolean tableC_updated = false;
2011年5月22日日曜日
[ ]複数行のトランザクション
54
// === ステップ4 === // 登録しておいた テーブルBとテーブルCの更新内容をすぐに実行する。 if (tableA_updated) { tableB_updated = wal.processMessage(walB); tableC_updated = wal.processMessage(walC); }
2011年5月22日日曜日
[ ]ハマったこと、工夫していること?
55
2011年5月22日日曜日
[ ]Map Reduceでのノウハウ
56
2011年5月22日日曜日
[ ]Hadoop MRとの親和性性能の最適化
HBase は MR の主要なアクセスパターンであるwrite とシーケンシャル read に最適化されている
Yahoo! Cloud Serving Benchmark Report v4.4 http://research.yahoo.com/node/320257
2011年5月22日日曜日
[ ]Hadoop MRとの親和性: HDFS
HBase では、データファイルが HDFS に格納されている
MR から、HFile を直接出力できる
バージョン 0.90 以降は、オンライン中に差分を反映できる
原理上は、オンライン中の HFile の読み込みも可能
HFile の内容は不変なので、安全にアクセスできる
58
2011年5月22日日曜日