hbase at ameba

87
Summit Developers Developers Summit 2013 Action ! HBase at Ameba AmebaのおけるHBaseの導入事例~ 鈴木俊裕 株式会社サイバーエージェント アメーバ事業本部 プラットフォーム部門 Ameba Technology Laboratory 14-A-2 #devsumiA

Upload: toshihiro-suzuki

Post on 12-Nov-2014

5.487 views

Category:

Technology


0 download

DESCRIPTION

Developers Summit 2013で発表した資料です。

TRANSCRIPT

Page 1: HBase at Ameba

Summit Developers

Developers Summit 2013 Action !

HBase  at  Ameba ~AmebaのおけるHBaseの導入事例~

鈴木俊裕 株式会社サイバーエージェント

アメーバ事業本部

プラットフォーム部門

Ameba Technology Laboratory

14-A-2 #devsumiA

Page 2: HBase at Ameba

Summit Developers

Developers Summit 2013 Action !

自己紹介

•  鈴木 俊裕(すずき としひろ)  •  ソフトウェアエンジニア  

•  株式会社サイバーエージェント  –  アメーバ事業本部  –  プラットフォーム部門  –  Ameba  Technology  Laboratory  

•  Hadoopを使ったログ解析基盤の開発・運用  •  HBaseをつかった基盤システムの開発・運用  

•  Twi;er  @brfrn169  

Page 3: HBase at Ameba

Summit Developers

Developers Summit 2013 Action !

今日話したいこと

•  HBaseについて  

•  AmebaにおけるHBaseの導入事例  – グラフDB「Hornet」  – 社内ライブラリ「Json  Persister」    

Page 4: HBase at Ameba

Summit Developers

Developers Summit 2013 Action !

HBaseについて

Page 5: HBase at Ameba

Summit Developers

Developers Summit 2013 Action !

HBaseとは

•  いわゆる「NoSQL」のひとつ  

•  Googleの基盤ソフトウェアである「Bigtable」のオープンソースクローン  

 

Page 6: HBase at Ameba

Summit Developers

Developers Summit 2013 Action !

HBaseとは

•  分散ストレージ  – 高可用性  – 高パフォーマンス

– 多次元ソートマップ  

 

Page 7: HBase at Ameba

Summit Developers

Developers Summit 2013 Action !

HBaseの使いどころ

•  大量のデータ  – そこまでデータが大きくならないなら必要ない  

•  Auto  Sharding  – データが自動的に分割され、負荷分散されていく  – 運用コスト削減

Page 8: HBase at Ameba

Summit Developers

Developers Summit 2013 Action !

HBaseのアーキテクチャ

•  マスタ型   HMaster(HBase)

HRegionServer(HBase) HRegionServer(HBase)

Zookeeper

HDFS(Hadoop  Distributed  File  System)

・・・

Page 9: HBase at Ameba

Summit Developers

Developers Summit 2013 Action !

HBaseのアーキテクチャ

•  HDFS(Hadoop  Distributed  File  System)  – 分散ファイルシステム  – レプリカをデフォルトで3つ持つので信頼性が高い  

•  HBaseの信頼性はHDFSに依存している

Page 10: HBase at Ameba

Summit Developers

Developers Summit 2013 Action !

HBaseのデータモデル

ColumnFamily1 ColumnFamily2

Column1 Column2 Column3 Column4 Column5 row1

row2 row3 row4 row5 aaa bbb NULL ccc ddd

row6 row7 row8

・部分的にはRDBに似ている RowKey  

(主キー、辞書順でソートされている)

Column Value

Page 11: HBase at Ameba

Summit Developers

Developers Summit 2013 Action !

HBaseのデータモデル

ColumnFamily1 ColumnFamily2

Column1 Column2 Column3 Column4 Column5 row1

row2 row3 row4 row5 aaa bbb NULL ccc ddd

row6 row7 row8

・でもちょっと違う Columnは

