レポート

「第2回 MongoDB JP 勉強会 in Tokyo」レポート

この記事を読むのに必要な時間:およそ 6 分

@bibrostさん「Type-safe MongoDB with Scala 〜静的型付け言語とMongoDBのつきあい方〜」

@bibrostさんからはScalaのような静的型付け言語とMongoDBのつきあい方について様々なわかりやすい具体例とともにお話していただきました。

@bibrost氏

静的型付けについて

まずは静的型付けについて,型推論も行ってくれる柔軟な言語Scalaを取り上げて丁寧に紹介されました。静的型付けの大きなメリットの1つは「変なことが起きない⁠⁠,コンパイル時に型が決まるのでデプロイされたコードで予期しないことが起きる可能性が少ない,バグがあっても追跡しやすいとのことでした。そのメリットを「トイレ」の実装を例にしてわかりやすく,おもしろく説明され,会場は大いに盛り上がりました。

静的型付け言語とMongoDBのつきあい方

次に静的型付け言語でMongoDBを扱うことについてメリットとデメリットをお話して頂きました。まずデメリットとしては,スキーマフリーをはじめとした,非常に柔軟かつ寛容な機能を持つMongoDBにおいては,型付けの制約は少なからず実装スピードに関しては足かせになってしまいます。ただし,それを補うだけのメリットをもたらす使い方もあるということです。その使い方とは,"Type-safe MongoDB" = Persistent for Model Class(モデルクラスの永続化)に用途を絞ることです。この用途の元ではアプリ側でほぼ定義が完結し,柔軟に扱えかつMongoDBの強力なクエリ機能を使用できます。

Scala + Rogueを使った実装

次に静的型付け言語であるScalaでの実装が紹介されました。同時に使用したScalaのWebフレームワークの1つであるLiftと,Lift向けにFoursquare社が開発したLift用のクエリ生成ライブラリ,Rogueに関するそのライブラリの構造とMongoDBのクエリの使い方について,コードベースで説明されました。

Katsumaweb.netのコレクション構造

最後に実際にScalaとMongoDBで実装されている Katsumaweb.net というサイトのモデル構造が紹介されました。

筆者の感想

本セッションでは,Web開発などにおいて,Scalaのような柔軟な静的型付け言語をMongoDBとともに用いることで,MongoDBの柔軟さにデータの「安全・安心感」をプラスできることが説明されました。あらゆるデータを寛容に受け入れてくれるMongoDBには良きしない変なデータが混入されていてもなかなか気づくことができません。しかし,それを事前に型チェックを行い,予期しないキーや値を排除してからMongoDBに格納されているデータにはそういった事態を減らすことができます。これは静的型付け言語のコンパイルの手間を大きく補うメリットではないでしょうか。特にScalaなら少ないコード量で記述できますし,非常に相性が良いのでは無いかと感じました。

今回はScalaとMongoDBという,非常におもしろい組み合わせでの使う例を聞くことができました。ただ,この組み合わせはFoursquareが採用しているなど,世界ではメジャーなものになってきつつあります。今後とも要注目の技術であるように感じています。

@muddydixonさん「アクセスログをできるだけいろいろ見る時のmapreduce + ニフティクラウドでのパフォーマンス」

@muddydixonさんからはMongoDBのMapReduceについて,非常に豊富な例とパフォーマンス検証が紹介されました。MongoDBのMapReduceに関しては簡単なサンプル以外で実践的なコードが記載された資料が少ないので,今回の発表と資料は非常に貴重なものとなっています。

@muddydixon氏

不定形データの放置場所としてのMongoDB

非常に多数のサービスを抱え,ログという観点ではサービス間で全く独立していて互換性の無いような環境に身を置く@muddydixonさんにとってのMongoDBとは「不定形データの放置場所⁠⁠。まずはMongoDBに様々な不定形データを格納しておき,眺め,そこに有用な発見があった場合は本腰を入れてHadoopなどの他の技術を駆使して解析を行っていく,とのことです。MongoDBはその具体的なアクションにつなげるべき有用なデータを発見するためのツールとして使われています。

MongoDBのmapreduce

冒頭にも触れましたが,MongoDBのMapReduceは公開されている例がそれほど多くありません。そんなMongoDBのMapReduceについて,⁠MapReduceとは何か?」から始まり,Mongo MapReduceの振る舞いとオプションが説明されました。ここでのポイントは,HadoopなどのMapReduceとは違ってShuffleフェーズがないこと,Reduceは複数回行われる可能性があるため,各キーごとにデータが完全に集約された状況で何らかの処理をしないといけない場合はFinalizeを使用するということです(注:本資料の発表内容はMongoDB v.1.8を想定したものになっています。現状の v.1.6.* 系ではオプションが異なりますので注意してください⁠⁠。

MongoDBでアクセスログを解析する

実際にアクセスログ解析を目的として,Mongo MapReduceを行う手順を具体的に紹介されました。mongoimportコマンドを利用してのデータインポートの方法から,時間単位・UU単位・セッション単位における集計方法をコードとともに解説して頂きました。特に「所感」「小技・tips」では,普段なかなか知ることのできないコツや留意点が伝授されました。

nifty cloudでMongoDBの条件変えてパフォーマンスとってみる

ニフティクラウド上で以下のような計測条件の元,Twitterデータに対してクエリとMapReduceパフォーマンス比較を行っているとのことです。

Sharding1. なし
3台
Striping
(via NIFTY Cloud ユーザーブログ)
1. Striping なし
2. Striping あり(物理相当)
VMmini
Large 16

この計測結果(グラフ)と考察は非常に参考になりますので,資料を一読ください。

筆者の感想

MongoDBのMapReduceを利用した際のコードサンプルは非常に参考になると同時に,実際に使用・検証してみた上での考察やTipsもとても貴重な情報となっており,今後Mongo MapReduceを使う際の参考書的な存在になると思います。このような具体的な使用ケースの話を聞け,かつその本人にかれこれ質問ができるのも勉強会ならではの醍醐味だと感じました。

著者プロフィール

井上敬浩(いのうえたかひろ)

MongoDB JP主催者。MongoDB日本語ドキュメント訳もしています。芸者東京エンターテインメントGTE所属(データマイングエンジニア)。Hadoop,MongoDB,GraphDB(Neo4j),Redis等を使用して,大規模かつ複雑なソーシャルデータの解析を行っています。解析技術においては業界一を本気で目指しています。

Twitter:@doryokujin