SlideShare a Scribd company logo
1 of 46
Download to read offline
Casual Compression
     on   
-present at MongoDB Casual Talks-

          @just_do_neet
Today’s Agenda
         今日のお題目


            •MongoDBの課題

            •MongoDBでのデータ圧縮

            •まとめ




MongoDB Casual Talks #1       2
MongoDB
         MongoDB




         http://www.mongodb.org/



                                   http://www.mongodb.jp/


         •10gen社が主体として開発しているオープンソース
          所謂「NoSQL」の一つ
MongoDB Casual Talks #1                                     3
MongoDB is over?
         MongoDBはオワコン?




                            http://suzuzuzuru.blogspot.jp/2012/04/mongodb.html

                    http://blog.engineering.kiip.me/post/20988881092/a-year-with-mongodb

MongoDB Casual Talks #1                                                                    4
MongoDB is over?
         MongoDBはオワコン?




                          http://www.zopyx.com/blog/goodbye-mongodb


MongoDB Casual Talks #1                                               5
Cons.
         MongoDBの欠点(主観含む)


            •トランザクション未サポート

                •トランザクションは甘え (ドヤァ

            •Global Lock(2.2からCollection Lockに?)

            •システムリソースが肥大化(メモリ、ディスク)

            •データ圧縮未対応(通信、データストア共)

            •セキュリティ周りが弱い etc.

MongoDB Casual Talks #1                            6
Cons.
         MongoDBの欠点(主観含む)


            •トランザクション未サポート

                •トランザクションは甘え (ドヤァ

            •Global Lock(2.2からCollection Lockに?)

            •システムリソースが肥大化(メモリ、ディスク)

            •データ圧縮未対応(通信、データストア共)

            •セキュリティ周りが弱い etc.

MongoDB Casual Talks #1                            7
Compress
         圧縮関連のJIRA


            •BSONデータの圧縮→not supported!




                          https://jira.mongodb.org/browse/SERVER-164




MongoDB Casual Talks #1                                                8
Compress
         圧縮関連のJIRA


            •通信路の圧縮→not supported!




                          https://jira.mongodb.org/browse/SERVER-3018




MongoDB Casual Talks #1                                                 9
Compress
         Quoraに掲載されている「最も興味があるMongoDBのJIRA」




http://www.quora.com/MongoDB/What-are-the-most-interesting-MongoDB-JIRA-issues


MongoDB Casual Talks #1                                                     10
Compress vs Not Compress
         圧縮:非圧縮のデータサイズの差


            •下記例は同一フォーマットの文字列データを格納
             した際の比較(MongoDB / HBase)

            •MongoDBはHBase(snappy圧縮時)の三倍強。
             700000000                                 MongoDB
             600000000                                 MongoDB(fragment)
             500000000                                 HBase
                                                       HBase(fragment)
             400000000                                 HBase(snappy)
             300000000
             200000000
             100000000
                          0
                              size(1,000,000 record)

MongoDB Casual Talks #1                                                    11
Cons.
         MongoDBの欠点(主観含む)


            •Big Dataを扱う環境にはあまり向かない。

                •スケールするが故に、下手にそれなりの規模の
                  システムに導入するとサーバー無限増殖の刑
                  に...




MongoDB Casual Talks #1                  12
圧縮




MongoDB Casual Talks #1        13
Casual Compression
         MongoDBでのカジュアルなデータ圧縮


            •以下について試してみました。
                1.フィールド名をできるだけ短くする

                2.特定のデータをbinary形式で保存

                3.小さい正整数の整数符号化




MongoDB Casual Talks #1                14
#1 To shorten filed name
         フィールド名の短縮


            •MongoDBはBSON形式でデータを保存

            •BSONは1つのドキュメントの中にフィールド名
             情報を持つ。

                •複数のレコードが同一のフィールド名を持って
                  いても、1レコードごとに情報を持つ。




MongoDB Casual Talks #1                  15
#1 To shorten filed name
         フィールド名の短縮




                          http://bsonspec.org/#/specification




MongoDB Casual Talks #1                                        16
#1 To shorten filed name
         フィールド名の短縮




MongoDB Casual Talks #1            17
#1 To shorten filed name
         フィールド名の短縮




                          100万件で

                          約8MBの差




MongoDB Casual Talks #1            18
#1 To shorten filed name
         参考ブログ




           http://christophermaier.name/blog/2011/05/22/MongoDB-key-names

MongoDB Casual Talks #1                                                     19
#1 To shorten filed name
         参考ブログ




           http://christophermaier.name/blog/2011/05/22/MongoDB-key-names

MongoDB Casual Talks #1                                                     20
#1 To shorten filed name
         OR Mapperを用いたfield nameのマッピング


            •OR Mapperでfield nameのマッピングを行うと名
             前が短すぎる弊害は多少抑制できる。

            •JavaではMorphiaがオススメ。
             http://code.google.com/p/morphia/

                •Spring Dataは重厚すぎる気がする。




MongoDB Casual Talks #1                          21
#1 To shorten filed name
         OR Mapperを用いたfield nameのマッピング



                @Data
                @Entity(value = "slim")
                class TestDTOSlim {
                  @Id
                  ObjectId id;
                  @Property(value = "u")
                  long uuid;
                  @Property(value = "n")
                  String name;
                  @Property(value = "d")
                  Date date;
                }




MongoDB Casual Talks #1                    22
#2 Convert to binary
         特定のデータをbinary形式に変換


            •MongoDBが圧縮をサポートしていないのでアプ
             リケーション側で圧縮をしてbinaryで保存。

                •特定のフィールドを圧縮

                •BSON以外の構造化フォーマットを用いて複数
                  フィールドをまとめてシリアライズ→圧縮




MongoDB Casual Talks #1                   23
#2 Convert to binary
         検証に使用したデータモデル




                public class NormalModel {
                  @Id
                  ObjectId oid;
                  long uuid;
                  int id;
                  char flag;
                  String name;
                  String description;
                }




MongoDB Casual Talks #1                      24
#2 Convert to binary
         検証で使用した圧縮アルゴリズム


            •Deflate(Best Compression)

            •LZO

            •Google Snappy

            •LZ4




MongoDB Casual Talks #1                 25
#2 Convert to binary
         Google Snappy


            •2011/4ごろにGoogleがオープンソースとして公開
             した圧縮アルゴリズム。
             高速な圧縮・伸張が特徴。

            •http://code.google.com/p/snappy/




MongoDB Casual Talks #1                         26
#2 Convert to binary
         LZ4


            •Google Snappyよりも圧縮・伸張速度が速いと言
               われている圧縮アルゴリズム。

            •http://code.google.com/p/lz4/




MongoDB Casual Talks #1                      27
#2 Convert to binary
         BSON以外のシリアライズ手法


            •Message Pack
             http://msgpack.org/




MongoDB Casual Talks #1            28
#2 Convert to binary
         検証条件


            •以下の条件で比較

                1.何もしない

                2.フィールド名の短縮

                3. 2 + 特定のフィールドの圧縮

                4.複数のフィールド情報をMessagePackでシリ
                  アライズ

                5. 4.+圧縮
MongoDB Casual Talks #1                       29
#2 Convert to binary
         検証結果

                                           normal
                                           short key
                                           short key + msgpack

  1500000


  1200000


    900000


    600000


    300000


          0
                    none   deflate   lzo   snappy           lz4

MongoDB Casual Talks #1                                           30
#2 Convert to binary
         検証結果

                                           normal
                                           short key
       1,2, 4(非圧縮)                         short key + msgpack

  1500000


  1200000


    900000


    600000


    300000


          0
                    none   deflate   lzo   snappy           lz4

MongoDB Casual Talks #1                                           31
#2 Convert to binary
         検証結果

                                           normal
                                           short key
                                           short key + msgpack

  1500000                            3,5(圧縮)

  1200000


    900000


    600000


    300000


          0
                    none   deflate   lzo   snappy           lz4

MongoDB Casual Talks #1                                           32
#2 Convert to binary
         検証結果

                                           normal
                                           short key
                                           short key + msgpack

  1500000


  1200000


    900000


    600000


    300000


          0
                    none   deflate   lzo   snappy           lz4

MongoDB Casual Talks #1                                           33
#2 Convert to binary
         検証結果


            •「複数のフィールドをMessagePackでシリアライ
             ズ+圧縮アルゴリズムで圧縮」
             の組み合わせで最大2/3の省サイズ化に成功。

                •データパターン/データモデルによって傾向は
                  様々だと思う。

                •圧縮・シリアライズのオーバーヘッドに注意。

                •独自binary化すると後戻りできないので注意。

MongoDB Casual Talks #1                     34
#3 Integer Encoding
         整数値符号化


            •たとえば数字の「1」を数バイト使用して表現す
             るのはもったいない。→整数値符号化

                •Variable Byte Code

                •Simple9

                •Simple16

                •etc...



MongoDB Casual Talks #1               35
#3 Integer Encoding
         Variable Byte Code


            •整数値の値を最小1バイトで表現するための符号
             化方式。数値部7bit(0~127)と、数値終端を表すフ
             ラグ1bitの組み合わせで数値を符号化します。

            •https://gist.github.com/3003981
                • 0x00-0x7f     : 1xxxxxxx


                • 0x80-0x3fff   : 0xxxxxxx 1xxxxxxx


                • 0x4000-0x1fffff : 0xxxxxxx 0xxxxxxx 1xxxxxxx
                  ※「x」は0、もしくは1



MongoDB Casual Talks #1                                          36
#3 Integer Encoding
         検証に使用したデータモデル




               public class NormalModel{
              ! @Id
              ! ObjectId oid;
              ! @Property(value = "id")
              ! int id; //もしくはlong
                }




MongoDB Casual Talks #1                    37
#3 Integer Encoding
         検証条件


            •以下の条件で比較

                1. 整数値をinteger(4byte)で保存

                2. 整数値をlong(8byte)で保存

                3. 整数値をVariable Byte Codeで変換して保存




MongoDB Casual Talks #1                            38
#3 Integer Encoding
         検証結果

                                                    integer                 long
                                                    variable byte code


 37000000

 36000000

 35000000

 34000000

 33000000

 32000000

 31000000

 30000000
                          max : 128   max : 16384               max : 2097152

MongoDB Casual Talks #1                                                            39
#3 Integer Encoding
         検証結果


            •整数値符号化で保存をしたら、逆にIntegerよりも
             サイズが大きくなった・・・

                •BSONの仕様が関係
                   int32 : 4bytes
                   int64 : 8bytes
                   binary : int32 subtype(byte*)




MongoDB Casual Talks #1                            40
Casual Compression
         MongoDBでのカジュアルなデータ圧縮


            •以下について試してみました。
                1.フィールド名をできるだけ短くする
                  →◎

                2.特定のデータをbinary形式で保存
                  →⃝

                3.小さい正整数の整数符号化
                  →☓

MongoDB Casual Talks #1                41
参考情報




MongoDB Casual Talks #1          42
HBase
         HBaseなら圧縮をサポートしてます


            •HBaseなら....

                •データの圧縮に標準で対応
                  (圧縮したいTableのFamilyごとに指定可能。
                  アルゴリズムも複数選択可能)

                •可変長整数値に標準で対応
                  (VIntWritable / VLongWritable)

                •大きいデータを扱う場合はHBaseを(ry

MongoDB Casual Talks #1                            43
まとめ




MongoDB Casual Talks #1         44
Conclusion
         まとめにかえて


            •MongoDBはデータサイズが肥大化しがちです
             が、アプリケーション側のカジュアルな工夫で多
             少はデータサイズの削減ができます。

            •用途に応じて、適切な現場でMongoDBを使いま
             しょう。

            •個人的にはRedisが好きです。




MongoDB Casual Talks #1                 45
ご清聴
                ありがとうございました



MongoDB Casual Talks #1         46

More Related Content

What's hot

ザ・ドキュメント~うまくいかないNoSQL~
ザ・ドキュメント~うまくいかないNoSQL~ザ・ドキュメント~うまくいかないNoSQL~
ザ・ドキュメント~うまくいかないNoSQL~Akihiro Kuwano
 
ソーシャルゲームにおけるMongoDB適用事例 - Animal Land
ソーシャルゲームにおけるMongoDB適用事例 - Animal LandソーシャルゲームにおけるMongoDB適用事例 - Animal Land
ソーシャルゲームにおけるMongoDB適用事例 - Animal LandMasakazu Matsushita
 
MongoDBが遅いときの切り分け方法
MongoDBが遅いときの切り分け方法MongoDBが遅いときの切り分け方法
MongoDBが遅いときの切り分け方法Tetsutaro Watanabe
 
AmebaのMongoDB活用事例
AmebaのMongoDB活用事例AmebaのMongoDB活用事例
AmebaのMongoDB活用事例Akihiro Kuwano
 
MongoDBざっくり解説
MongoDBざっくり解説MongoDBざっくり解説
MongoDBざっくり解説知教 本間
 
MongoDB〜その性質と利用場面〜
MongoDB〜その性質と利用場面〜MongoDB〜その性質と利用場面〜
MongoDB〜その性質と利用場面〜Naruhiko Ogasawara
 
なかったらINSERTしたいし、あるならロック取りたいやん?
なかったらINSERTしたいし、あるならロック取りたいやん?なかったらINSERTしたいし、あるならロック取りたいやん?
なかったらINSERTしたいし、あるならロック取りたいやん?ichirin2501
 
Db tech showcase2015 how to replicate between clusters
Db tech showcase2015 how to replicate between clustersDb tech showcase2015 how to replicate between clusters
Db tech showcase2015 how to replicate between clustersHiroaki Kubota
 
MongoDBを用いたソーシャルアプリのログ解析 〜解析基盤構築からフロントUIまで、MongoDBを最大限に活用する〜
MongoDBを用いたソーシャルアプリのログ解析 〜解析基盤構築からフロントUIまで、MongoDBを最大限に活用する〜MongoDBを用いたソーシャルアプリのログ解析 〜解析基盤構築からフロントUIまで、MongoDBを最大限に活用する〜
MongoDBを用いたソーシャルアプリのログ解析 〜解析基盤構築からフロントUIまで、MongoDBを最大限に活用する〜Takahiro Inoue
 
DB tech showcase: 噂のMongoDBその用途は?
DB tech showcase: 噂のMongoDBその用途は?DB tech showcase: 噂のMongoDBその用途は?
DB tech showcase: 噂のMongoDBその用途は?Hiroaki Kubota
 
Introduction to MongoDB
Introduction to MongoDBIntroduction to MongoDB
Introduction to MongoDBmoai kids
 
後悔しないもんごもんごの使い方 〜アプリ編〜
後悔しないもんごもんごの使い方 〜アプリ編〜後悔しないもんごもんごの使い方 〜アプリ編〜
後悔しないもんごもんごの使い方 〜アプリ編〜Masakazu Matsushita
 
初心者向けMongoDBのキホン!
初心者向けMongoDBのキホン!初心者向けMongoDBのキホン!
初心者向けMongoDBのキホン!Tetsutaro Watanabe
 
Mongo db勉強会の補足
Mongo db勉強会の補足Mongo db勉強会の補足
Mongo db勉強会の補足CROOZ, inc.
 
Programming camp 2008, Codereading
Programming camp 2008, CodereadingProgramming camp 2008, Codereading
Programming camp 2008, CodereadingHiro Yoshioka
 
Mongo dbを知ろう
Mongo dbを知ろうMongo dbを知ろう
Mongo dbを知ろうCROOZ, inc.
 
分割と整合性と戦う
分割と整合性と戦う分割と整合性と戦う
分割と整合性と戦うYugo Shimizu
 
MongoDB very basic (Japanese) / MongoDB基礎の基礎
MongoDB very basic (Japanese) / MongoDB基礎の基礎MongoDB very basic (Japanese) / MongoDB基礎の基礎
MongoDB very basic (Japanese) / MongoDB基礎の基礎Naruhiko Ogasawara
 

What's hot (20)

ザ・ドキュメント~うまくいかないNoSQL~
ザ・ドキュメント~うまくいかないNoSQL~ザ・ドキュメント~うまくいかないNoSQL~
ザ・ドキュメント~うまくいかないNoSQL~
 
ソーシャルゲームにおけるMongoDB適用事例 - Animal Land
ソーシャルゲームにおけるMongoDB適用事例 - Animal LandソーシャルゲームにおけるMongoDB適用事例 - Animal Land
ソーシャルゲームにおけるMongoDB適用事例 - Animal Land
 
MongoDBが遅いときの切り分け方法
MongoDBが遅いときの切り分け方法MongoDBが遅いときの切り分け方法
MongoDBが遅いときの切り分け方法
 
AmebaのMongoDB活用事例
AmebaのMongoDB活用事例AmebaのMongoDB活用事例
AmebaのMongoDB活用事例
 
MongoDBざっくり解説
MongoDBざっくり解説MongoDBざっくり解説
MongoDBざっくり解説
 
MongoDB〜その性質と利用場面〜
MongoDB〜その性質と利用場面〜MongoDB〜その性質と利用場面〜
MongoDB〜その性質と利用場面〜
 
なかったらINSERTしたいし、あるならロック取りたいやん?
なかったらINSERTしたいし、あるならロック取りたいやん?なかったらINSERTしたいし、あるならロック取りたいやん?
なかったらINSERTしたいし、あるならロック取りたいやん?
 
Db tech showcase2015 how to replicate between clusters
Db tech showcase2015 how to replicate between clustersDb tech showcase2015 how to replicate between clusters
Db tech showcase2015 how to replicate between clusters
 
MongoDBを用いたソーシャルアプリのログ解析 〜解析基盤構築からフロントUIまで、MongoDBを最大限に活用する〜
MongoDBを用いたソーシャルアプリのログ解析 〜解析基盤構築からフロントUIまで、MongoDBを最大限に活用する〜MongoDBを用いたソーシャルアプリのログ解析 〜解析基盤構築からフロントUIまで、MongoDBを最大限に活用する〜
MongoDBを用いたソーシャルアプリのログ解析 〜解析基盤構築からフロントUIまで、MongoDBを最大限に活用する〜
 
DB tech showcase: 噂のMongoDBその用途は?
DB tech showcase: 噂のMongoDBその用途は?DB tech showcase: 噂のMongoDBその用途は?
DB tech showcase: 噂のMongoDBその用途は?
 
Introduction to MongoDB
Introduction to MongoDBIntroduction to MongoDB
Introduction to MongoDB
 
後悔しないもんごもんごの使い方 〜アプリ編〜
後悔しないもんごもんごの使い方 〜アプリ編〜後悔しないもんごもんごの使い方 〜アプリ編〜
後悔しないもんごもんごの使い方 〜アプリ編〜
 
初心者向けMongoDBのキホン!
初心者向けMongoDBのキホン!初心者向けMongoDBのキホン!
初心者向けMongoDBのキホン!
 
はじめてのMongoDB
はじめてのMongoDBはじめてのMongoDB
はじめてのMongoDB
 
MongoDB
MongoDBMongoDB
MongoDB
 
Mongo db勉強会の補足
Mongo db勉強会の補足Mongo db勉強会の補足
Mongo db勉強会の補足
 
Programming camp 2008, Codereading
Programming camp 2008, CodereadingProgramming camp 2008, Codereading
Programming camp 2008, Codereading
 
Mongo dbを知ろう
Mongo dbを知ろうMongo dbを知ろう
Mongo dbを知ろう
 
分割と整合性と戦う
分割と整合性と戦う分割と整合性と戦う
分割と整合性と戦う
 
MongoDB very basic (Japanese) / MongoDB基礎の基礎
MongoDB very basic (Japanese) / MongoDB基礎の基礎MongoDB very basic (Japanese) / MongoDB基礎の基礎
MongoDB very basic (Japanese) / MongoDB基礎の基礎
 

Similar to Casual Compression on MongoDB

Mongo dbを知ろう devlove関西
Mongo dbを知ろう   devlove関西Mongo dbを知ろう   devlove関西
Mongo dbを知ろう devlove関西Ryuji Tamagawa
 
RDB経験者に送るMongoDBの勘所(db tech showcase tokyo 2013)
RDB経験者に送るMongoDBの勘所(db tech showcase tokyo 2013)RDB経験者に送るMongoDBの勘所(db tech showcase tokyo 2013)
RDB経験者に送るMongoDBの勘所(db tech showcase tokyo 2013)Ryuji Tamagawa
 
Mongo db勉強会
Mongo db勉強会Mongo db勉強会
Mongo db勉強会otmb
 
Htmlコーディングの効率化 前編
Htmlコーディングの効率化 前編Htmlコーディングの効率化 前編
Htmlコーディングの効率化 前編Yasuhito Yabe
 
Fluentd+MongoDB+Groovy
Fluentd+MongoDB+GroovyFluentd+MongoDB+Groovy
Fluentd+MongoDB+GroovyDaisuke Ando
 
mongoDB: OSC Tokyo2010 spring
mongoDB: OSC Tokyo2010 springmongoDB: OSC Tokyo2010 spring
mongoDB: OSC Tokyo2010 springichikaway
 
リーダブルコードを読んだ後
リーダブルコードを読んだ後リーダブルコードを読んだ後
リーダブルコードを読んだ後Kouhei Sutou
 
データベース勉強会 In 広島 mongodb
データベース勉強会 In 広島  mongodbデータベース勉強会 In 広島  mongodb
データベース勉強会 In 広島 mongodbRyuji Tamagawa
 
既存システムへの新技術活用法 ~fluntd/MongoDB~
既存システムへの新技術活用法 ~fluntd/MongoDB~既存システムへの新技術活用法 ~fluntd/MongoDB~
既存システムへの新技術活用法 ~fluntd/MongoDB~じゅん なかざ
 
Hybrid configurations db2_for_slideshare
Hybrid configurations db2_for_slideshareHybrid configurations db2_for_slideshare
Hybrid configurations db2_for_slidesharejapan_db2
 
Hybrid configurations
Hybrid configurationsHybrid configurations
Hybrid configurationsmtanaka0111
 
MongoDBCSharp
MongoDBCSharpMongoDBCSharp
MongoDBCSharpytanno
 
ソーシャルゲームにおけるAWS/MongoDB利用事例
ソーシャルゲームにおけるAWS/MongoDB利用事例ソーシャルゲームにおけるAWS/MongoDB利用事例
ソーシャルゲームにおけるAWS/MongoDB利用事例Masakazu Matsushita
 

Similar to Casual Compression on MongoDB (20)

Mongo dbを知ろう devlove関西
Mongo dbを知ろう   devlove関西Mongo dbを知ろう   devlove関西
Mongo dbを知ろう devlove関西
 
RDB経験者に送るMongoDBの勘所(db tech showcase tokyo 2013)
RDB経験者に送るMongoDBの勘所(db tech showcase tokyo 2013)RDB経験者に送るMongoDBの勘所(db tech showcase tokyo 2013)
RDB経験者に送るMongoDBの勘所(db tech showcase tokyo 2013)
 
MongoDB勉強会資料
MongoDB勉強会資料MongoDB勉強会資料
MongoDB勉強会資料
 
Mongoざっくり紹介
Mongoざっくり紹介Mongoざっくり紹介
Mongoざっくり紹介
 
Mongo db勉強会
Mongo db勉強会Mongo db勉強会
Mongo db勉強会
 
Htmlコーディングの効率化 前編
Htmlコーディングの効率化 前編Htmlコーディングの効率化 前編
Htmlコーディングの効率化 前編
 
Fluentd+MongoDB+Groovy
Fluentd+MongoDB+GroovyFluentd+MongoDB+Groovy
Fluentd+MongoDB+Groovy
 
mongoDB: OSC Tokyo2010 spring
mongoDB: OSC Tokyo2010 springmongoDB: OSC Tokyo2010 spring
mongoDB: OSC Tokyo2010 spring
 
リーダブルコードを読んだ後
リーダブルコードを読んだ後リーダブルコードを読んだ後
リーダブルコードを読んだ後
 
Mongo db world 2018
Mongo db world 2018Mongo db world 2018
Mongo db world 2018
 
データベース勉強会 In 広島 mongodb
データベース勉強会 In 広島  mongodbデータベース勉強会 In 広島  mongodb
データベース勉強会 In 広島 mongodb
 
既存システムへの新技術活用法 ~fluntd/MongoDB~
既存システムへの新技術活用法 ~fluntd/MongoDB~既存システムへの新技術活用法 ~fluntd/MongoDB~
既存システムへの新技術活用法 ~fluntd/MongoDB~
 
Ceilometer苦労話
Ceilometer苦労話Ceilometer苦労話
Ceilometer苦労話
 
Hybrid configurations db2_for_slideshare
Hybrid configurations db2_for_slideshareHybrid configurations db2_for_slideshare
Hybrid configurations db2_for_slideshare
 
Hybrid configurations
Hybrid configurationsHybrid configurations
Hybrid configurations
 
20120831 mongoid
20120831 mongoid20120831 mongoid
20120831 mongoid
 
WiredTigerを詳しく説明
WiredTigerを詳しく説明WiredTigerを詳しく説明
WiredTigerを詳しく説明
 
MongoDB3.2の紹介
MongoDB3.2の紹介MongoDB3.2の紹介
MongoDB3.2の紹介
 
MongoDBCSharp
MongoDBCSharpMongoDBCSharp
MongoDBCSharp
 
ソーシャルゲームにおけるAWS/MongoDB利用事例
ソーシャルゲームにおけるAWS/MongoDB利用事例ソーシャルゲームにおけるAWS/MongoDB利用事例
ソーシャルゲームにおけるAWS/MongoDB利用事例
 

More from moai kids

中国最新ニュースアプリ事情
中国最新ニュースアプリ事情中国最新ニュースアプリ事情
中国最新ニュースアプリ事情moai kids
 
FluentdとRedshiftの素敵な関係
FluentdとRedshiftの素敵な関係FluentdとRedshiftの素敵な関係
FluentdとRedshiftの素敵な関係moai kids
 
Twitterのsnowflakeについて
TwitterのsnowflakeについてTwitterのsnowflakeについて
Twitterのsnowflakeについてmoai kids
 
Programming Hive Reading #4
Programming Hive Reading #4Programming Hive Reading #4
Programming Hive Reading #4moai kids
 
Programming Hive Reading #3
Programming Hive Reading #3Programming Hive Reading #3
Programming Hive Reading #3moai kids
 
"Programming Hive" Reading #1
"Programming Hive" Reading #1"Programming Hive" Reading #1
"Programming Hive" Reading #1moai kids
 
Hadoop Conference Japan 2011 Fallに行ってきました
Hadoop Conference Japan 2011 Fallに行ってきましたHadoop Conference Japan 2011 Fallに行ってきました
Hadoop Conference Japan 2011 Fallに行ってきましたmoai kids
 
HBase本輪読会資料(11章)
HBase本輪読会資料(11章)HBase本輪読会資料(11章)
HBase本輪読会資料(11章)moai kids
 
snappyについて
snappyについてsnappyについて
snappyについてmoai kids
 
第四回月次セミナー(公開版)
第四回月次セミナー(公開版)第四回月次セミナー(公開版)
第四回月次セミナー(公開版)moai kids
 
第三回月次セミナー(公開版)
第三回月次セミナー(公開版)第三回月次セミナー(公開版)
第三回月次セミナー(公開版)moai kids
 
Pythonで自然言語処理
Pythonで自然言語処理Pythonで自然言語処理
Pythonで自然言語処理moai kids
 
HandlerSocket plugin Client for Javaとそれを用いたベンチマーク
HandlerSocket plugin Client for Javaとそれを用いたベンチマークHandlerSocket plugin Client for Javaとそれを用いたベンチマーク
HandlerSocket plugin Client for Javaとそれを用いたベンチマークmoai kids
 
Yammer試用レポート(公開版)
Yammer試用レポート(公開版)Yammer試用レポート(公開版)
Yammer試用レポート(公開版)moai kids
 
掲示板時間軸コーパスを用いたワードトレンド解析(公開版)
掲示板時間軸コーパスを用いたワードトレンド解析(公開版)掲示板時間軸コーパスを用いたワードトレンド解析(公開版)
掲示板時間軸コーパスを用いたワードトレンド解析(公開版)moai kids
 
中国と私(仮題)
中国と私(仮題)中国と私(仮題)
中国と私(仮題)moai kids
 
不自然言語処理コンテストLT資料
不自然言語処理コンテストLT資料不自然言語処理コンテストLT資料
不自然言語処理コンテストLT資料moai kids
 
n-gramコーパスを用いた類義語自動獲得手法について
n-gramコーパスを用いた類義語自動獲得手法についてn-gramコーパスを用いた類義語自動獲得手法について
n-gramコーパスを用いた類義語自動獲得手法についてmoai kids
 
Analysis of ‘lang-8’
Analysis of ‘lang-8’Analysis of ‘lang-8’
Analysis of ‘lang-8’moai kids
 
Androidの音声認識とテキスト読み上げ機能について
Androidの音声認識とテキスト読み上げ機能についてAndroidの音声認識とテキスト読み上げ機能について
Androidの音声認識とテキスト読み上げ機能についてmoai kids
 

More from moai kids (20)

中国最新ニュースアプリ事情
中国最新ニュースアプリ事情中国最新ニュースアプリ事情
中国最新ニュースアプリ事情
 
FluentdとRedshiftの素敵な関係
FluentdとRedshiftの素敵な関係FluentdとRedshiftの素敵な関係
FluentdとRedshiftの素敵な関係
 
Twitterのsnowflakeについて
TwitterのsnowflakeについてTwitterのsnowflakeについて
Twitterのsnowflakeについて
 
Programming Hive Reading #4
Programming Hive Reading #4Programming Hive Reading #4
Programming Hive Reading #4
 
Programming Hive Reading #3
Programming Hive Reading #3Programming Hive Reading #3
Programming Hive Reading #3
 
"Programming Hive" Reading #1
"Programming Hive" Reading #1"Programming Hive" Reading #1
"Programming Hive" Reading #1
 
Hadoop Conference Japan 2011 Fallに行ってきました
Hadoop Conference Japan 2011 Fallに行ってきましたHadoop Conference Japan 2011 Fallに行ってきました
Hadoop Conference Japan 2011 Fallに行ってきました
 
HBase本輪読会資料(11章)
HBase本輪読会資料(11章)HBase本輪読会資料(11章)
HBase本輪読会資料(11章)
 
snappyについて
snappyについてsnappyについて
snappyについて
 
第四回月次セミナー(公開版)
第四回月次セミナー(公開版)第四回月次セミナー(公開版)
第四回月次セミナー(公開版)
 
第三回月次セミナー(公開版)
第三回月次セミナー(公開版)第三回月次セミナー(公開版)
第三回月次セミナー(公開版)
 
Pythonで自然言語処理
Pythonで自然言語処理Pythonで自然言語処理
Pythonで自然言語処理
 
HandlerSocket plugin Client for Javaとそれを用いたベンチマーク
HandlerSocket plugin Client for Javaとそれを用いたベンチマークHandlerSocket plugin Client for Javaとそれを用いたベンチマーク
HandlerSocket plugin Client for Javaとそれを用いたベンチマーク
 
Yammer試用レポート(公開版)
Yammer試用レポート(公開版)Yammer試用レポート(公開版)
Yammer試用レポート(公開版)
 
掲示板時間軸コーパスを用いたワードトレンド解析(公開版)
掲示板時間軸コーパスを用いたワードトレンド解析(公開版)掲示板時間軸コーパスを用いたワードトレンド解析(公開版)
掲示板時間軸コーパスを用いたワードトレンド解析(公開版)
 
中国と私(仮題)
中国と私(仮題)中国と私(仮題)
中国と私(仮題)
 
不自然言語処理コンテストLT資料
不自然言語処理コンテストLT資料不自然言語処理コンテストLT資料
不自然言語処理コンテストLT資料
 
n-gramコーパスを用いた類義語自動獲得手法について
n-gramコーパスを用いた類義語自動獲得手法についてn-gramコーパスを用いた類義語自動獲得手法について
n-gramコーパスを用いた類義語自動獲得手法について
 
Analysis of ‘lang-8’
Analysis of ‘lang-8’Analysis of ‘lang-8’
Analysis of ‘lang-8’
 
Androidの音声認識とテキスト読み上げ機能について
Androidの音声認識とテキスト読み上げ機能についてAndroidの音声認識とテキスト読み上げ機能について
Androidの音声認識とテキスト読み上げ機能について
 

Casual Compression on MongoDB

  • 1. Casual Compression on    -present at MongoDB Casual Talks- @just_do_neet
  • 2. Today’s Agenda 今日のお題目 •MongoDBの課題 •MongoDBでのデータ圧縮 •まとめ MongoDB Casual Talks #1 2
  • 3. MongoDB MongoDB http://www.mongodb.org/ http://www.mongodb.jp/ •10gen社が主体として開発しているオープンソース 所謂「NoSQL」の一つ MongoDB Casual Talks #1 3
  • 4. MongoDB is over? MongoDBはオワコン? http://suzuzuzuru.blogspot.jp/2012/04/mongodb.html http://blog.engineering.kiip.me/post/20988881092/a-year-with-mongodb MongoDB Casual Talks #1 4
  • 5. MongoDB is over? MongoDBはオワコン? http://www.zopyx.com/blog/goodbye-mongodb MongoDB Casual Talks #1 5
  • 6. Cons. MongoDBの欠点(主観含む) •トランザクション未サポート •トランザクションは甘え (ドヤァ •Global Lock(2.2からCollection Lockに?) •システムリソースが肥大化(メモリ、ディスク) •データ圧縮未対応(通信、データストア共) •セキュリティ周りが弱い etc. MongoDB Casual Talks #1 6
  • 7. Cons. MongoDBの欠点(主観含む) •トランザクション未サポート •トランザクションは甘え (ドヤァ •Global Lock(2.2からCollection Lockに?) •システムリソースが肥大化(メモリ、ディスク) •データ圧縮未対応(通信、データストア共) •セキュリティ周りが弱い etc. MongoDB Casual Talks #1 7
  • 8. Compress 圧縮関連のJIRA •BSONデータの圧縮→not supported! https://jira.mongodb.org/browse/SERVER-164 MongoDB Casual Talks #1 8
  • 9. Compress 圧縮関連のJIRA •通信路の圧縮→not supported! https://jira.mongodb.org/browse/SERVER-3018 MongoDB Casual Talks #1 9
  • 10. Compress Quoraに掲載されている「最も興味があるMongoDBのJIRA」 http://www.quora.com/MongoDB/What-are-the-most-interesting-MongoDB-JIRA-issues MongoDB Casual Talks #1 10
  • 11. Compress vs Not Compress 圧縮:非圧縮のデータサイズの差 •下記例は同一フォーマットの文字列データを格納 した際の比較(MongoDB / HBase) •MongoDBはHBase(snappy圧縮時)の三倍強。 700000000 MongoDB 600000000 MongoDB(fragment) 500000000 HBase HBase(fragment) 400000000 HBase(snappy) 300000000 200000000 100000000 0 size(1,000,000 record) MongoDB Casual Talks #1 11
  • 12. Cons. MongoDBの欠点(主観含む) •Big Dataを扱う環境にはあまり向かない。 •スケールするが故に、下手にそれなりの規模の システムに導入するとサーバー無限増殖の刑 に... MongoDB Casual Talks #1 12
  • 14. Casual Compression MongoDBでのカジュアルなデータ圧縮 •以下について試してみました。 1.フィールド名をできるだけ短くする 2.特定のデータをbinary形式で保存 3.小さい正整数の整数符号化 MongoDB Casual Talks #1 14
  • 15. #1 To shorten filed name フィールド名の短縮 •MongoDBはBSON形式でデータを保存 •BSONは1つのドキュメントの中にフィールド名 情報を持つ。 •複数のレコードが同一のフィールド名を持って いても、1レコードごとに情報を持つ。 MongoDB Casual Talks #1 15
  • 16. #1 To shorten filed name フィールド名の短縮 http://bsonspec.org/#/specification MongoDB Casual Talks #1 16
  • 17. #1 To shorten filed name フィールド名の短縮 MongoDB Casual Talks #1 17
  • 18. #1 To shorten filed name フィールド名の短縮 100万件で 約8MBの差 MongoDB Casual Talks #1 18
  • 19. #1 To shorten filed name 参考ブログ http://christophermaier.name/blog/2011/05/22/MongoDB-key-names MongoDB Casual Talks #1 19
  • 20. #1 To shorten filed name 参考ブログ http://christophermaier.name/blog/2011/05/22/MongoDB-key-names MongoDB Casual Talks #1 20
  • 21. #1 To shorten filed name OR Mapperを用いたfield nameのマッピング •OR Mapperでfield nameのマッピングを行うと名 前が短すぎる弊害は多少抑制できる。 •JavaではMorphiaがオススメ。 http://code.google.com/p/morphia/ •Spring Dataは重厚すぎる気がする。 MongoDB Casual Talks #1 21
  • 22. #1 To shorten filed name OR Mapperを用いたfield nameのマッピング @Data @Entity(value = "slim") class TestDTOSlim { @Id ObjectId id; @Property(value = "u") long uuid; @Property(value = "n") String name; @Property(value = "d") Date date; } MongoDB Casual Talks #1 22
  • 23. #2 Convert to binary 特定のデータをbinary形式に変換 •MongoDBが圧縮をサポートしていないのでアプ リケーション側で圧縮をしてbinaryで保存。 •特定のフィールドを圧縮 •BSON以外の構造化フォーマットを用いて複数 フィールドをまとめてシリアライズ→圧縮 MongoDB Casual Talks #1 23
  • 24. #2 Convert to binary 検証に使用したデータモデル public class NormalModel { @Id ObjectId oid; long uuid; int id; char flag; String name; String description; } MongoDB Casual Talks #1 24
  • 25. #2 Convert to binary 検証で使用した圧縮アルゴリズム •Deflate(Best Compression) •LZO •Google Snappy •LZ4 MongoDB Casual Talks #1 25
  • 26. #2 Convert to binary Google Snappy •2011/4ごろにGoogleがオープンソースとして公開 した圧縮アルゴリズム。 高速な圧縮・伸張が特徴。 •http://code.google.com/p/snappy/ MongoDB Casual Talks #1 26
  • 27. #2 Convert to binary LZ4 •Google Snappyよりも圧縮・伸張速度が速いと言 われている圧縮アルゴリズム。 •http://code.google.com/p/lz4/ MongoDB Casual Talks #1 27
  • 28. #2 Convert to binary BSON以外のシリアライズ手法 •Message Pack http://msgpack.org/ MongoDB Casual Talks #1 28
  • 29. #2 Convert to binary 検証条件 •以下の条件で比較 1.何もしない 2.フィールド名の短縮 3. 2 + 特定のフィールドの圧縮 4.複数のフィールド情報をMessagePackでシリ アライズ 5. 4.+圧縮 MongoDB Casual Talks #1 29
  • 30. #2 Convert to binary 検証結果 normal short key short key + msgpack 1500000 1200000 900000 600000 300000 0 none deflate lzo snappy lz4 MongoDB Casual Talks #1 30
  • 31. #2 Convert to binary 検証結果 normal short key 1,2, 4(非圧縮) short key + msgpack 1500000 1200000 900000 600000 300000 0 none deflate lzo snappy lz4 MongoDB Casual Talks #1 31
  • 32. #2 Convert to binary 検証結果 normal short key short key + msgpack 1500000 3,5(圧縮) 1200000 900000 600000 300000 0 none deflate lzo snappy lz4 MongoDB Casual Talks #1 32
  • 33. #2 Convert to binary 検証結果 normal short key short key + msgpack 1500000 1200000 900000 600000 300000 0 none deflate lzo snappy lz4 MongoDB Casual Talks #1 33
  • 34. #2 Convert to binary 検証結果 •「複数のフィールドをMessagePackでシリアライ ズ+圧縮アルゴリズムで圧縮」 の組み合わせで最大2/3の省サイズ化に成功。 •データパターン/データモデルによって傾向は 様々だと思う。 •圧縮・シリアライズのオーバーヘッドに注意。 •独自binary化すると後戻りできないので注意。 MongoDB Casual Talks #1 34
  • 35. #3 Integer Encoding 整数値符号化 •たとえば数字の「1」を数バイト使用して表現す るのはもったいない。→整数値符号化 •Variable Byte Code •Simple9 •Simple16 •etc... MongoDB Casual Talks #1 35
  • 36. #3 Integer Encoding Variable Byte Code •整数値の値を最小1バイトで表現するための符号 化方式。数値部7bit(0~127)と、数値終端を表すフ ラグ1bitの組み合わせで数値を符号化します。 •https://gist.github.com/3003981 • 0x00-0x7f : 1xxxxxxx • 0x80-0x3fff : 0xxxxxxx 1xxxxxxx • 0x4000-0x1fffff : 0xxxxxxx 0xxxxxxx 1xxxxxxx ※「x」は0、もしくは1 MongoDB Casual Talks #1 36
  • 37. #3 Integer Encoding 検証に使用したデータモデル public class NormalModel{ ! @Id ! ObjectId oid; ! @Property(value = "id") ! int id; //もしくはlong } MongoDB Casual Talks #1 37
  • 38. #3 Integer Encoding 検証条件 •以下の条件で比較 1. 整数値をinteger(4byte)で保存 2. 整数値をlong(8byte)で保存 3. 整数値をVariable Byte Codeで変換して保存 MongoDB Casual Talks #1 38
  • 39. #3 Integer Encoding 検証結果 integer long variable byte code 37000000 36000000 35000000 34000000 33000000 32000000 31000000 30000000 max : 128 max : 16384 max : 2097152 MongoDB Casual Talks #1 39
  • 40. #3 Integer Encoding 検証結果 •整数値符号化で保存をしたら、逆にIntegerよりも サイズが大きくなった・・・ •BSONの仕様が関係  int32 : 4bytes  int64 : 8bytes  binary : int32 subtype(byte*) MongoDB Casual Talks #1 40
  • 41. Casual Compression MongoDBでのカジュアルなデータ圧縮 •以下について試してみました。 1.フィールド名をできるだけ短くする →◎ 2.特定のデータをbinary形式で保存 →⃝ 3.小さい正整数の整数符号化 →☓ MongoDB Casual Talks #1 41
  • 43. HBase HBaseなら圧縮をサポートしてます •HBaseなら.... •データの圧縮に標準で対応 (圧縮したいTableのFamilyごとに指定可能。 アルゴリズムも複数選択可能) •可変長整数値に標準で対応 (VIntWritable / VLongWritable) •大きいデータを扱う場合はHBaseを(ry MongoDB Casual Talks #1 43
  • 45. Conclusion まとめにかえて •MongoDBはデータサイズが肥大化しがちです が、アプリケーション側のカジュアルな工夫で多 少はデータサイズの削減ができます。 •用途に応じて、適切な現場でMongoDBを使いま しょう。 •個人的にはRedisが好きです。 MongoDB Casual Talks #1 45
  • 46. ご清聴 ありがとうございました MongoDB Casual Talks #1 46