ColumFamilyによって  グルーピング

▼ ▼ ▼ ▼

fff  ggg  

hhh   iii  jjj  

Valueは複数バージョン  を持つ

Page 12: HBase at Ameba

Summit Developers

Developers Summit 2013 Action !

HBaseのデータモデル

ColumnFamily1 ColumnFamily2

Column1 Column2 Column3 Column4 Column5 row1

row2 row3 row4

row5 row6 row7 row8

・データの分散の単位について

Page 13: HBase at Ameba

Summit Developers

Developers Summit 2013 Action !

HBaseのデータモデル

ColumnFamily1 ColumnFamily2

Column1 Column2 Column3 Column4 Column5 row1

row2 row3 row4

row5 row6 row7 row8

・データの分散の単位について RowKeyの範囲で  Regionに分割される

Region1

Region2

Page 14: HBase at Ameba

Summit Developers

Developers Summit 2013 Action !

HBaseのデータモデル

•  各Regionはそれぞれ1つのHRegionServerに割り当てられる  

•  Rowの更新処理はアトミックに行われる  – 同じRowは必ず同じHRegionServerに割り当てら

れる  – CASやIncrementもできる  

Page 15: HBase at Ameba

Summit Developers

Developers Summit 2013 Action !

HBaseのデータモデル

ColumnFamily1

Column1 Column2 row1

row2 row3 row4

row5 row6 row7 row8

ColumnFamily2

Column3 Column4 Column5

・データファイルについて

Page 16: HBase at Ameba

Summit Developers

Developers Summit 2013 Action !

HBaseのデータモデル

ColumnFamily1

Column1 Column2 row1

row2 row3 row4

row5 row6 row7 row8

ColumnFamily2

Column3 Column4 Column5

・データファイルについて

ファイル1 ファイル2

ファイル3 ファイル4

Page 17: HBase at Ameba

Summit Developers

Developers Summit 2013 Action !

HBaseのデータモデル

•  列指向データフォーマット  

•  ColumnFamilyはI/Oを分散したいときに使う  

Page 18: HBase at Ameba

Summit Developers

Developers Summit 2013 Action !

HBaseのデータモデル

・各データファイルの実際の構造について

row1 ColumnFamily1 Column1 100 aaa

RowKey ColumnFamily Column Timestamp value

row1 ColumnFamily1 Column2 200 bbb

row2 ColumnFamily1 Column1 140 111 row2 ColumnFamily1 Column2 300 rrr row3 ColumnFamily1 Column1 400 fff row5 ColumnFamily1 Column1 130 333 row5 ColumnFamily1 Column1 500 uuu

row5 ColumnFamily1 Column2 300 555

RowKey  +  ColumnFamily  +  Column  +  Timestamp  でソートされている

Page 19: HBase at Ameba

Summit Developers

Developers Summit 2013 Action !

HBaseのデータモデル

・各データファイルの実際の構造について

row1 ColumnFamily1 Column1 100 aaa

RowKey ColumnFamily Column Timestamp value

row1 ColumnFamily1 Column2 200 bbb

row2 ColumnFamily1 Column1 140 111 row2 ColumnFamily1 Column2 300 rrr row3 ColumnFamily1 Column1 400 fff row5 ColumnFamily1 Column1 130 333 row5 ColumnFamily1 Column1 500 uuu

row5 ColumnFamily1 Column2 300 555

複数Columnを持っているときは、  複数エントリになる

Page 20: HBase at Ameba

Summit Developers

Developers Summit 2013 Action !

HBaseのデータモデル

・各データファイルの実際の構造について

row1 ColumnFamily1 Column1 100 aaa

RowKey ColumnFamily Column Timestamp value

row1 ColumnFamily1 Column2 200 bbb

row2 ColumnFamily1 Column1 140 111 row2 ColumnFamily1 Column2 300 rrr row3 ColumnFamily1 Column1 400 fff row5 ColumnFamily1 Column1 130 333 row5 ColumnFamily1 Column1 500 uuu

