SlideShare une entreprise Scribd logo
1  sur  30
Télécharger pour lire hors ligne
RandomPartitonerの
データモデリング


            株式会社ワークスアプリケーションズ
                      堤 勇人(@2t3)
自己紹介

 所属
  ワークスアプリケーションズ
  Incubation Labo4 Webmail

 お仕事
  ウェブメールの開発
自己紹介

 所属
  ワークスアプリケーションズ
  Incubation Labo4 Webmail

 お仕事
  ウェブメールの開発
  ・・・という名義で最先端技術を試す実験場
Webmail
          AP: jetty
          DB:
          cassandra,
          hbase

          全てクラウド
          (AWS)で動作
今回の達成目標

 1. CRUDが存在するデータを扱う
  DELETEが存在する。

 2. BETWEEN検索が可能
  例えば、このユーザーの3月~5月の
  データ、という検索をしたい。

 3. 余剰リソースを少なく
  低予算。
前提知識:普通のデータモデリング

   いわゆるRDB的な
     例えば、Accountデータ

キー / カラム     username(key)   password
tsutsumi_h   tsutsumi_h      ********
yutuki_r     yutuki_r        **********
test_data    test_data       ******
RDBを使え?
RDBを使え?

知らん!
批判は断る!
いやいや、分かってる分かってるん
だ。最初から動的なウェブアプリ
ケーションにCassandraなんて無理
だし。アトミック操作も無いしね。
件数表示とかすごい勢いでズレるし。
それは分かっていながら、敢えて、
そう敢えてのチャレンジなのですよ。
本当はlike検索とかしたい。超した
い。気軽にインデックスとか貼りた
い。でも最先端技術使うって名目な
んだもの。
もう一度、今回の達成目標

 1. CRUDが存在するデータを扱う
  DELETEが存在する。

 2. BETWEEN検索が可能
  例えば、このユーザーの3月~5月の
  データ、という検索をしたい。

 3. 余剰リソースを少なく
  低予算。
案1:人工キーを利用する

キー / カラム   username     password
1          tsutsumi_h   ********
2          yutuki_r     **********
3          test_data    ******

    1. CRUDが存在するデータを扱う
    2. BETWEEN検索が可能
    3. 余剰リソースを少なく
案1:人工キーを利用する

キー / カラム   username     password
1          tsutsumi_h   ********
2          yutuki_r     **********
3          test_data    ******

    2,3は良いが、1で問題が起こる
     DELETEが発生すると、キーに抜け
     ができ、パフォーマンスが落ちる
案1:人工キーを利用する

キー / カラム   username     password
1          tsutsumi_h   ********
2          yutuki_r     **********
3          test_data    ******

    2,3は良いが、1で問題が起こる
     DELETEが発生すると、キーに抜け
     ができ、パフォーマンスが落ちる
案2:OrderPreservingPartitioner
                              yutuki_r
tsutsumi_h             node
       node

              node
                     test_data

  1. CRUDが存在するデータを扱う
  2. BETWEEN検索が可能
  3. 余剰リソースを少なく
案2:OrderPreservingPartitioner
                              yutuki_r
tsutsumi_h             node
       node

              node
                     test_data

  1,2は良いが、3が微妙
    データの偏りが発生し、仕事をあま
    りしないノードが出来る
案2:OrderPreservingPartitioner
                              yutuki_r
tsutsumi_h             node
       node

              node
                     test_data

  1,2は良いが、3が微妙
    データの偏りが発生し、仕事をあま
    りしないノードが出来る
OPPを使った場合のデータ分布




 稼働率が全体で50%以下
  仕事をしないノードは仕事をする
  ノードの25%以下しか働かない。
  しかもこの余剰分は他が溢れた時に
  活かされることはない。
前提知識:RandomPartitioner

   Columnについては検索ができる
     例えば、p~zまでのカラム名を抽出

キー / カラム     username(key)   …   password
tsutsumi_h   tsutsumi_h      …   ********
yutuki_r     yutuki_r        …   **********
test_data    test_data       …   ******
案3:RPを使って横持ちindex化



