`

MongoDB mapreduce实例

阅读更多
  1. /************** The file is executed per 5 minutes by /etc/crontab.*****************/  
  2. var action_count_map = function(){  
  3.   emit(this.action, {action:this.action, count:1});  
  4. }  
  5.   
  6. var action_count_reduce = function(key, values){  
  7.   var count = 0;  
  8.   values.forEach(function(value){  
  9.     count += value.count;  
  10.   });  
  11.   return {action:key, count : count};  
  12. }  
  13.   
  14.   
  15. db.log.mapReduce(action_count_map, action_count_reduce, {query : {'action_count' : {$ne:1}},out: {reduce:'action_count'}});  
  16.   
  17. db.log.update({'action_count':{$ne:1}}, {$set:{'action_count':1}}, falsetrue);  

1. 在map中将每个action访问次数设为1

2. reduce中,统计相同action的访问次数

3. 执行mapReduce。指定了查询为‘action_count’不等于1,也就是没有执行过该统计;将结果存储在‘action_count’集合,并且使用reduce选项表示该结果集作为下次reduce的输入。

4. 在当前所有日志记录设置'action_count'的值为1,表示已经执行过该统计????

 

##############################################################

MongoDB MapReduce

MapReduce是一种计算模型,简单的说就是将大批量的工作(数据)分解(MAP)执行,然后再将结果合并成最终结果(REDUCE)。这样做的好处是可以在任务被分解后,可以通过大量机器进行并行计算,减少整个操作的时间。

 

上面是MapReduce的理论部分,下面说实际的应用,下面以MongoDB MapReduce为例说明。

下面是MongoDB官方的一个例子:

 

> db.things.insert( { _id : 1, tags : ['dog', 'cat'] } );
> db.things.insert( { _id : 2, tags : ['cat'] } );
> db.things.insert( { _id : 3, tags : ['mouse', 'cat', 'dog'] } );
> db.things.insert( { _id : 4, tags : []  } );

> // map function
> map = function(){
...    this.tags.forEach(
...        function(z){
...            emit( z , { count : 1 } );
...        }
...    );
...};

> // reduce function
> reduce = function( key , values ){
...    var total = 0;
...    for ( var i=0; i<values.length; i++ )
...        total += values[i].count;
...    return { count : total };
...};

db.things.mapReduce(map,reduce,{out:'tmp'})
{
    "result" : "tmp",
    "timeMillis" : 316,
    "counts" : {
        "input" : 4,
        "emit" : 6,
        "output" : 3
    },
    "ok" : 1,
}
> db.tmp.find()
{ "_id" : "cat", "value" : { "count" : 3 } }
{ "_id" : "dog", "value" : { "count" : 2 } }
{ "_id" : "mouse", "value" : { "count" : 1 } }

 

 

例子很简单,计算一个标签系统中每个标签出现的次数。

这里面,除了emit函数之外,所有都是标准的js语法,这个emit函数是非常重要的,可以这样理解,当所有需要计算的文档(因为在mapReduce时,可以对文档进行过滤,接下来会讲到)执行完了map函数,map函数会返回key_values对,key即是emit中的第一个参数key,values是对应同一key的emit的n个第二个参数组成的数组。这个key_values会作为参数传递给reduce,分别作为第1.2个参数。

reduce函数的任务就是将key-values变成key-value,也就是把values数组变成一个单一的值value。当key-values中的values数组过大时,会被再切分成很多个小的key-values块,然后分别执行Reduce函数,再将多个块的结果组合成一个新的数组,作为Reduce函数的第二个参数,继续Reducer操作。可以预见,如果我们初始的values非常大,可能还会对第一次分块计算后组成的集合再次Reduce。这就类似于多阶的归并排序了。具体会有多少重,就看数据量了。


reduce一定要能被反复调用,不论是映射环节还是前一个简化环节。所以reduce返回的文档必须能作为reduce的第二个参数的一个元素。

(当书写Map函数时,emit的第二个参数组成数组成了reduce函数的第二个参数,而Reduce函数的返回值,跟emit函数的第二个参数形式要一致,多个reduce函数的返回值可能会组成数组作为新的第二个输入参数再次执行Reduce操作。)

 

MapReduce函数的参数列表如下

 

db.runCommand(
 { mapreduce : <collection>,
   map : <mapfunction>,
   reduce : <reducefunction>
   [, query : <query filter object>]
   [, sort : <sort the query.  useful for optimization>]
   [, limit : <number of objects to return from collection>]
   [, out : <output-collection name>]
   [, keeptemp: <true|false>]
   [, finalize : <finalizefunction>]
   [, scope : <object where fields go into javascript global scope >]
   [, verbose : true]
 }
);
或者这么写:

 

 

db.collection.mapReduce(
                         <map>,
                         <reduce>,
                         {
                           <out>,
                           <query>,
                           <sort>,
                           <limit>,
                           <keytemp>,
                           <finalize>,
                           <scope>,
                           <jsMode>,
                           <verbose>
                         }
                       )
  • mapreduce:指定要进行mapreduce处理的collection
  • map:map函数
  • reduce:reduce函数
  • out:输出结果的collection的名字,不指定会默认创建一个随机名字的collection(如果使用了out选项,就不必指定keeptemp:true了,因为已经隐含在其中了)
  • query:一个筛选条件,只有满足条件的文档才会调用map函数。(query。limit,sort可以随意组合)
  • sort:和limit结合的sort排序参数(也是在发往map函数前给文档排序),可以优化分组机制
  • limit:发往map函数的文档数量的上限(要是没有limit,单独使用sort的用处不大)
  • keytemp:true或false,表明结果输出到的collection是否是临时的,如果想在连接关闭后仍然保留这个集合,就要指定keeptemp为true,如果你用的是MongoDB的mongo客户端连接,那必须exit后才会删除。如果是脚本执行,脚本退出或调用close会自动删除结果collection
  • finalize:是函数,它会在执行完map、reduce后再对key和value进行一次计算并返回一个最终结果,这是处理过程的最后一步,所以finalize就是一个计算平均数,剪裁数组,清除多余信息的恰当时机
  • scope:javascript代码中要用到的变量,在这里定义的变量在map,reduce,finalize函数中可见
  • verbose:用于调试的详细输出选项,如果想看MpaReduce的运行过程,可以设置其为true。也可以print把map,reduce,finalize过程中的信息输出到服务器日志上。

 

执行MapReduce函数返回的文档结构如下

  { result : <collection_name>,

    timeMillis : <job_time>, 

    counts : {

               input : <number of objects scanned>,

               emit : <number of times emit was called>,

               output : <number of items in output collection>

     } ,

     ok : <1_if_ok>,

     [, err : <errmsg_if_error>]

}

  • result:储存结果的collection的名字,这是个临时集合,MapReduce的连接关闭后自动就被删除了。
  • timeMillis:执行花费的时间,毫秒为单位
  • input:满足条件被发送到map函数的文档个数
  • emit:在map函数中emit被调用的次数,也就是所有集合中的数据总量
  • ouput:结果集合中的文档个数(count对调试非常有帮助)
  • ok:是否成功,成功为1
  • err:如果失败,这里可以有失败原因,不过从经验上来看,原因比较模糊,作用不大

java代码执行MapReduce的方法:

[java] view plaincopy
  1. public void MapReduce() {  
  2.         Mongo mongo = new Mongo("localhost",27017);  
  3.         DB db = mongo.getDB("qimiguangdb");  
  4.         DBCollection coll = db.getCollection("collection1");  
  5.          
  6.         String map = "function() { emit(this.name, {count:1});}";  
  7.                                                                                                                 
  8.      
  9.         String reduce = "function(key, values) {";    
  10.         reduce=reduce+"var total = 0;";    
  11.         reduce=reduce+"for(var i=0;i<values.length;i++){total += values[i].count;}";    
  12.         reduce=reduce+"return {count:total};}";    
  13.             
  14.         String result = "resultCollection";    
  15.             
  16.         MapReduceOutput mapReduceOutput = coll.mapReduce(map,    
  17.                 reduce.toString(), result, null);    
  18.         DBCollection resultColl = mapReduceOutput.getOutputCollection();    
  19.         DBCursor cursor= resultColl.find();    
  20.         while (cursor.hasNext()) {    
  21.             System.out.println(cursor.next());    
  22.         }    
  23.     }    
分享到:
评论

相关推荐

    mongodb mapreduce 实例

    mongodb mapreduce 实例,该例子主要用来做订单统计的。具体问题请到博客提问。

    MongoDB中的MapReduce简介

    MongoDB MapReduce MapReduce是一种计算模型,简单的说就是将大批量的工作(数据)分解(MAP)执行,然后再将结果合并成最终结果(REDUCE)。这样做的好处是可以在任务被分解后,可以通过大量机器进行并行计算,减少...

    MongoDB中MapReduce编程模型使用实例

    作为一个优秀的编程模型,MapReduce在大数据处理中有很大的优势,而mongodb也支持这一编程模型,本文通过简单的单词计数示例论述在mongodb中如何使用MapReduce

    八天学会MongoDB

    MongoDB五分钟教程:MongoDB Shell入门 基于MongoDB进行分布式数据存储的步骤 MongoDB分布式存储的MapReduce并行查询 实例:MongoDB与Tomcat的结合更便捷

    MongoDB学习笔记之MapReduce使用示例

    主要介绍了MongoDB学习笔记之MapReduce使用示例,本文直接给出实例代码,需要的朋友可以参考下

    深入云计算 MongoDB管理与开发实战详解pdf.part1

    第15章 Java对MongoDB的基本操作实例 15.1 Java快速入门 15.1.1 安装Java驱动程序和开发环境 15.1.2 访问控制 15.1.3 Java对MongoDB数据库的基本操作 15.1.4 Java驱动的一致性 15.2 Java常用操作 ...

    深入云计算 MongoDB管理与开发实战详解pdf.part2

    第15章 Java对MongoDB的基本操作实例 15.1 Java快速入门 15.1.1 安装Java驱动程序和开发环境 15.1.2 访问控制 15.1.3 Java对MongoDB数据库的基本操作 15.1.4 Java驱动的一致性 15.2 Java常用操作 ...

    Node.js对MongoDB进行增删改查操作的实例代码

    MongoDB简介 MongoDB是一个开源的、文档型的NoSQL数据库程序。MongoDB将数据存储在类似JSON的文档中,操作起来更灵活方便。NoSQL数据库中的文档(documents)对应于...•支持MapReduce操作,将大量数据压缩为有用的聚合结

    PHP与MongoDB简介|安全|M+PHP应用实例详解

    一、MongoDB简介MongoDB (名称来自”humongous”) 是一个可扩展的、高性能...复制和故障切换支持•Auto-Sharding自动分片支持云级扩展性•MapReduce 支持复杂聚合•商业支持,培训和咨询 二、安装MongoDB安装MongoDB非常

    大数据技术开发环境搭建.docx

    运行Hadoop伪分布式实例 30 启动YARN 35 附加教程: 配置PATH环境变量 37 使用Eclipse编译运行MapReduce程序(Hadoop-Eclipse-Plugin,建议) 38 使用Eclipse打包自己的MapReduce程序 51 不用Hadoop-Eclipse-...

    大数据实验报告(实验一到八)

    实验一: 熟悉常用的Linux操作和Hadoop操作 ...实验四: 熟悉常用的mongoDB数据库操作 实验五: MapReduce初级编程实践 实验六: 熟悉Hive的基本操作 实验七: Spark初级编程实践 实验八: Flink初级编程实践

    hadoop-mini-clusters

    MapReduce-迷你MapReduce集群 HBase-迷你HBase群集 Zookeeper-基于策展人的本地集群 HiveServer2-本地HiveServer2实例 HiveMetaStore-Derby支持的HiveMetaStore 风暴-Storm LocalCluster Kafka-本地Kafka经纪人 ...

    Python示例-从基础到高手PDF

    第 15 章 Mongodb 千万级数据在 python 下的综合压力测试及应用探讨 第 16 章 通过 memcached 实现领号排队功能及 python 队列实例. 第 17 章 python 之利用 PIL 库实现页面的图片验证码及缩略图 第 18 章 如何将...

    云计算第二版

    8.1.8 MongoDB 247 8.2 Cassandra 249 8.2.1 体系结构 249 8.2.2 数据模型 250 8.2.3 存储机制 251 8.2.4 读/写删过程 252 8.3 Hive 254 8.3.1 整体构架 254 8.3.2 数据模型 255 8.3.3 HQL语言 257 8.3.4 环境搭建 ...

Global site tag (gtag.js) - Google Analytics