row5 ColumnFamily1 Column2 300 555

ColumnがNULLの場合は、  保存されない

Page 21: HBase at Ameba

Summit Developers

Developers Summit 2013 Action !

HBaseのデータモデル

・各データファイルの実際の構造について

row1 ColumnFamily1 Column1 100 aaa

RowKey ColumnFamily Column Timestamp value

row1 ColumnFamily1 Column2 200 bbb

row2 ColumnFamily1 Column1 140 111 row2 ColumnFamily1 Column2 300 rrr row3 ColumnFamily1 Column1 400 fff row5 ColumnFamily1 Column1 130 333 row5 ColumnFamily1 Column1 500 uuu

row5 ColumnFamily1 Column2 300 555

複数バージョンを持っている場合は、Timestampのみ違うエントリになる

Page 22: HBase at Ameba

Summit Developers

Developers Summit 2013 Action !

HBaseのデータモデル

•  ColumnFamilyは予め定義する必要がある  – ファイルの分割単位    

•  Columnは後からいくらでも追加することができる  – データファイル内でエントリが増えるだけ  

Page 23: HBase at Ameba

Summit Developers

Developers Summit 2013 Action !

HBaseのデータモデル

•  従来のRDB(むりやり,  インデックスとか無視)  –  table  -­‐>  SortedMap<PrimaryKey,  Record>  –  Record  -­‐>  Map<Column,  Value>  

•  HBase  –  table  -­‐>  SortedMap<RowKey,  Record>  –  Record  -­‐>  Map<ColumnFamily,  SortedMap<Column,  SortedMap<Timestamp,  Value>>>  

 

Page 24: HBase at Ameba

Summit Developers

Developers Summit 2013 Action !

HBaseのAPI

•  Get  – Rowの全Columnまたは一部ColumnのValueを取

得  

•  Put  – Rowの挿入、または更新  

•  Delete  – Row全体、一部Column、一部バージョンの削除  

Page 25: HBase at Ameba

Summit Developers

Developers Summit 2013 Action !

HBaseのAPI

•  Scan  – 任意の行をスキャン  

•  範囲を指定  •  フィルタを指定  

•  Increment  – Valueをインクリメント  

•  CAS  – Compare  And  Swap  – 簡単なトランザクションを実現できる

Page 26: HBase at Ameba

Summit Developers

Developers Summit 2013 Action !

HBaseの設計の考え方

•  RowKeyの範囲でRegionに分割されて負荷分散される  – RowKeyの設計次第では負荷やデータ量が偏る

可能性がある  

•  RowKeyで辞書順にソートされている  – 連続したRowはScanでまとめてとることができる

ので、1度に取りたいデータは連続して置いておく  

Page 27: HBase at Ameba

Summit Developers

Developers Summit 2013 Action !

HBaseの設計の考え方

•  RowのColumnをいくらでも増やすことができるし、ソートもされている。しかも更新処理がアトミック  – ただし、データが偏る可能性あり  

•  Joinがない  – 非正規化がほぼ前提    

Page 28: HBase at Ameba

Summit Developers

Developers Summit 2013 Action !

HBaseの設計の考え方

•  クエリに対してスキーマが決まる  – RDBのようにデータ設計を 初にやらない  – まずクエリを考えてから、どういうスキーマにして

いくかを考える  

Page 29: HBase at Ameba

Summit Developers

Developers Summit 2013 Action !

参考までに

•  CodeZineの連載「初めてのHBase」  – h;p://codezine.jp/argcle/corner/473

Page 30: HBase at Ameba

Summit Developers

Developers Summit 2013 Action !

HBaseを用いたグラフDB「Hornet」

Page 31: HBase at Ameba

Summit Developers

Developers Summit 2013 Action !

背景

•  昨年、「Ameba」のスマートフォン向けプラットフォームをリリース  