key   suzuki   tamura   tsutsumi   urata   wakui   yutuki   zhag




  1. CRUDが存在するデータを扱う
  2. BETWEEN検索が可能
  3. 余剰リソースを少なく
案3:RPを使って横持ちindex化



key   suzuki   tamura   tsutsumi   urata   wakui   yutuki   zhag




  1,2,3を満たす・・・が
      indexが壊れた場合に、全てのデータ
      を一括で読むしか修復の方法が
      なくなる。
案3:RPを使って横持ちindex化



key   suzuki   tamura   tsutsumi   urata   wakui   yutuki   zhag




  1,2,3を満たす・・・が
      indexが壊れた場合に、全てのデータ
      を一括で読むしか修復の方法がなく
      なる
案4:じゃあ全データ横持ちにする

key        suzuki   tamura   tsutsumi   urata   wakui   yutuki   zhag

username   suzuki   tamura   tsutsumi   urata   wakui   yutuki   zhag

password   *****    *****      ***      ****** ******   ****     ****

 active      1        0         0         1      1        1       1



      1. CRUDが存在するデータを扱う
      2. BETWEEN検索が可能
      3. 余剰リソースを少なく
案4:じゃあ全データ横持ちにする

key        suzuki   tamura   tsutsumi   urata   wakui   yutuki   zhag

username   suzuki   tamura   tsutsumi   urata   wakui   yutuki   zhag

password   *****    *****      ***      ****** ******   ****     ****

 active      1        0         0         1      1        1       1



          1,2,3を満たす
           さらにはcassandraのget_count()
           も使えるように!
案4:じゃあ全データ横持ちにする

key        suzuki   tamura   tsutsumi   urata   wakui   yutuki   zhag

username   suzuki   tamura   tsutsumi   urata   wakui   yutuki   zhag

password   *****    *****      ***      ****** ******   ****     ****

 active      1        0         0         1      1        1       1



          1,2,3を満たす
           さらにはcassandraのget_count()
           も使えるように!
横持ちの仕方には色々ある

key / column   tsutsumi@20110524   tsutsumi@20110525
key            tsutsumi@20110524   tsutsumi@20110525
username       tsutsumi            tsutsumi_h
password       *******             ******************
active         0                   1


      完全横持ち
         全てのデータが、column名ごとに
         横に入る。自由に検索が出来るが、
         rowが大きくなる。
横持ちの仕方には色々ある

key / column        tsutsumi@20110524   tsutsumi@20110525
tsutsumi@key        tsutsumi@20110524   tsutsumi@20110525
tsutsumi@username   tsutsumi            tsutsumi_h
tsutsumi@password   *******             ******************
tsutsumi@active     0                   1


   ブロック(?)持ち
       ユーザーなど、ブロックごとに横持ち
       する。rowが比較的小さくなり、
       ブロック毎のcountも出来る。
       ただし、ブロック内しか検索できない
横持ちの仕方には色々ある

key / column        tsutsumi@20110524   tsutsumi@20110525
tsutsumi@20110524
                    tsutsumi@20110524            空
@key
tsutsumi@20110524
                    tsutsumi                     空
@username
tsutsumi@20110525
                               空        tsutsumi@20110525
@key
tsutsumi@20110525
                               空        tsutsumi_h
@username

   ナナメ持ち
       一つのキー毎に別のカラム名で横持ち
       する。rowが小さくなり負荷が少ない
RP横持ちを使ったデータ分布

ブロック持ちの場合

 DB1     DB2     DB3
 79.82   79.56   79.77   (GB)



 ほぼ均等なデータ分布・稼働率
   個々のノード毎の偏りがなくなり、
   負荷も全体に分散するようになった。

   さらに、get_Count()関数の利用が
   可能になり、range_ghostの呪いから
   も開放された。
RP横持ちを使ったデータ分布

ブロック持ちの場合

 DB1     DB2     DB3
 79.82   79.56   79.77   (GB)



 ほぼ均等なデータ分布・稼働率
   個々のノード毎の偏りがなくなり、
   負荷も全体に分散するようになった。

   さらに、get_Count()関数の利用が
   可能になり、range_ghostの呪いから
   も開放された。
注意事項

