hbase workshop in tokyo #001

58
HBase ワークショップ (第1回) アプリケーション設計1 by Tatsuya Kawano <http://twitter.com/tatsuya6502> 2011年5月20日 1 2011522日日曜日

Upload: tatsuya6502

Post on 08-Jul-2015

4.069 views

Category:

Technology


0 download

DESCRIPTION

Presentation for HBase Workshop in Tokyo #001 May 20th, 2011

TRANSCRIPT

Page 1: HBase Workshop in Tokyo #001

HBase ワークショップ (第1回)アプリケーション設計1

by Tatsuya Kawano <http://twitter.com/tatsuya6502>2011年5月20日

1

2011年5月22日日曜日

Page 2: HBase Workshop in Tokyo #001

[ ]自己紹介 Twitter: @tatsuya6502個人研究として、2009年秋から HBase を評価

ここ5年間は金融系のソフトウェアエンジニアをしてました

20年ほど前は TANDEM という分散コンピュータのシステム管理者をしてました

グラフィックデザイナーでもある(あった)ニューヨークの美大を卒業し数年間、現地アメリカ企業に勤務

6502は、高校時代に使っていた Apple II のCPU名

HBase エバンジェリスト!

2

2011年5月22日日曜日

Page 3: HBase Workshop in Tokyo #001

[ ]転職しましたジェミナイ・モバイル・テクノロジーズでNOSQLデータベース「Hibari / 雲雀」の開発に関わってます

http://www.geminimobile.jp/

3

2011年5月22日日曜日

Page 4: HBase Workshop in Tokyo #001

[ ]HBaseの英語ドキュメントが日本語に翻訳されました! (2011年5月2日公開)

あしたのオープンソース研究所http://oss.infoscience.co.jp/

4

2011年5月22日日曜日

Page 5: HBase Workshop in Tokyo #001

[ ]ワークショップの進めかた

5

2011年5月22日日曜日

Page 6: HBase Workshop in Tokyo #001

[ ]全6回5/20(金) アプリケーション設計1

6/16(木) HBaseのアーキテクチャ

7/15(金) OS、ハードウェア、ネットワーク

8/24(水) 運用

9月後半 アプリケーション設計2

10月後半 テスト、パフォーマンスチューニング

詳しくは http://j.mp/HBase3 大文字小文字は正確に

6

2011年5月22日日曜日

Page 7: HBase Workshop in Tokyo #001

[ ]本日のお題:アプリケーション設計HBaseの性能特性と HBaseの用途(向き・不向き)

設計上の注意点(テーブル設計、行キーの分散)

API利用上の注意点

Map Reduce利用時の注意点

Twitter ハッシュタグ #hbaseworkshop

7

2011年5月22日日曜日

Page 8: HBase Workshop in Tokyo #001

[ ]HBaseの用途について

8

2011年5月22日日曜日

Page 9: HBase Workshop in Tokyo #001

[ ]HBaseの特徴柔軟なテーブル構造

事前に定義するのはカラムファミリーのみ

強い一貫性

古いデータが見えることがない(縮退時も同様)

大規模データ向け

自動シャーディング

高可用性 (HA) ̶ 故障を優雅に扱う

数十億件を超えたあたりから本領発揮9

2011年5月22日日曜日

Page 10: HBase Workshop in Tokyo #001

[ ]HBaseの特徴インデックスを持たない。行(row) はキー順に格納される

単純化されたクエリ。SQLはサポートしない

テーブルの join はサポートしない

Hadoop Map Reduce (MR) をネイティブにサポート

10

2011年5月22日日曜日

Page 11: HBase Workshop in Tokyo #001

[ ]柔軟なテーブル構造

11http://www.slideshare.net/clehene/hbase-and-hadoop-at-adobe2011年5月22日日曜日

Page 12: HBase Workshop in Tokyo #001

[ ]write性能 と read性能のトレードオフ

一般的なRDB: read 性能 > write 性能

HBase: read 性能 < write 性能

(詳しくは、第2回 アーキテクチャで説明します)

12

2011年5月22日日曜日

Page 13: HBase Workshop in Tokyo #001

[ ]read 性能を引き出すための設計

行キーの設計(分散させつつ、局所性を持たせる)

テーブルの設計(非正規化) 行キーの選択

(後ほどディスカッション)

13

2011年5月22日日曜日

Page 14: HBase Workshop in Tokyo #001

[ ]Facebook メッセージング

14

2011年5月22日日曜日

Page 15: HBase Workshop in Tokyo #001

[ ]Adobe Systems

15

2011年5月22日日曜日

