博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
MapReduce初探之一~~基于Mongodb实现标签统计
阅读量:6692 次
发布时间:2019-06-25

本文共 2252 字,大约阅读时间需要 7 分钟。

hot3.png

 是一种编程模型,是 Google 提出的一种软件架构,主要应用于分布式系统上。Google对其原始的定义是“ MapReduce is a framework for computing certain kinds of distributable problems using a large number of computers (nodes), collectively referred to as a cluster.”

可见MapReduce主要为集群分布式计算而诞生的,顶顶大名的分布式框架Hadoop就是MapReduce的一种实现。其中心思想是Map(映射)函数和Reduce(化简)函数,我的简单理解就是先将问题按照一定的规律,一一细分并映射到列表中,然后对那些列表进行适当的合并,从而得出想要的结果,大致的工作流见于下图: 

咋一看,怎么就是分布式计算的原理图解了?论道分布式计算,就扯远了,回到主题上,这次是讨论如何利用MapReduce的思想,实现Blog文章标签的统计!

按照传统的关系数据库设计,统计标签,无非就是建一张标签表,我们姑且叫左Tb_tags,大致的结构就是id和value,然后关联id到Blog表的外键上。恩,不差错。可是这次,NodeBlog的数据库用的可是Mongodb哦,难道照搬即可?

我们先看看在mongodb下,Blog表是如何描述的:

var BlogScheme = new db.Schema({    title : String,    desc : String,    author : String,    body : String,    tags : [String],    count: { type:Number, default:0 },    hidden : { type: Boolean, default: false },    date : { type: Date, default: Date.now },    comments : [{ img: String, name: String, body: String, date: Date }],    meta : {        votes: Number,        favs:  Number    }});

按照mongodb的设计,每篇Blog都是整篇存储的,与其它表基本没有关联,这也是NoSQL的精髓啊!但是这样子,我们该如何去统计Blog的标签tag呢?

办法有几个:1、遍历查询全部的Blog,取出Blog的实体,然后对其中的tags字段进行统计;(这个简单,绝对可行,只是效率就...)

                     2、 对1中的方法采用多线程进行查询,然后同步共享的数据;(这个在实现与现今的硬件上,理论绝对比方法1高效,但是实现的难度,特别是数据的同步那块就...)

                     3、让MapReduce来帮帮忙吧!

MapReduce中,Map函数和Reduce函数是交给用户实现的,这两个函数定义了任务本身。

  • Map函数:接受一个键值对(key-value pair),产生一组中间键值对。MapReduce框架会将map函数产生的中间键值对里键相同的值传递给一个reduce函数。
  • Reduce函数:接受一个键,以及相关的一组值,将这组值进行合并产生一组规模更小的值(通常只有一个或零个值)。

对照我们的需求,统计Blog中的tags,那么Map函数应该处理的是:记录tag出现的次数,这个越小越好;然后Reduce函数对Map函数产生的数据进行合并,并返回单一的结果,即是某个tag出现的总次数!下面来一个实例说明:

/** * 统计Blog中标签出现的次数,采用MapReduce进行实时计算 * @param callback --> result: _id(tag name), value(occupied count) */exports.tagStatistical = function(callback){    var o = {};    o.map = function () {        this.tags.forEach(function(z){  //z即是具体的某个tag了            emit(z,1);                    //对某个tag出现一次就计数一次        });    }    o.reduce = function (k, values) {        var total=0;        for(var i=0;i

最后我们通过callback函数获得的result事实上就是(tag,count)的Map了,这是如何实现的?这点,就有赖于Mongodb的高级特性了,Mongodb对于  是骨子里支持的,因而这种运算的效率是有保障的!难怪Mongodb的掌门人叫嚣:不是Mongodb不行,是你们不懂Mongodb!  

总结一下,尽管这篇Blog讲得有点乱,但是主要还是想讲清楚MapReduce的思想! MapReduce的实现五花八门,但是其中心思想~map和reduce才是我们必须理解和掌握的!

本文由编辑发布,转载请注明出处,,谢谢。

转载于:https://my.oschina.net/zhiweiofli/blog/111986

你可能感兴趣的文章
北京软件造价评估联盟:开启软件成本度量新篇章
查看>>
Mac下安装eclipse(Mac 10.12/JDK/tomcat)
查看>>
Facebook的Aquila遭查,无人机事故频发皆因哪般
查看>>
4月17日云栖精选夜读:90后剁手党占了一半!天猫是如何成为奢侈品第一平台的?...
查看>>
后引力波之战已经打响,神秘伽马射线来自何方?
查看>>
ecshop运行超过30秒超时的限制解决办法
查看>>
家庭物联网:从全屋智能到数据服务
查看>>
大数据领域的新面孔!我国微生物大数据平台获得国家大力支持
查看>>
韩国现代汽车成功实测L4级别自动驾驶汽车
查看>>
大数据产业发展明确四大重点
查看>>
量子计算将能分解任意极大整数,RSA加密或成摆设
查看>>
spring-cloud-starter-hystrix(断路器)服务不通或者调用失败后的错误处理和回调
查看>>
timer的优化故事
查看>>
Python开发(基础):运算符
查看>>
编写一个C语言函数,要求输入一个url,输出该url是首页、目录页或者其他url
查看>>
配置secondarynamenode主机名masters
查看>>
XHTML 1.0 Tags 参考
查看>>
递归再一次让哥震惊了
查看>>
oracle之检查点(Checkpoint)
查看>>
分析无线遥控器信号并制作Hack硬件进行攻击
查看>>