最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

JavaScript mapreduce工作原理簡析

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

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

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

圖解MapReduce原理

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

復制代碼 代碼如下:

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;
},
//計算每個單詞在"數(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;
},
//初始化,同時是運行的入口。
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();

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

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

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

相關文章

最新評論

西丰县| 乌拉特前旗| 深泽县| 齐河县| 河西区| 友谊县| 乡宁县| 崇文区| 鹿泉市| 花莲县| 延边| 平武县| 嫩江县| 荆州市| 林口县| 邵阳市| 翁牛特旗| 龙岩市| 昆明市| 怀来县| 宁武县| 垦利县| 商城县| 贺兰县| 兴化市| 潢川县| 望城县| 基隆市| 民乐县| 桐城市| 永嘉县| 洪洞县| 黄陵县| 灵石县| 隆德县| 肇庆市| 隆回县| 丰原市| 富蕴县| 怀宁县| 丘北县|