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.」 node
可見MapReduce主要爲集羣分佈式計算而誕生的,頂頂大名的分佈式框架Hadoop就是MapReduce的一種實現。其中心思想是Map(映射)函數和Reduce(化簡)函數,個人簡單理解就是先將問題按照必定的規律,一一細分並映射到列表中,而後對那些列表進行適當的合併,從而得出想要的結果,大體的工做流見於下圖: mongodb
咋一看,怎麼就是分佈式計算的原理圖解了?論道分佈式計算,就扯遠了,回到主題上,此次是討論如何利用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呢? 架構
辦法有幾個:一、遍歷查詢所有的Blog,取出Blog的實體,而後對其中的tags字段進行統計;(這個簡單,絕對可行,只是效率就...) app
二、 對1中的方法採用多線程進行查詢,而後同步共享的數據;(這個在實現與現今的硬件上,理論絕對比方法1高效,可是實現的難度,特別是數據的同步那塊就...) 框架
三、讓MapReduce來幫幫忙吧! 數據庫設計
MapReduce中,Map函數和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編輯發佈,轉載請註明出處,點擊,謝謝。