SlideShare a Scribd company logo
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

PDF
Rubyによるデータ解析
PDF
hbaseconasia2017: Building online HBase cluster of Zhihu based on Kubernetes
PDF
Apache HBase 入門 (第1回)
PDF
Google Container Engine (GKE) & Kubernetes のアーキテクチャ解説
PDF
Kubernetesにまつわるエトセトラ(主に苦労話)
PDF
Apache HBaseの現在 - 火山と呼ばれたHBaseは今どうなっているのか
PDF
第25回 Hadoopソースコードリーディング 「HBase 最新情報」
PPTX
HDP ハンズオンセミナー
Rubyによるデータ解析
hbaseconasia2017: Building online HBase cluster of Zhihu based on Kubernetes
Apache HBase 入門 (第1回)
Google Container Engine (GKE) & Kubernetes のアーキテクチャ解説
Kubernetesにまつわるエトセトラ(主に苦労話)
Apache HBaseの現在 - 火山と呼ばれたHBaseは今どうなっているのか
第25回 Hadoopソースコードリーディング 「HBase 最新情報」
HDP ハンズオンセミナー

More from Toshihiro Suzuki (7)

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

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負荷が上がった   –  アプリケーション側のバグフィックス