`
zhiweiofli
  • 浏览: 514731 次
  • 性别: Icon_minigender_1
  • 来自: 广州
社区版块
存档分类
最新评论

MapReduce初探之一~~基于Mongodb实现标签统计

阅读更多

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编辑发布,转载请注明出处,点击,谢谢。

0
0
分享到:
评论

相关推荐

    基于MapReduce实现决策树算法

    基于MapReduce实现决策树算法是一种使用MapReduce框架来实现决策树算法的方法。在这个方法中,主要使用Mapper和Reducer来实现决策树算法的计算。下面是基于MapReduce实现决策树算法的知识点: 1. 基于C45决策树算法...

    python 实现mapreduce词频统计

    python实现mapreduce词频统计 执行方式:打开cmd命令,cd到代码所在文件夹,输入python wordcout_map.py &gt; words.txt | sort | python wordcout_reduce.py执行

    基于MapReduce的学生平均成绩统计

    利用MapReduce实现了求学生成绩的最大值,最小值,及成绩分布。结合我的博客“MapReduce之学生平均成绩”看,效果更好。

    基于MapReduce的Apriori算法代码

    基于MapReduce的Apriori算法代码是一个使用Hadoop MapReduce框架实现的关联规则挖掘算法,称为Apriori算法。Apriori算法是一种经典的关联规则挖掘算法,用于发现事务数据库中频繁出现的项集。该算法的主要思想是生成...

    大数据 hadoop mapreduce 词频统计

    总的来说,大数据Hadoop MapReduce词频统计是大数据分析的重要应用之一,它揭示了文本数据的内在结构,为文本挖掘、信息检索等应用提供了基础。通过理解和掌握这一技术,开发者可以更好地应对现代数据驱动决策的需求...

    mapreduce在hadoop实现词统计和列式统计

    在这个场景中,我们将讨论如何使用Hadoop的MapReduce来实现词统计和列式统计。 **一、MapReduce原理** MapReduce的工作流程主要包括三个主要阶段:Map、Shuffle(排序)和Reduce。在Map阶段,输入数据被分割成多个...

    MongoDB MapReduce分享.ppt

    MapReduce 是 MongoDB 提供的一种分布式计算框架,用于处理和聚合大数据。在这个“MongoDB MapReduce 分享”中,我们将深入探讨 MapReduce 在 MongoDB 中的应用及其核心概念。 MapReduce 包含两个主要函数:Map 和 ...

    基于MapReduce实现物品协同过滤算法(ItemCF).zip

    本项目“基于MapReduce实现物品协同过滤算法(ItemCF)”是针对推荐系统中的一种经典算法进行分布式实现,旨在提高推荐效率和精度。下面我们将深入探讨MapReduce、Hadoop以及物品协同过滤(Item-based Collaborative...

    基于MapReduce+Pandas的电影排名与推荐以及数据分析与可视化展示

    基于MapReduce+Pandas的电影排名与推荐以及数据分析与可视化展示 数据科学与大数据技术领域中,电影排名与推荐系统的开发是非常重要的一部分。该系统可以通过对电影数据的分析和处理,提供电影排名和推荐服务,满足...

    基于MapReduce的Kmeans实现

    标题中的"基于MapReduce的Kmeans实现"是指将经典的K-means聚类算法应用到MapReduce框架中,以处理海量的数据。K-means是一种迭代的聚类算法,它的目标是将数据点分配到预先设定的K个类别中,使得每个数据点与所在...

    基于Java实现的简易MapReduce框架.zip

    这个“基于Java实现的简易MapReduce框架”是一个简化版的实现,旨在帮助开发者理解MapReduce的工作原理,并能在实际项目中进行快速开发。 MapReduce的运行流程主要分为三个阶段:Map、Shuffle和Reduce。Map阶段是...

    mapreduce框架学习之天气统计

    总结来说,这个“mapreduce框架学习之天气统计”案例是一个很好的实践平台,通过它,你可以深入了解MapReduce如何处理大量天气数据,以及如何使用Hadoop的API编写分布式计算程序。实践中遇到的问题和解决方法将...

    KNN算法基于Hadoop平台的MapReduce实现

    该项目实现了KNN算法在Hadoop平台基于欧拉距离,加权欧拉距离,高斯函数的MapReduce实现。 特色或创意:实例上添加了基于欧拉距离,加权欧拉距离,高斯函数的实现。 使用的是著名的鸢尾花数据集。据集内包含 3 类...

    基于mapreduce的小型电影推荐系统

    【标题】:“基于MapReduce的小型电影推荐系统” 【描述】:“这个项目是利用MapReduce框架,结合JavaWeb技术,构建的一个小型电影推荐系统。它旨在利用用户的历史观影行为,通过数据分析来为用户推荐最可能感兴趣...

    基于MapReduce实现的TFIDF计算

    TF-IDF(Term Frequency-Inverse Document Frequency)是一种在信息检索和文本挖掘中广泛使用的统计方法,用于评估一个词在文档中的重要性。MapReduce是一种分布式计算模型,由Google提出,常用于处理大规模数据集。...

    基于MapReduce的商品推荐算法.zip

    基于MapReduce的商品推荐算法,正是解决这一问题的重要手段。本文将深入探讨MapReduce的原理以及其在商品推荐系统中的应用。 MapReduce是Google提出的一种分布式计算模型,它简化了大规模数据处理的过程,特别适合...

    基于 Hadoop 平台,使用 MapReduce 编程,统计NBA球员五项数据.zip

    在这个项目“基于 Hadoop 平台,使用 MapReduce 编程,统计NBA球员五项数据”中,我们将深入探讨如何利用 Hadoop 的核心组件 MapReduce 对 NBA 球员的数据进行分析。 MapReduce 是一种编程模型,用于大规模数据集...

Global site tag (gtag.js) - Google Analytics