key / column   a   b   c   d   e   f   g   h   i   j   k   l   m n   o
key
username
password
active

      ー データ無し

      空データの扱い方
         データが無いカラムには、nullではなく、
         適当な0xDEADBEEF等を入れないと、
         cassandraが左詰めで返してしまう。
以上、ありがとうございました。

Contenu connexe

Tendances

分かった気分になるスタックトレース
分かった気分になるスタックトレース分かった気分になるスタックトレース
分かった気分になるスタックトレースTrash Briefing ,Ltd
 
RのffでGLMしてみたけど...
RのffでGLMしてみたけど...RのffでGLMしてみたけど...
RのffでGLMしてみたけど...Kazuya Wada
 
統計解析言語Rにおける大規模データ管理のためのboost.interprocessの活用
統計解析言語Rにおける大規模データ管理のためのboost.interprocessの活用統計解析言語Rにおける大規模データ管理のためのboost.interprocessの活用
統計解析言語Rにおける大規模データ管理のためのboost.interprocessの活用Shintaro Fukushima
 
RのffとbigmemoryとRevoScaleRとを比較してみた
RのffとbigmemoryとRevoScaleRとを比較してみたRのffとbigmemoryとRevoScaleRとを比較してみた
RのffとbigmemoryとRevoScaleRとを比較してみたKazuya Wada
 
20190202-pgunconf-Access-Privilege-Inquiry-Functions
20190202-pgunconf-Access-Privilege-Inquiry-Functions20190202-pgunconf-Access-Privilege-Inquiry-Functions
20190202-pgunconf-Access-Privilege-Inquiry-FunctionsToshi Harada
 
第7回社内勉強会「Code Sucks - 人の振り見て我が振り直せ」
第7回社内勉強会「Code Sucks - 人の振り見て我が振り直せ」第7回社内勉強会「Code Sucks - 人の振り見て我が振り直せ」
第7回社内勉強会「Code Sucks - 人の振り見て我が振り直せ」Hiromu Shioya
 
Web技術勉強会 第38回
Web技術勉強会 第38回Web技術勉強会 第38回
Web技術勉強会 第38回龍一 田中
 
Stanの便利な事後処理関数
Stanの便利な事後処理関数Stanの便利な事後処理関数
Stanの便利な事後処理関数daiki hojo
 
プログラミングコンテストでのデータ構造 2 ~動的木編~
プログラミングコンテストでのデータ構造 2 ~動的木編~プログラミングコンテストでのデータ構造 2 ~動的木編~
プログラミングコンテストでのデータ構造 2 ~動的木編~Takuya Akiba
 
ぼくのかんがえたさいきょうのついったーくらいあんと
ぼくのかんがえたさいきょうのついったーくらいあんとぼくのかんがえたさいきょうのついったーくらいあんと
ぼくのかんがえたさいきょうのついったーくらいあんとYutaka Tsumori
 
Boost.勉強会 #21 札幌「C++1zにstring_viewが導入されてうれしいので紹介します」
Boost.勉強会 #21 札幌「C++1zにstring_viewが導入されてうれしいので紹介します」Boost.勉強会 #21 札幌「C++1zにstring_viewが導入されてうれしいので紹介します」
Boost.勉強会 #21 札幌「C++1zにstring_viewが導入されてうれしいので紹介します」Hiro H.
 
Rubyによるデータ解析
Rubyによるデータ解析Rubyによるデータ解析
Rubyによるデータ解析Shugo Maeda
 
Perl RDBMS Programming(DBI/DBIx::Sunnyのはなし)
Perl RDBMS Programming(DBI/DBIx::Sunnyのはなし)Perl RDBMS Programming(DBI/DBIx::Sunnyのはなし)
Perl RDBMS Programming(DBI/DBIx::Sunnyのはなし)karupanerura
 
Pg14_sql_standard_function_body
Pg14_sql_standard_function_bodyPg14_sql_standard_function_body
Pg14_sql_standard_function_bodykasaharatt
 
Pythonデータ分析 第3回勉強会資料 8章
Pythonデータ分析 第3回勉強会資料 8章 Pythonデータ分析 第3回勉強会資料 8章
Pythonデータ分析 第3回勉強会資料 8章 Makoto Kawano
 

