SlideShare a Scribd company logo
1 of 28
Download to read offline
HBaseを用いたグラフDB「Hornet」	


株式会社サイバーエージェント	
  
アメーバ事業本部	
  
Ameba	
  Technology	
  Laboratory	
  
鈴木 俊裕
自己紹介	
•  鈴木 俊裕	
  
•  株式会社サイバーエージェント	
  
   –  アメーバ事業本部	
  
   –  Ameba	
  Technology	
  Laboratory	
  


•  Hadoop/Hiveを用いたデータ解析基盤の運用、
   HBaseを用いたグラフDB「Hornet」の運用	
  

•  Twi<er	
  @brfrn169	
  
話すこと	
•  HBaseを用いたグラフDB「Hornet」について	
  
 –  設計について	
  
 –  運用について	
  


•  HBaseを知っている人向けです	
  
Hornetについて
背景	
•  昨年、「Ameba」のスマートフォン向けプラット
   フォームをリリース	
  
背景	
•  デカグラフ構想	
  
  –  各サービスのユーザー層を「ミニグラフ」と位置づ
     け、1つの巨大なスマートフォン向けサービス(デ
     カグラフ)を構築するという構想	
  
                                             デカグラフ	


             ミニグラフ	
               ミニグラフ	


   ミニグラフ	
             ミニグラフ	

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

           HBase
なぜHBaseか	
•    スケールする	
  
•    書き込みが速い、そこそこの読み込み速度	
  
•    レンジスキャン	
  
•    CAS操作、インクリメント操作	
  
•    解析基盤にHadoopを用いていたため、ノウハ
     ウがあった
設計について
Hornetのデータモデル	
                                                     リレーションシップ	
              ノード	
  •  プロパティグラフ	
        リレーションシップのtype	
                                                      ノードID	
                                                                      2	
                                 follow	

             1	
              date	
      2013-­‐01-­‐01	
          Name	
 Ichiro	
                              favorite	
 true	
                     Age	
   29	
Name	
 Toshihiro	
                                          follow	
age	
     29	

                     date	
      2013-­‐01-­‐10	
 ノードの	
              favorite	
 false	
                              3	
プロパティ	

                               リレーションシップの	
                        Name	
 Masahiro	
                                  プロパティ	
                          Age	
    27
Hornetのアーキテクチャ	
•  HBase	
  +	
  Gateway(Java)	

                          Client
                                   RPC


           Gateway       Gateway   Gateway


                          HBase
                          HDFS
Hornetのスキーマ(リレーションシップ)	
•  RowKey:	
  	
  
    –  hash(startNodeId)	
  +	
  startNodeId	
  +	
  type	
  +	
  direcUon	
  +	
  
       (Long.MAX_VALUE	
  -­‐	
  Umestamp)	
  +	
  endNodeId	
  
•  ColumnFamily:	
  
    –  “h”	
  
•  Column:	
  
    –  “”	
  (空のバイト配列)	
  
•  Value:	
  
    –  シリアライズしたプロパティ	
  
Hornetのスキーマ(リレーションシップ)	
  •  例:リレーションシップの追加(1が2をフォローする)	
  	
  

                                                      2	
                        follow	

           1	
       date	
     2013-­‐01-­‐01	
    Name	
 Ichiro	
                     favorite	
 true	
              Age	
   29	
Name	
 Toshihiro	
age	
   29	


                                                     3	


                                                   Name	
 Masahiro	
                                                   Age	
    27
Hornetのスキーマ(リレーションシップ)	
•  例:リレーションシップの追加(1が2をフォローする)	
  	
  

       RowKey	
     Column	
     value	
                      Key
Hornetのスキーマ(リレーションシップ)	
    •  例:リレーションシップの追加(1が2をフォローする)	
  	
  

                               RowKey	
                                     Column	
                    value	
                                                                              Key	
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	
  -­‐	
  
 ノードIDのハッシュ値	
                                                       Umstamp
Hornetのスキーマ(リレーションシップ)	
  •  例:リレーションシップの追加(1が3をフォローする)	
  	
  	
  

                                                                2	
                                 follow	

           1	
                date	
      2013-­‐01-­‐01	
    Name	
 Ichiro	
                              favorite	
 true	
               Age	
   29	