Page 32: HBase at Ameba

Summit Developers

Developers Summit 2013 Action !

背景

•  デカグラフ構想  – 各サービスのユーザー層を「ミニグラフ」と位置づ

け、1つの巨大なスマートフォン向けサービス(デカグラフ)を構築するという構想  

 

ミニグラフ

ミニグラフ

ミニグラフ

ミニグラフ

ミニグラフ

ミニグラフ

デカグラフ

Page 33: HBase at Ameba

Summit Developers

Developers Summit 2013 Action !

背景

•  そこで、ユーザのグラフ構造を保持するデータベースが必要  – データが大量になるのでスケールするデータベー

ス  – オンライン処理  

•  低レスポンスタイム  •  高スループット  

Page 34: HBase at Ameba

Summit Developers

Developers Summit 2013 Action !

背景

•  今までは、MySQL  +  Sharding  

Ameba  Pigg

Ameba  なう

Ameba  グルっぽ

Page 35: HBase at Ameba

Summit Developers

Developers Summit 2013 Action !

背景

•  MySQL  +  Sharding  – 書き込みがスケールしにくい  – Shardの管理が大変  

HBase

Page 36: HBase at Ameba

Summit Developers

Developers Summit 2013 Action !

なぜHBaseか

•  スケールする  •  書き込みが速い、そこそこの読み込み速度  •  Range  Scan  •  CAS、Increment  •  Auto  Sharding  

•  ログ解析基盤にHadoopを用いていたため、ノウハウがあった

Page 37: HBase at Ameba

Summit Developers

Developers Summit 2013 Action !

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

Page 38: HBase at Ameba

Summit Developers

Developers Summit 2013 Action !

Hornetのアーキテクチャ

•  HBase  +  Gateway(Java)

Client

Gateway Gateway Gateway

RPC

HBase

HDFS

Page 39: HBase at Ameba

Summit Developers

Developers Summit 2013 Action !

HornetのJava  API

Node  user1  =  graphDbService.createNode();  

・ノードの作成

Page 40: HBase at Ameba

Summit Developers

Developers Summit 2013 Action !

HornetのJava  API

user1.setProperty("name",  Bytes.toBytes("Toshihiro"));  

・ノードのプロパティのセット

Page 41: HBase at Ameba

Summit Developers

Developers Summit 2013 Action !

HornetのJava  API

Node  user1  =  graphDbService.createNode();  Node  user2  =  graphDbService.createNode();    Relagonship  rel  =                                          user1.createRelagonshipTo(user2,  "follow");  

・リレーションの作成(typeは”follow”)

Page 42: HBase at Ameba

Summit Developers

Developers Summit 2013 Action !

HornetのJava  API

rel.setProperty("date",                                              Bytes.toBytes(System.currentTimeMillis()));  

・リレーションのプロパティのセット

Page 43: HBase at Ameba

Summit Developers

Developers Summit 2013 Action !

HornetのJava  API

//  user1が“follow”している人を取得する List<Result>  res  =              user1.select("follow",  Direcgon.OUTGOING).getAll();    //  user1を“follow”している人を取得する res  =              user1.select("follow",  Direcgon.INCOMING).getAll();  

・隣接ノードの取得

Page 44: HBase at Ameba

Summit Developers

Developers Summit 2013 Action !

Hornetのスキーマ(リレーションシップ)

•  RowKey:    –  hash(startNodeId)  +  startNodeId  +  type  +  direcgon  +  (Long.MAX_VALUE  -­‐  gmestamp)  +  endNodeId  

•  ColumnFamily:  –  “h”  

•  Column:  –  “”  (空のバイト配列)  

•  Value:  – シリアライズしたプロパティ  

Page 45: HBase at Ameba

Summit Developers

Developers Summit 2013 Action !

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

Page 46: HBase at Ameba

Summit Developers

Developers Summit 2013 Action !

Hornetのスキーマ(リレーションシップ)

