MapReduce 是一种编程模型,是 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<values.length;i++){ total += values[i]; } return total; } Blog.mapReduce(o, function (err, results) { if(err) { console.log("mapReduce err:"+err); } console.log(results); callback(results); }) }
最后我们通过callback函数获得的result事实上就是(tag,count)的Map了,这是如何实现的?这点,就有赖于Mongodb的高级特性了,Mongodb对于 MapReduce 是骨子里支持的,因而这种运算的效率是有保障的!难怪Mongodb的掌门人叫嚣:不是Mongodb不行,是你们不懂Mongodb!
总结一下,尽管这篇Blog讲得有点乱,但是主要还是想讲清楚MapReduce的思想! MapReduce的实现五花八门,但是其中心思想~map和reduce才是我们必须理解和掌握的!
本文由zhiweiofli编辑发布,转载请注明出处,点击,谢谢。
相关推荐
python实现mapreduce词频统计 执行方式:打开cmd命令,cd到代码所在文件夹,输入python wordcout_map.py > words.txt | sort | python wordcout_reduce.py执行
利用MapReduce实现了求学生成绩的最大值,最小值,及成绩分布。结合我的博客“MapReduce之学生平均成绩”看,效果更好。
主要为大家详细介绍了基于MapReduce实现决策树算法,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
在hadoop平台上,用mapreduce编程实现大数据的词频统计
基于mapreduce的小型电影推荐系统,使用javaweb的方式实现,
这是我基于MapReduce实现的Kmeans算法,用Java语言,在一个完全分布式系统运行良好
提出一种基于MapReduce技术的贝叶斯垃圾邮件过滤机制,一方面对传统贝叶斯过滤技术进行改进,另一方面利用MapReduce模型的海量数据处理优势优化邮件集训练与学习。实验,较之目前流行的传统贝叶斯算法、K最近邻(NN算法...
mapreduce在hadoop实现词统计和列式统计,mrwordcount工程是统计hadoop文件中的词数,mrflowcount工程是统hadoop文件中的列表
本项目为一个Hadoop课程设计,使用Java语言和map/reduce实现贝叶斯文本分类器。项目的具体内容如下:1:用MapReduce算法实现贝叶斯分类器的训练过程,并输出训练模型; 2:用输出的模型对测试集文档进行分类测试。...
基于哈希技术和MapReduce的大数据集K-近邻算法实现代码
# 基于Mapreduce的KNN实现 ## 项目介绍 - 该项目实现了KNN算法在Hadoop平台基于***欧拉距离***,***加权欧拉距离***,***高斯函数***的MapReduce实现。 - 特色或创意:在网上KNN实现的例子上添加了基于***欧拉距离...
简单的在MapReduce中实现两个表的join连接简单的在MapReduce中实现两个表的join连接简单的在MapReduce中实现两个表的join连接
Mongodb是针对大数据量环境下诞生的用于保存大数据量的非关系型数据库,针对大量的数据。接下来通过本文给大家介绍Mongodb中MapReduce实现数据聚合方法详解,感兴趣的朋友一起学习吧
eclipse运行MapReduce架包~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
MapReduce字数统计案例,希望大家交流,最好自己写完后在对比交流,欢迎前来交流
计算机后端-PHP视频教程. mongodb10 MapReduce 统计栏目下的商品.wmv
Hadoop课程设计-基于Java和mapreduce实现的贝叶斯文本分类器设计; Hadoop课程设计-基于Java和mapreduce实现的贝叶斯文本分类器设计;
基于MapReduce的数据挖掘平台设计与实现.pdf
MongoDB MapReduce MapReduce是一种计算模型,简单的说就是将大批量的工作(数据)分解(MAP)执行,然后再将结果合并成最终结果(REDUCE)。这样做的好处是可以在任务被分解后,可以通过大量机器进行并行计算,减少...
一次很好的mapreduce框架学习。复习了框架大部分组件,代码都是一个一个敲上去的,借鉴了视频中老师的讲解,只包含了7个代码中关键的java文件,其他包都需要自己导入。