Name	
 Toshihiro	
                                          follow	
age	
   29	

                     date	
      2013-­‐01-­‐10	
                     favorite	
 false	
                        3	


                                                             Name	
 Masahiro	
                                                             Age	
    27
Hornetのスキーマ(リレーションシップ)	
    •  例:リレーションシップの追加(1が3をフォローする)	
  	
  

                               RowKey	
                                     Column	
                    value	
                                                                              Key	
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
Hornetのスキーマ(リレーションシップ)	
    •  例:リレーションシップの追加(1が3をフォローする)	
  	
  

                               RowKey	
                                     Column	
                     value	
                                                                              Key	
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
Hornetのスキーマ(リレーションシップ)	
  •  例:リレーションシップの取得(1がフォローしてる人を取得)	
  


                                                                2	
                                 follow	

           1	
                date	
      2013-­‐01-­‐01	
    Name	
 Ichiro	
                              favorite	
 true	
               Age	
   29	
Name	
 Toshihiro	
                                          follow	
age	
   29	

                     date	
      2013-­‐01-­‐10	
                     favorite	
 false	
                        3	


                                                             Name	
 Masahiro	
                                                             Age	
    27
Hornetのスキーマ(リレーションシップ)	
  •  例:リレーションシップの取得(1がフォローしてる人を取得)	
  


        hash(1)	
  +	
  1	
  +	
  follow	
  +	
  OUTGOING	
  でプレフィックススキャン	


                               RowKey	
                                     Column	
                     value	
                                                                              Key	
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
Hornetのスキーマ(リレーションシップ)	
  •  例:リレーションシップの取得(1がフォローしてる人を取得)	
  


        hash(1)	
  +	
  1	
  +	
  follow	
  +	
  OUTGOING	
  でプレフィックススキャン	


                               RowKey	
                                     Column	
                     value	
                                                                              Key	
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
Hornetのスキーマ	
•  設計のポイント	
  
  –  tall-­‐narrow	
  table	
  
      •  データの偏りが起こらないように	
  
      	
  
  –  ノードIDのhash値をプレフィックス	
  
      •  書き込み・読み込みの負荷分散	
  


  –  複数のプロパティの値をシリアライズして一行に	
  
      •  使用メモリの節約	
  
運用について
トピックス(1)	
•  0.92.0系のHBaseと0.20.2系のHadoopを使っている(CDH)	
  

•  NNはFTサーバを使ってハードウェア冗長をしている	
  
  –  当時はHAがなかった	
  

•  メジャーコンパクションは深夜に	
  
  –  メジャーコンパクション中はレスポンスタイムが上がる	
  

•  オートスプリットをONにしている	
  
  –  一瞬レスポンスタイムが上がるが、現在のところ問題なし	
  
トピックス(2)	
•  Zookeeperのセッションタイムアウトは短くしてい
   る(20秒)	
  
  –  ダウンタイムとのトレードオフ	
  
  –  重いGCが起きたらRSが落ちてしまうかも(今のところ
     落ちてない)	
  
	
  
•  バックアップ	
  
  –  HBase-­‐0.92.0ではレプリケーションがバグってて使え
     なかった	
  
  –  スクリプトでWALをバックアップ用クラスタに転送して
     適用している
障害事例(1)	
•  ハードウェア障害でRSがダウン	
  
 –  うまくフェイルオーバされた	
  
   •  該当Regionのダウンタイムは1分くらい	
  


•  本番クラスタでMapReduceを行ったらRSが同
   時に7台死亡	
  
 –  FullGCが発生	
  
 –  本番クラスタではMapReduce禁止	
  
障害事例(2)	
•  アプリケーション側のバグで特定Rowに対す
   る書き込み・読み込みが集中し、RSのCPUが
   100%に張り付いて重くなった	
  
 –  該当Regionにメジャーコンパクションをかけたら
    CPU使用率が落ちた。KeyValueが増えすぎてScan
    のCPU負荷が上がった	
  
 –  アプリケーション側のバグフィックス	
  
ご清聴ありがとうございました

More Related Content

More from Toshihiro Suzuki

Kuduを調べてみた #dogenzakalt
Kuduを調べてみた #dogenzakaltKuduを調べてみた #dogenzakalt
Kuduを調べてみた #dogenzakaltToshihiro Suzuki
 