•  例:リレーションシップの追加(1が2をフォローする)    

RowKey Column  Key

value

Page 47: HBase at Ameba

Summit Developers

Developers Summit 2013 Action !

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  -­‐  gmstamp

ノードID

タイプ

Page 48: HBase at Ameba

Summit Developers

Developers Summit 2013 Action !

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

Page 49: HBase at Ameba

Summit Developers

Developers Summit 2013 Action !

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

Page 50: HBase at Ameba

Summit Developers

Developers Summit 2013 Action !

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

Page 51: HBase at Ameba

Summit Developers

Developers Summit 2013 Action !

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

Page 52: HBase at Ameba

Summit Developers

Developers Summit 2013 Action !

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  でプレフィックススキャン

Page 53: HBase at Ameba

Summit Developers

Developers Summit 2013 Action !

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  でプレフィックススキャン

Page 54: HBase at Ameba

Summit Developers

Developers Summit 2013 Action !

Hornetのスキーマ(リレーションシップ)

•  例:リレーションシップの取得(2をフォローしてる人を取得)  

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

Page 55: HBase at Ameba

Summit Developers

Developers Summit 2013 Action !

Hornetのスキーマ(リレーションシップ)

•  例:リレーションシップの取得(2をフォローしてる人を取得)  

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(2)  +  2  +  follow  +  INCOMING  でプレフィックススキャン

Page 56: HBase at Ameba

Summit Developers

Developers Summit 2013 Action !

Hornetのスキーマ(リレーションシップ)

•  例:リレーションシップの取得(2をフォローしてる人を取得)  

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(2)  +  2  +  follow  +  INCOMING  でプレフィックススキャン

Page 57: HBase at Ameba

Summit Developers

Developers Summit 2013 Action !

まとめ

•  HBaseを用いたグラフDB「Hornet」  – スキーマ設計について  

•  今後  – オープンソースで公開したい  

Page 58: HBase at Ameba

Summit Developers

Developers Summit 2013 Action !

社内ライブラリ「Json  Persister」

Page 59: HBase at Ameba

Summit Developers

Developers Summit 2013 Action !

背景

•  弊社ではサービスを複数ラインで同時に開発している  

•  スピード感は命であり、いかに開発スピードをあげられるかが非常に重要  

 

Page 60: HBase at Ameba

Summit Developers

Developers Summit 2013 Action !

背景

•  データベースに着目  

•  一部基盤化はされているものの  

•  各サービスでデータベースを立てている状況  – MySQL  – Redis  – …etc  

Page 61: HBase at Ameba

Summit Developers

Developers Summit 2013 Action !

背景

•  ここに、HBaseを使うことは出来ないか  – スケールする  – 高可用性  – 高パフォーマンス  – Auto  Sharding  

•  HBaseを1つ作って全てのサービスのデータを入れることで運用を一元化できたら良さそう

Page 62: HBase at Ameba

Summit Developers

Developers Summit 2013 Action !

背景

•  とはいえ、HBaseは結構難しい  

•  いかに簡単にするか  •  RDBに慣れているエンジニア  

Page 63: HBase at Ameba

Summit Developers

Developers Summit 2013 Action !

Json  Persister

•  社内ライブラリ  

•  JavaオブジェクトをJsonデータとして永続化するフレームワーク

•  Javaオブジェクトを直接save、loadするシンプルなAPI  

•  データストア層は切り替えられるようになっている  – もともとあったのはMySQL版  

 

Page 64: HBase at Ameba

Summit Developers

Developers Summit 2013 Action !

Java  API

•  シリアライズするクラス  @Persistable  public  class  UserData  {          @PrimaryKey          private  String  userName;            @Indexed          private  Integer  age;                            private  Date  date;          ...省略 }

主キーの設定

インデックスの設定

Page 65: HBase at Ameba

Summit Developers

Developers Summit 2013 Action !

Java  API

•  保存(save)  

