hbase at ameba

Post on 12-Nov-2014

5.487 Views

Category:

Technology

0 Downloads

Preview:

Click to see full reader

DESCRIPTION

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

TRANSCRIPT

Summit Developers

Developers Summit 2013 Action !

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

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

アメーバ事業本部

プラットフォーム部門

Ameba Technology Laboratory

14-A-2 #devsumiA

Summit Developers

Developers Summit 2013 Action !

自己紹介

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

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

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

•  Twi;er  @brfrn169  

Summit Developers

Developers Summit 2013 Action !

今日話したいこと

•  HBaseについて  

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

Summit Developers

Developers Summit 2013 Action !

HBaseについて

Summit Developers

Developers Summit 2013 Action !

HBaseとは

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

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

 

Summit Developers

Developers Summit 2013 Action !

HBaseとは

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

– 多次元ソートマップ  

 

Summit Developers

Developers Summit 2013 Action !

HBaseの使いどころ

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

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

Summit Developers

Developers Summit 2013 Action !

HBaseのアーキテクチャ

•  マスタ型   HMaster(HBase)

HRegionServer(HBase) HRegionServer(HBase)

Zookeeper

HDFS(Hadoop  Distributed  File  System)

・・・

Summit Developers

Developers Summit 2013 Action !

HBaseのアーキテクチャ

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

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

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

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は複数バージョン  を持つ

Summit Developers

Developers Summit 2013 Action !

HBaseのデータモデル

ColumnFamily1 ColumnFamily2

Column1 Column2 Column3 Column4 Column5 row1

row2 row3 row4

row5 row6 row7 row8

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

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

Summit Developers

Developers Summit 2013 Action !

HBaseのデータモデル

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

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

れる  – CASやIncrementもできる  

Summit Developers

Developers Summit 2013 Action !

HBaseのデータモデル

ColumnFamily1

Column1 Column2 row1

row2 row3 row4

row5 row6 row7 row8

ColumnFamily2

Column3 Column4 Column5

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

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

Summit Developers

Developers Summit 2013 Action !

HBaseのデータモデル

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

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

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  でソートされている

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を持っているときは、  複数エントリになる

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の場合は、  保存されない

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のみ違うエントリになる

Summit Developers

Developers Summit 2013 Action !

HBaseのデータモデル

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

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

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>>>  

 

Summit Developers

Developers Summit 2013 Action !

HBaseのAPI

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

得  

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

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

Summit Developers

Developers Summit 2013 Action !

HBaseのAPI

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

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

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

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

Summit Developers

Developers Summit 2013 Action !

HBaseの設計の考え方

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

可能性がある  

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

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

Summit Developers

Developers Summit 2013 Action !

HBaseの設計の考え方

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

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

Summit Developers

Developers Summit 2013 Action !

HBaseの設計の考え方

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

いくかを考える  

Summit Developers

Developers Summit 2013 Action !

参考までに

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

Summit Developers

Developers Summit 2013 Action !

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

Summit Developers

Developers Summit 2013 Action !

背景

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

Summit Developers

Developers Summit 2013 Action !

背景

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

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

 

ミニグラフ

ミニグラフ

ミニグラフ

ミニグラフ

ミニグラフ

ミニグラフ

デカグラフ

Summit Developers

Developers Summit 2013 Action !

背景

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

ス  – オンライン処理  

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

Summit Developers

Developers Summit 2013 Action !

背景

•  今までは、MySQL  +  Sharding  

Ameba  Pigg

Ameba  なう

Ameba  グルっぽ

Summit Developers

Developers Summit 2013 Action !

背景

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

HBase

Summit Developers

Developers Summit 2013 Action !

なぜHBaseか

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

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

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

Summit Developers

Developers Summit 2013 Action !

Hornetのアーキテクチャ

•  HBase  +  Gateway(Java)

Client

Gateway Gateway Gateway

RPC

HBase

HDFS

Summit Developers

Developers Summit 2013 Action !

HornetのJava  API

Node  user1  =  graphDbService.createNode();  

・ノードの作成

Summit Developers

Developers Summit 2013 Action !

HornetのJava  API

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

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

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”)

Summit Developers

Developers Summit 2013 Action !

HornetのJava  API

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

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

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();  

・隣接ノードの取得

Summit Developers

Developers Summit 2013 Action !

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

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

•  ColumnFamily:  –  “h”  

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

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

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

Summit Developers

Developers Summit 2013 Action !

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

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

RowKey Column  Key

value

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

タイプ

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

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

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

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

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

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

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

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

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

Summit Developers

Developers Summit 2013 Action !

まとめ

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

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

Summit Developers

Developers Summit 2013 Action !

社内ライブラリ「Json  Persister」

Summit Developers

Developers Summit 2013 Action !

背景

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

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

 

Summit Developers

Developers Summit 2013 Action !

背景

•  データベースに着目  

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

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

Summit Developers

Developers Summit 2013 Action !

背景

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

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

Summit Developers

Developers Summit 2013 Action !

背景

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

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

Summit Developers

Developers Summit 2013 Action !

Json  Persister

•  社内ライブラリ  

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

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

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

 

Summit Developers

Developers Summit 2013 Action !

Java  API

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

主キーの設定

インデックスの設定

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);

Summit Developers

Developers Summit 2013 Action !

Java  API

•  主キーで取得(load)  

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

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);

インデックスで検索

Summit Developers

Developers Summit 2013 Action !

Json  Persister

•  シンプル  

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

HBase実装を開発

Summit Developers

Developers Summit 2013 Action !

スキーマ設計(主キー)

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

•  ColumnFamily:  – “h”  

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

•  Value:  –  Json  

Summit Developers

Developers Summit 2013 Action !

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

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

•  ColumnFamily:  – “h”  

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

•  Value:  –  Json  

Summit Developers

Developers Summit 2013 Action !

•  保存(save)  

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

Summit Developers

Developers Summit 2013 Action !

RowKey Column  Key

value

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

Summit Developers

Developers Summit 2013 Action !

•  保存(save)  

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

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}

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}

Summit Developers

Developers Summit 2013 Action !

•  主キーで取得(load)  

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

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”  

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”  

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);

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

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

Summit Developers

Developers Summit 2013 Action !

まとめ

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

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

Summit Developers

Developers Summit 2013 Action !

I  suggest  your  Next  Acgon!

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 !

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 !

Summit Developers

Developers Summit 2013 Action !

It’s  your  turn.

top related