Tendances (20)

R3.0.0 is relased
R3.0.0 is relasedR3.0.0 is relased
R3.0.0 is relased
 
R-hpc-1 TokyoR#11
R-hpc-1 TokyoR#11R-hpc-1 TokyoR#11
R-hpc-1 TokyoR#11
 
分かった気分になるスタックトレース
分かった気分になるスタックトレース分かった気分になるスタックトレース
分かった気分になるスタックトレース
 
RのffでGLMしてみたけど...
RのffでGLMしてみたけど...RのffでGLMしてみたけど...
RのffでGLMしてみたけど...
 
Rの高速化
Rの高速化Rの高速化
Rの高速化
 
統計解析言語Rにおける大規模データ管理のためのboost.interprocessの活用
統計解析言語Rにおける大規模データ管理のためのboost.interprocessの活用統計解析言語Rにおける大規模データ管理のためのboost.interprocessの活用
統計解析言語Rにおける大規模データ管理のためのboost.interprocessの活用
 
RのffとbigmemoryとRevoScaleRとを比較してみた
RのffとbigmemoryとRevoScaleRとを比較してみたRのffとbigmemoryとRevoScaleRとを比較してみた
RのffとbigmemoryとRevoScaleRとを比較してみた
 
20190202-pgunconf-Access-Privilege-Inquiry-Functions
20190202-pgunconf-Access-Privilege-Inquiry-Functions20190202-pgunconf-Access-Privilege-Inquiry-Functions
20190202-pgunconf-Access-Privilege-Inquiry-Functions
 
第7回社内勉強会「Code Sucks - 人の振り見て我が振り直せ」
第7回社内勉強会「Code Sucks - 人の振り見て我が振り直せ」第7回社内勉強会「Code Sucks - 人の振り見て我が振り直せ」
第7回社内勉強会「Code Sucks - 人の振り見て我が振り直せ」
 
Web技術勉強会 第38回
Web技術勉強会 第38回Web技術勉強会 第38回
Web技術勉強会 第38回
 
Gensim
GensimGensim
Gensim
 
Stanの便利な事後処理関数
Stanの便利な事後処理関数Stanの便利な事後処理関数
Stanの便利な事後処理関数
 
プログラミングコンテストでのデータ構造 2 ~動的木編~
プログラミングコンテストでのデータ構造 2 ~動的木編~プログラミングコンテストでのデータ構造 2 ~動的木編~
プログラミングコンテストでのデータ構造 2 ~動的木編~
 
ぼくのかんがえたさいきょうのついったーくらいあんと
ぼくのかんがえたさいきょうのついったーくらいあんとぼくのかんがえたさいきょうのついったーくらいあんと
ぼくのかんがえたさいきょうのついったーくらいあんと
 
Boost.勉強会 #21 札幌「C++1zにstring_viewが導入されてうれしいので紹介します」
Boost.勉強会 #21 札幌「C++1zにstring_viewが導入されてうれしいので紹介します」Boost.勉強会 #21 札幌「C++1zにstring_viewが導入されてうれしいので紹介します」
Boost.勉強会 #21 札幌「C++1zにstring_viewが導入されてうれしいので紹介します」
 
Rubyによるデータ解析
Rubyによるデータ解析Rubyによるデータ解析
Rubyによるデータ解析
 
Perl RDBMS Programming(DBI/DBIx::Sunnyのはなし)
Perl RDBMS Programming(DBI/DBIx::Sunnyのはなし)Perl RDBMS Programming(DBI/DBIx::Sunnyのはなし)
Perl RDBMS Programming(DBI/DBIx::Sunnyのはなし)
 
Pg14_sql_standard_function_body
Pg14_sql_standard_function_bodyPg14_sql_standard_function_body
Pg14_sql_standard_function_body
 
全探索
全探索全探索
全探索
 
Pythonデータ分析 第3回勉強会資料 8章
Pythonデータ分析 第3回勉強会資料 8章 Pythonデータ分析 第3回勉強会資料 8章
Pythonデータ分析 第3回勉強会資料 8章
 

Random partionerのデータモデリング