UserData  userData  =  new  UserData();    userData.setUserName("yuhsaku");  userData.setAge(32);    userData.setDate(new  Date());      jsonPersister.save(userData);

Page 66: HBase at Ameba

Summit Developers

Developers Summit 2013 Action !

Java  API

•  主キーで取得(load)  

UserData  userData  =  new  UserData();  userData.setUserName("yuhsaku");    UserData  result  =  jsonPersister.load(userData);

Page 67: HBase at Ameba

Summit Developers

Developers Summit 2013 Action !

Java  API

•  取得(list)  

UserData  query  =  new  UserData();  query.setAge(32);    Criteria<UserData>  criteria  =                        Criteria.createCriteria(UserData.class).andEquals(query);      List<UserData>  resultList  =  jsonPersister.list(criteria);

インデックスで検索

Page 68: HBase at Ameba

Summit Developers

Developers Summit 2013 Action !

Json  Persister

•  シンプル  

•  このインターフェースにのせれば簡単にHBaseを扱えそう  

HBase実装を開発

Page 69: HBase at Ameba

Summit Developers

Developers Summit 2013 Action !

スキーマ設計(主キー)

•  RowKey:    – 主キー名  +  主キーの値  

•  ColumnFamily:  – “h”  

•  Column:  – “”  (空のバイト配列)  

•  Value:  –  Json  

Page 70: HBase at Ameba

Summit Developers

Developers Summit 2013 Action !

スキーマ設計(インデックス)

•  RowKey:    – インデックス名  +  インデックス値  +  主キーの値  

•  ColumnFamily:  – “h”  

•  Column:  – “”  (空のバイト配列)  

•  Value:  –  Json  

Page 71: HBase at Ameba

Summit Developers

Developers Summit 2013 Action !

•  保存(save)  