Page 16: HBase Workshop in Tokyo #001

[ ]Adobe Systems

16

2011年5月22日日曜日

Page 17: HBase Workshop in Tokyo #001

[ ]Adobe Systems

17

2011年5月22日日曜日

Page 18: HBase Workshop in Tokyo #001

[ ]Mozilla Soccoro

18

2011年5月22日日曜日

Page 19: HBase Workshop in Tokyo #001

[ ]Mozilla Soccoro

19

2011年5月22日日曜日

Page 20: HBase Workshop in Tokyo #001

[ ]OpenTSDB

20

2011年5月22日日曜日

Page 21: HBase Workshop in Tokyo #001

[ ]OpenTSDB

21

2011年5月22日日曜日

Page 22: HBase Workshop in Tokyo #001

[ ]Lily CMS

22

2011年5月22日日曜日

Page 23: HBase Workshop in Tokyo #001

[ ]HBaseをどんな用途に使いたいですか?

23

2011年5月22日日曜日

Page 24: HBase Workshop in Tokyo #001

[ ]行キーの設計とリージョン分割

24

2011年5月22日日曜日

Page 25: HBase Workshop in Tokyo #001

[ ]データ操作の基本API

put 行を挿入または上書き

get 指定したキーを持つ行を取得

scan キーの昇順に複数の行を取得(降順は不可)

delete 指定したキーを持つ行を削除

25

2011年5月22日日曜日

Page 26: HBase Workshop in Tokyo #001

[ ]データ操作の基本API (CAS操作)

checkAndPut

checkAndDelete

incrementColumnValue

26

2011年5月22日日曜日

Page 27: HBase Workshop in Tokyo #001

[ ]自動シャーディングテーブルは行キーでソートされている

テーブルサイズが拡大すると、キー空間を自動的に分割する

分割した各領域を「リージョン」と呼ぶ

27

[00 - ) [00 - )

[00 - 62)

[62 - )

[00 - 62)

[62 - )

[00 - 28)

[28 - 62)

[62 - 80)

[80 - )

2011年5月22日日曜日

Page 28: HBase Workshop in Tokyo #001

[ ]自動シャーディングリージョンはクラスター上の各ノードにランダムに配置される(1ノードあたり数十~数百リージョン)

28

[00 - 05)

[00 - 05)

[05 - 12)

[12 - 18)

[18 - 22)

[18 - 22)

[05 - 12)

[12 - 18)

2011年5月22日日曜日

Page 29: HBase Workshop in Tokyo #001

[ ]write時に考慮すること

行キーの値の分布に気を配る(分散させる)

連番だと1つのリージョンにアクセスが集中するのでNG

これをホットスポットと言います

キーの重複に注意

putにはユニーク制約がないので、他の行を上書きしてしまう可能性がある

29

2011年5月22日日曜日

Page 30: HBase Workshop in Tokyo #001

[ ]read時に考慮すること

データの局所性(ローカリティ)が重要

ローカリティを持たせることで、関連する行をまとめて scan できる

ランダムなキー(例:UUID)は避けたほうがよい

検索条件を吟味し、検索に適したキーを設計する

30

2011年5月22日日曜日

Page 31: HBase Workshop in Tokyo #001

[ ]行キーの例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日日曜日

Page 32: HBase Workshop in Tokyo #001

[ ]行キーの例ユーザーの行動ログ

行キー → <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日日曜日

Page 33: HBase Workshop in Tokyo #001

[ ]行キーの分散が難しいとき

キーが連番の場合はどうしたらいいのか?(例:伝票番号)

Saltテクニック

行キーの先頭にランダムな文字を追加する例:0~9(10種類)  A~Z(26種類)

検索では、本来のキーと全ての文字との組み合わせを使う

例:伝票番号 00100を検索0-00100、1-00100、2-00100 ...  9-00100

33

2011年5月22日日曜日

Page 34: HBase Workshop in Tokyo #001

[ ]バランサーについて

34

2011年5月22日日曜日

Page 35: HBase Workshop in Tokyo #001

[ ]どんな行キーをお使いですか?

35

2011年5月22日日曜日

Page 36: HBase Workshop in Tokyo #001

[ ]テーブルの設計

36

2011年5月22日日曜日

Page 37: HBase Workshop in Tokyo #001

[ ]カラムファミリー

行の一貫性は、カラムファミリーをまたがって保証される

カラムファミリーごとに別のファイルに格納される

ローカリティ

テーブル構造

37

2011年5月22日日曜日

Page 38: HBase Workshop in Tokyo #001

