欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

JavaScript mapreduce工作原理簡析

 更新時間:2012年11月25日 12:39:03   作者:  
MapReduce是一個編程模型,用于作業(yè)調(diào)度,也是一個處理和生成超大數(shù)據(jù)集的算法模型的相關(guān)實(shí)現(xiàn),本文將詳細(xì)介紹JavaScript mapreduce工作原理,需要的朋友可以參考下

谷歌在2003到2006年間連續(xù)發(fā)表了三篇非常有影響力的文章,分別是2003年在SOSP上發(fā)布的GFS,2004年在OSDI上發(fā)布的MapReduce,以及2006年在OSDI上發(fā)布的BigTable。GFS是文件系統(tǒng)相關(guān)的,其對后來的分布式文件系統(tǒng)設(shè)計(jì)具有指導(dǎo)意義;MapReduce是一種并行計(jì)算的編程模型,用于作業(yè)調(diào)度;BigTable是一個用于管理結(jié)構(gòu)化數(shù)據(jù)的分布式存儲系統(tǒng),構(gòu)建在GFS、Chubby、SSTable等Google技術(shù)之上。相當(dāng)多的Google應(yīng)用使用了這三種技術(shù),比如Google Search、Google Earth和Google Analytics等等。因此這三種技術(shù)并稱為谷歌技術(shù)”三寶”。今天,D瓜哥班門弄斧,對MapReduce來個”庖丁解牛”!

MapReduce簡介
MapReduce是一個編程模型,也是一個處理和生成超大數(shù)據(jù)集的算法模型的相關(guān)實(shí)現(xiàn)。用戶首先創(chuàng)建一
個Map函數(shù)處理一個基于key/value pair的數(shù)據(jù)集合,輸出中間的基于key/value pair的數(shù)據(jù)集合;然后
再創(chuàng)建一個Reduce函數(shù)用來合并所有的具有相同中間key值的中間value值。
一圖勝千言,下面我們用一張圖來說明一下MapReduce:

圖解MapReduce原理

 
編程實(shí)踐
常言道:”實(shí)踐出真知” 。是騾子是馬,拉出來遛遛才知道。所以,如果真的想搞懂這個原理,還是親自寫代碼實(shí)踐一下才是硬道理。
最近和幾個朋友一起學(xué)習(xí)JavaScript,所以就比較關(guān)注JavaScript。昨天上網(wǎng)瞎逛時,驚奇地發(fā)現(xiàn),竟然有牛人使用JavaScript實(shí)現(xiàn)了MapReduce算法。然后轉(zhuǎn)過來和大家分享,同時再加上我自己的一些狗尾續(xù)貂的介紹,希望有助于大家理解MapReduce。具體代碼實(shí)現(xiàn)如下:

復(fù)制代碼 代碼如下:

var Job = {
//待處理的數(shù)據(jù)
data : [
"We are glad to see you here. This site is dedicated to",
"poetry and to the people who make poetry possible",
"poets and their readers. FamousPoetsAndPoems.com is",
"a free poetry site. On our site you can find a large",
"collection of poems and quotes from over 631 poets",
"Read and Enjoy Poetry",
"I, too, sing America",
"I am the darker brother",
"They send me to eat in the kitchen",
"When company comes",
"But I laugh",
"And eat well",
"And grow strong",
"Tomorrow",
"Ill be at the table",
"When company comes",
"Nobodyll dare",
"Say to me",
"Eat in the kitchen",
"Then",
"Besides",
"Theyll see how beautiful I am",
"And be ashamed",
"I, too, am America"
],
//將數(shù)據(jù)中的每行字符串用空格分隔開,
//并"重組"成諸如{key: 單詞, value: 1}格式的對象,返回對象數(shù)組
map : function(line) {
var splits = line.split(" ");
var temp = [];
for(var i=0; i<splits.length; i++) {
temp.push({key : splits[i], value : 1});
}
return temp;
},
//計(jì)算每個單詞在"數(shù)據(jù)"(data)中出現(xiàn)的次數(shù)
reduce : function(allSteps) {
var result = {};
for(var i=0; i<allSteps.length; i++) {
var step = allSteps[i];
result[step.key] = result[step.key] ? (result[step.key] + 1) : 1;
}
return result;
},
//初始化,同時是運(yùn)行的入口。
init : function() {
var allSteps = [];
for(var i=0; i<Job.data.length; i++) {
//如果這里能多線程調(diào)用Job.map函數(shù)就更逼真了。??
allSteps = allSteps.concat(Job.map(Job.data[i]));
}
//美中不足,這里不能多線程調(diào)用Job.reduce函數(shù)??
var result = Job.reduce(allSteps)
console.log(JSON.stringify(result));
}
}; // Job
//開始執(zhí)行
Job.init();

復(fù)制這些代碼,直接粘貼到瀏覽器的控制臺(Console)中,或者放到一個HTML文件中,用瀏覽器打開,就可以在控制臺輸出中,看到效果如下:

美中不足
這篇文章發(fā)布出來之后,就有網(wǎng)友“咆哮”:“一個連多線程都沒有的js 搞什么MapReduce???”其實(shí),這個問題,D瓜哥也發(fā)現(xiàn)了。在看到這個代碼的解釋后,D瓜哥就納悶JavaScript不是單進(jìn)程嗎?怎么還能模擬MapReduce?在認(rèn)真閱讀代碼,單步調(diào)試之后,更加印證了D瓜哥的看法。(關(guān)于D瓜哥的疑問已經(jīng)在代碼中注釋出來。)
不過,再想一下,這些并不影響我們?nèi)ダ斫釳apReduce的原理。這只是個單進(jìn)程,最基礎(chǔ)的版本。先理解了這個,再去整個多線程的也許就更容易理解了。

未完待續(xù)
其實(shí),D瓜哥現(xiàn)在考慮在這個例子的基礎(chǔ)上,用Java實(shí)現(xiàn)一個多線程版本,那樣模擬的MapReduce更逼真。等D瓜哥把一些問題思考清楚之后,就把代碼發(fā)出來。敬請期待!

相關(guān)文章

最新評論