HBaseを用いたグラフDB「Hornet」の設計と運用
HBaseを用いたグラフDB「Hornet」の設計と運用HBaseを用いたグラフDB「Hornet」の設計と運用
HBaseを用いたグラフDB「Hornet」の設計と運用Toshihiro Suzuki
 
HBaseでグラフ構造を扱う(開発中)
HBaseでグラフ構造を扱う(開発中)HBaseでグラフ構造を扱う(開発中)
HBaseでグラフ構造を扱う(開発中)Toshihiro Suzuki
 
Amebaサービスのログ解析基盤
Amebaサービスのログ解析基盤Amebaサービスのログ解析基盤
Amebaサービスのログ解析基盤Toshihiro Suzuki
 
MySQLによってタフになる会12章
MySQLによってタフになる会12章MySQLによってタフになる会12章
MySQLによってタフになる会12章Toshihiro Suzuki
 
第2回 Hadoop 輪読会
第2回 Hadoop 輪読会第2回 Hadoop 輪読会
第2回 Hadoop 輪読会Toshihiro Suzuki
 

More from Toshihiro Suzuki (7)

Kuduを調べてみた #dogenzakalt
Kuduを調べてみた #dogenzakaltKuduを調べてみた #dogenzakalt
Kuduを調べてみた #dogenzakalt
 
HBaseを用いたグラフDB「Hornet」の設計と運用
HBaseを用いたグラフDB「Hornet」の設計と運用HBaseを用いたグラフDB「Hornet」の設計と運用
HBaseを用いたグラフDB「Hornet」の設計と運用
 
HBase at Ameba
HBase at AmebaHBase at Ameba
HBase at Ameba
 
HBaseでグラフ構造を扱う(開発中)
HBaseでグラフ構造を扱う(開発中)HBaseでグラフ構造を扱う(開発中)
HBaseでグラフ構造を扱う(開発中)
 
Amebaサービスのログ解析基盤
Amebaサービスのログ解析基盤Amebaサービスのログ解析基盤
Amebaサービスのログ解析基盤
 
MySQLによってタフになる会12章
MySQLによってタフになる会12章MySQLによってタフになる会12章
MySQLによってタフになる会12章
 