[ ]非正規化により苦手な read を克服

やってはいけないこと

1 + N 回 get問題

テーブルの非正規化

38

2011年5月22日日曜日

Page 39: HBase Workshop in Tokyo #001

[ ]正規化されたテーブル

39http://www.mediawiki.org/wiki/Manual:Database_layout/ja

ページ(記事) 変更履歴 本文

MediaWiki のテーブル設計(MySQL)

外部リンク サイト内リンク

1

1 0..*

0..*

2011年5月22日日曜日

Page 40: HBase Workshop in Tokyo #001

[ ]変更履歴と本文は、タイムスタンプで表現

リンクの一覧は、カラム番号で表現

テーブルの非正規化の例

40

2011年5月22日日曜日

Page 41: HBase Workshop in Tokyo #001

[ ]OpenTSDB

Read の性能向上のために複数行の情報を1行にまとめる

例) 行:分単位、カラムファミリー:5秒単位

データのパッキング

41

2011年5月22日日曜日

Page 42: HBase Workshop in Tokyo #001

[ ]テーブル設計で工夫している点、悩んでいる点は?

42

2011年5月22日日曜日

Page 43: HBase Workshop in Tokyo #001

[ ]APIでハマりやすいポイント

43

2011年5月22日日曜日

Page 44: HBase Workshop in Tokyo #001

[ ]new Configuration() は重い操作

HTableはスレッドセーフではない

タイムスタンプを指定する時は注意が必要

ビギナーがはまりやすい落とし穴

44

2011年5月22日日曜日

Page 45: HBase Workshop in Tokyo #001

[ ] new Configuration()

45

2011年5月22日日曜日

Page 46: HBase Workshop in Tokyo #001

[ ]HTable はスレッドセーフでない

46

2011年5月22日日曜日

Page 47: HBase Workshop in Tokyo #001

[ ]Delete 操作の怪

47

2011年5月22日日曜日

Page 48: HBase Workshop in Tokyo #001

[ ]タイムスタンプを指定する時の注意

48

2011年5月22日日曜日

Page 49: HBase Workshop in Tokyo #001

[ ]カラムファミリー名・カラム名は短めに

49

2011年5月22日日曜日

Page 50: HBase Workshop in Tokyo #001

[ ]クライアントからの行ロックは推奨しない

リージョンのflushで解除されてしまう

Lily の RowLog ライブラリーがおすすめ

複数行のトランザクション

50

2011年5月22日日曜日

Page 51: HBase Workshop in Tokyo #001

[ ]   // === ステップ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日日曜日

Page 52: HBase Workshop in Tokyo #001

[ ]   // === ステップ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日日曜日

Page 53: HBase Workshop in Tokyo #001

[ ]複数行のトランザクション

53

   // === ステップ3 ===   // 更新の前提条件チェックと、テーブルAの更新。   // ここでは、前提条件として、テーブルAの指定したカラムの更新前の値と   // 現在の値を比較し、それらが同一なら、他のプロセスと競合していないと   // みなして更新する。

   boolean tableA_updated = テーブルA.checkAndPut(更新前の値、putA);

   boolean tableB_updated = false;   boolean tableC_updated = false;

2011年5月22日日曜日

Page 54: HBase Workshop in Tokyo #001

[ ]複数行のトランザクション

54

   // === ステップ4 ===   // 登録しておいた テーブルBとテーブルCの更新内容をすぐに実行する。   if (tableA_updated) {       tableB_updated = wal.processMessage(walB);       tableC_updated = wal.processMessage(walC);   }

2011年5月22日日曜日

Page 55: HBase Workshop in Tokyo #001

[ ]ハマったこと、工夫していること?

55

2011年5月22日日曜日

Page 56: HBase Workshop in Tokyo #001

[ ]Map Reduceでのノウハウ

56

2011年5月22日日曜日

Page 57: HBase Workshop in Tokyo #001

[ ]Hadoop MRとの親和性性能の最適化

HBase は MR の主要なアクセスパターンであるwrite とシーケンシャル read に最適化されている

Yahoo! Cloud Serving Benchmark Report v4.4 http://research.yahoo.com/node/320257

2011年5月22日日曜日

Page 58: HBase Workshop in Tokyo #001

[ ]Hadoop MRとの親和性: HDFS

HBase では、データファイルが HDFS に格納されている

MR から、HFile を直接出力できる

バージョン 0.90 以降は、オンライン中に差分を反映できる

原理上は、オンライン中の HFile の読み込みも可能

HFile の内容は不変なので、安全にアクセスできる

58

2011年5月22日日曜日