{"title": "アクセスログをできるだけいろいろ見る時のmapreduce +
                ニフティクラウドでの構築パフォーマンスを初心者からわかりやすく",
 "author": "Muddy Dixon",
 "twitter": "@muddydixon",
 "place": "第2回 MongoDB JP 勉強会 in Tokyo"}

自己紹介

取り組み

?area=0013&bus=2&ex75=1&floors2=1&line=2171&line=2172&line=2196&otherMflg=0&r10=35&r12=3&r14=1&r1=50000&r20=1&r20=2&r2=70000&r34=1&r35=1024&r37=256&r38=128&r39=64&r3=11&r4=12&r6=15&r8=4&station=2171031&station=2171036&station=2171041&type=rdw

( ゚д゚) < font-size: .2em ?? r20 ??

(つд⊂)ゴシゴシ

(;゚д゚)

(つд⊂)ゴシゴシ
  _, ._
(;゚ Д゚)

mongodb=不定形データの放置場所

{hostname; "hogehoge",
 url: "fugafuga",
 param: {
  area: [0013],
  ex75: [1],
  line: [2171,2172,2196],
  otherMflg: [0],
  /* 中略 */
  r14: [1],
  r1: [50000],
  r20: [1],
 },				
 ip: "127.0.0.1"
}

そういう背景もあって

アジェンダ

  1. mongodbのmapreduce
  2. mongodbでアクセスログを解析する
  3. nifty cloudでmongodbの条件変えてパフォーマンスとってみる

mongodbのmapReduce

もう少し調べてみても

というわけで

最初から学ぶmongodbのmapReduce

mapReduce

Hadoop での mapReduce

via (゚∀゚)o彡 sasata299's blog
Map
データを分割して、workernodeに配って、workernodeが<key, val>を作る処理をする
Shuffle & Sort
同じ key のデータは必ず同じ Reduce に、しかも sort された状態で渡される
Reduce
同じ key のデータを集計処理を行い、出力する

MongoDB での mapReduce

Map
(shardingされていれば各shard serverで)<key, val>を作る処理をする
Reduce
shardで同じ key のデータを集計処理を行い、出力する(同じkeyがすべて集まっていないこともあるので注意)
Reducerは逐次的(iterator)を使って集計を行う(r_(t+1) = summarize(r_(t), taple))
Finalize
この時点のアウトプットでは同じkeyが集まっているので、集計以上のこと(平均や分散などを得る)はここで行う

MapReduce in Shard Environment threadでの10genの回答

最新版4/2のdb/commands/mr.cppをちらっと見た感じでも見つかりませんでした

簡単な使い方

  1. とりあえず動かすならこれだけで十分
    							
    								var
            map = function(){
            /* some emits */
            },
    								reduce = function(k, vs){
    								/* part of output object and return it*/
    								},
    								out = 'outputCollectionName';
    								db.collection.mapReduce(map, reduce, {out: out})
    							
    						

あとの使い方は前述の「やってみた」系をみてください

ログ解析するときに重要そうなオプション

ログ解析するときに重要そうなオプション

実際にアクセスログを「できるだけ」mongodbで解析してみる

HadoopとかHiveとかでやったほうがいいところもたくさんあります。実際には、ボリュームとかを考えてやりますが、あえてmongodbでどこまでもやってみます

accessログ

doc形式

処理

  1. データのimport
  2. いくつかのcollectionの生成
  3. findで取り出せるようにする
    • sleepy.mongoose
    • mongodb-rest

データのimport

いくつかのcollectionの生成

UU

UU

セッション集計

所感

小技

ニフクラでbenchmark

参考

参考

参考

夢と希望

  1. scribeとかflumeなんかで各サーバからデータを回収
  2. hadoopとかcassandraにデータをぶち込んで
  3. hadoop / hadoop hive でmapReduce←重いバッチ(重回帰とかパターン抽出とか統計的な激重めなやつ)
  4. hadoop / hadoop hive streamをnode.jsで書いてmongodbにmongoimport←中くらいのバッチ(リピート間隔とか、相関係数とか重めなやつ)
  5. mongodb mapReduceでsub collection←軽いバッチ(時間ごとの集計とか)
  6. mongodb find←リアルタイムリクエスト

0 / 0