UserData  userData  =  new  UserData();    userData.setUserName(”yusaku");  userData.setAge(32);    userData.setDate(new  Date());      jsonPersister.save(userData);

Page 72: HBase at Ameba

Summit Developers

Developers Summit 2013 Action !

RowKey Column  Key

value

Page 73: HBase at Ameba

Summit Developers

Developers Summit 2013 Action !

RowKey Column  Key

value

Age  +  32  +  “yusaku” h: {UserName  :  “yusaku”,  age  :  32,  date  :  123445}

UserName  +  “yusaku” h: {UserName  :  “yusaku”,  age  :  32,  date  :  123445}

主キー名 主キーの値 Json

インデックス名 インデックスの

値 主キーの値 Json

Page 74: HBase at Ameba

Summit Developers

Developers Summit 2013 Action !

•  保存(save)  

UserData  userData  =  new  UserData();    userData.setUserName(”taro");  userData.setAge(32);    userData.setDate(new  Date());      jsonPersister.save(userData);

Page 75: HBase at Ameba

Summit Developers

Developers Summit 2013 Action !

RowKey Column  Key

value

Age  +  32  +  “yusaku” h: {UserName  :  “yusaku”,  age  :  32,  date  :  123445}

UserName  +  “yusaku” h: {UserName  :  “yusaku”,  age  :  32,  date  :  123445}

Page 76: HBase at Ameba

Summit Developers

Developers Summit 2013 Action !

RowKey Column  Key

value

Age  +  32  +  “taro” h: {UserName  :  “taro”,  age  :  32,  date  :  234567}

Age  +  32  +  “yusaku” h: {UserName  :  “yusaku”,  age  :  32,  date  :  123445}

UserName  +  “taro” h: {UserName  :  “taro”,  age  :  32,  date  :  234567}

UserName  +  “yusaku” h: {UserName  :  “yusaku”,  age  :  32,  date  :  123445}

Page 77: HBase at Ameba

Summit Developers

Developers Summit 2013 Action !

•  主キーで取得(load)  

UserData  userData  =  new  UserData();  userData.setUserName("yuhsaku");    UserData  result  =  jsonPersister.load(userData);

Page 78: HBase at Ameba

Summit Developers

Developers Summit 2013 Action !

RowKey Column  Key

value

Age  +  32  +  “taro” h: {UserName  :  “taro”,  age  :  32,  date  :  234567}

Age  +  32  +  “yusaku” h: {UserName  :  “yusaku”,  age  :  32,  date  :  123445}

UserName  +  “taro” h: {UserName  :  “taro”,  age  :  32,  date  :  234567}

UserName  +  “yusaku” h: {UserName  :  “yusaku”,  age  :  32,  date  :  123445}

•  RowKeyがUserName  +  ”yusaku”  

Page 79: HBase at Ameba

Summit Developers

Developers Summit 2013 Action !

RowKey Column  Key

value

Age  +  32  +  “taro” h: {UserName  :  “taro”,  age  :  32,  date  :  234567}

Age  +  32  +  “yusaku” h: {UserName  :  “yusaku”,  age  :  32,  date  :  123445}

UserName  +  “taro” h: {UserName  :  “taro”,  age  :  32,  date  :  234567}

UserName  +  “yusaku” h: {UserName  :  “yusaku”,  age  :  32,  date  :  123445}

•  RowKeyがUserName  +  ”yusaku”  

Page 80: HBase at Ameba

Summit Developers

Developers Summit 2013 Action !

•  取得(list)  

UserData  query  =  new  UserData();  query.setAge(32);    Criteria<UserData>  criteria  =                        Criteria.createCriteria(UserData.class).andEquals(query);      List<UserData>  resultList  =  jsonPersister.list(criteria);

Page 81: HBase at Ameba

Summit Developers

Developers Summit 2013 Action !

RowKey Column  Key

value

Age  +  32  +  “taro” h: {UserName  :  “taro”,  age  :  32,  date  :  234567}

Age  +  32  +  “yusaku” h: {UserName  :  “yusaku”,  age  :  32,  date  :  123445}

UserName  +  “taro” h: {UserName  :  “taro”,  age  :  32,  date  :  234567}

UserName  +  “yusaku” h: {UserName  :  “yusaku”,  age  :  32,  date  :  123445}

•  RowKeyがAge  +  32  でプレフィックススキャン  

Page 82: HBase at Ameba

Summit Developers

Developers Summit 2013 Action !

RowKey Column  Key

value

Age  +  32  +  “taro” h: {UserName  :  “taro”,  age  :  32,  date  :  234567}

Age  +  32  +  “yusaku” h: {UserName  :  “yusaku”,  age  :  32,  date  :  123445}

UserName  +  “taro” h: {UserName  :  “taro”,  age  :  32,  date  :  234567}

UserName  +  “yusaku” h: {UserName  :  “yusaku”,  age  :  32,  date  :  123445}

•  RowKeyがAge  +  32  でプレフィックススキャン  

Page 83: HBase at Ameba

Summit Developers

Developers Summit 2013 Action !

まとめ

•  社内ライブラリ「Json  Persister」のHBase版を実装  – スキーマ設計  

•  今後  – オープンソースで公開したい  

Page 84: HBase at Ameba

Summit Developers

Developers Summit 2013 Action !

I  suggest  your  Next  Acgon!

Page 85: HBase at Ameba

Summit Developers

Developers Summit 2013 Action !

HBaseを触ってみよう

•  書籍「HBase」  – h;p://www.amazon.co.jp/dp/4873115663  

 

M Y   R E C O M M E N D   N E X T   A C T I O N !

Page 86: HBase at Ameba

Summit Developers

Developers Summit 2013 Action !

HBaseを触ってみよう

•  CodeZineの連載「初めてのHBase」  – h;p://codezine.jp/argcle/corner/473

M Y   R E C O M M E N D   N E X T   A C T I O N !

Page 87: HBase at Ameba

Summit Developers

Developers Summit 2013 Action !

It’s  your  turn.