第2回 Hadoop 輪読会
第2回 Hadoop 輪読会第2回 Hadoop 輪読会
第2回 Hadoop 輪読会
 

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

  • 2. 自己紹介 •  鈴木 俊裕   •  株式会社サイバーエージェント   –  アメーバ事業本部   –  Ameba  Technology  Laboratory   •  Hadoop/Hiveを用いたデータ解析基盤の運用、 HBaseを用いたグラフDB「Hornet」の運用   •  Twi<er  @brfrn169  
  • 3. 話すこと •  HBaseを用いたグラフDB「Hornet」について   –  設計について   –  運用について   •  HBaseを知っている人向けです  
  • 6. 背景 •  デカグラフ構想   –  各サービスのユーザー層を「ミニグラフ」と位置づ け、1つの巨大なスマートフォン向けサービス(デ カグラフ)を構築するという構想   デカグラフ ミニグラフ ミニグラフ ミニグラフ ミニグラフ ミニグラフ ミニグラフ
  • 7. 背景 •  そこで、ユーザのグラフ構造を保持するデー タベースが必要   –  データが大量になるのでスケールするデータベー ス     HBase
  • 8. なぜHBaseか •  スケールする   •  書き込みが速い、そこそこの読み込み速度   •  レンジスキャン   •  CAS操作、インクリメント操作   •  解析基盤にHadoopを用いていたため、ノウハ ウがあった
  • 10. Hornetのデータモデル リレーションシップ ノード •  プロパティグラフ リレーションシップのtype ノードID 2 follow 1 date 2013-­‐01-­‐01 Name Ichiro favorite true Age 29 Name Toshihiro follow age 29 date 2013-­‐01-­‐10 ノードの   favorite false 3 プロパティ リレーションシップの   Name Masahiro プロパティ Age 27
  • 11. Hornetのアーキテクチャ •  HBase  +  Gateway(Java) Client RPC Gateway Gateway Gateway HBase HDFS
  • 12. Hornetのスキーマ(リレーションシップ) •  RowKey:     –  hash(startNodeId)  +  startNodeId  +  type  +  direcUon  +   (Long.MAX_VALUE  -­‐  Umestamp)  +  endNodeId   •  ColumnFamily:   –  “h”   •  Column:   –  “”  (空のバイト配列)   •  Value:   –  シリアライズしたプロパティ  
  • 13. Hornetのスキーマ(リレーションシップ) •  例:リレーションシップの追加(1が2をフォローする)     2 follow 1 date 2013-­‐01-­‐01 Name Ichiro favorite true Age 29 Name Toshihiro age 29 3 Name Masahiro Age 27
  • 15. Hornetのスキーマ(リレーションシップ) •  例:リレーションシップの追加(1が2をフォローする)     RowKey Column   value Key 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  -­‐   ノードIDのハッシュ値 Umstamp
  • 16. Hornetのスキーマ(リレーションシップ) •  例:リレーションシップの追加(1が3をフォローする)       2 follow 1 date 2013-­‐01-­‐01 Name Ichiro favorite true Age 29 Name Toshihiro follow age 29 date 2013-­‐01-­‐10 favorite false 3 Name Masahiro Age 27
  • 17. Hornetのスキーマ(リレーションシップ) •  例:リレーションシップの追加(1が3をフォローする)     RowKey Column   value Key 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
  • 18. Hornetのスキーマ(リレーションシップ) •  例:リレーションシップの追加(1が3をフォローする)     RowKey Column   value Key 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
  • 19. Hornetのスキーマ(リレーションシップ) •  例:リレーションシップの取得(1がフォローしてる人を取得)   2 follow 1 date 2013-­‐01-­‐01 Name Ichiro favorite true Age 29 Name Toshihiro follow age 29 date 2013-­‐01-­‐10 favorite false 3 Name Masahiro Age 27
  • 20. Hornetのスキーマ(リレーションシップ) •  例:リレーションシップの取得(1がフォローしてる人を取得)   hash(1)  +  1  +  follow  +  OUTGOING  でプレフィックススキャン RowKey Column   value Key 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
  • 21. Hornetのスキーマ(リレーションシップ) •  例:リレーションシップの取得(1がフォローしてる人を取得)   hash(1)  +  1  +  follow  +  OUTGOING  でプレフィックススキャン RowKey Column   value Key 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
  • 22. Hornetのスキーマ •  設計のポイント   –  tall-­‐narrow  table   •  データの偏りが起こらないように     –  ノードIDのhash値をプレフィックス   •  書き込み・読み込みの負荷分散   –  複数のプロパティの値をシリアライズして一行に   •  使用メモリの節約  
  • 24. トピックス(1) •  0.92.0系のHBaseと0.20.2系のHadoopを使っている(CDH)   •  NNはFTサーバを使ってハードウェア冗長をしている   –  当時はHAがなかった   •  メジャーコンパクションは深夜に   –  メジャーコンパクション中はレスポンスタイムが上がる   •  オートスプリットをONにしている   –  一瞬レスポンスタイムが上がるが、現在のところ問題なし  
  • 25. トピックス(2) •  Zookeeperのセッションタイムアウトは短くしてい る(20秒)   –  ダウンタイムとのトレードオフ   –  重いGCが起きたらRSが落ちてしまうかも(今のところ 落ちてない)     •  バックアップ   –  HBase-­‐0.92.0ではレプリケーションがバグってて使え なかった   –  スクリプトでWALをバックアップ用クラスタに転送して 適用している
  • 26. 障害事例(1) •  ハードウェア障害でRSがダウン   –  うまくフェイルオーバされた   •  該当Regionのダウンタイムは1分くらい   •  本番クラスタでMapReduceを行ったらRSが同 時に7台死亡   –  FullGCが発生   –  本番クラスタではMapReduce禁止  
  • 27. 障害事例(2) •  アプリケーション側のバグで特定Rowに対す る書き込み・読み込みが集中し、RSのCPUが 100%に張り付いて重くなった   –  該当Regionにメジャーコンパクションをかけたら CPU使用率が落ちた。KeyValueが増えすぎてScan のCPU負荷が上がった   –  アプリケーション側のバグフィックス