[url=http://www.igvita.com/2009/03/03/collaborative-map-reduce-in-the-browser/]collaborative-map-reduce-in-the-browser[/url]这篇文章非常有趣,我简单意译一下。
[url=http://en.wikipedia.org/wiki/MapReduce]Google的Map-Reduce框架[/url]是非常强大、简洁、优雅的并行分布式处理框架。虽然Google公开了这个框架的设计理念,但其底层实现依然是闭源的,是他们的核心竞争优势之一(如[url=http://labs.google.com/papers/gfs.html] GFS[/url], [url=http://labs.google.com/papers/bigtable.html] BigTable[/url]等)。也有众多的开源实现,如[url=http://hadoop.apache.org/core/]Apache Hadoop[/url], [url=http://discoproject.org/] Disco[/url], [url=http://skynet.rubyforge.org/]Skynet[/url]等。但是不得不关注的是Map/Reduce简洁优雅的设计理念和其众多实现的脱节(Disconnection):特定协议,特定服务器,特定的文件系统,特定的冗余策略实现等等。我们如何降低门栏哪?如何实现人人都可以参与的并行分布式运算哪?
[b]大量的协同计算[/b]:
经过几次迭代,以及与[url=http://michaelnielsen.org/blog/?page_id=181]Michael Nielsen,[/url]的交流,一个灵感诞生了:[b] HTTP + Javascript![/b]只是简单地把你的浏览器指向一个链接,就可以向一个并行分布式计算工作(Map/Reduce Job)贡献力量。你的网友只需要打开一个浏览器标签页(Tab Panel)就可以帮你进行数据计算。
不使用专有的特定协议,我们仅使用久经考验的HTTP和你喜欢的浏览器就可以进行并行分布式计算。JavaScript是理想的计算平台--网络上分布着无数浏览器。
Google的服务器集群据说有有六位数并且还在持续快速增长,这已经是一个颇为惊人的数量了。但是Google是否可以鼓励成千上万的网民为其分布式计算贡献力量哪?只要参与的门槛低足够低,我想这并非不可能。当然,计算效率可能会降低,但是可以拥有更大的潜在集群。这可能会使致我们可以解决许多以前无法解决的问题。
[b]在浏览器中进行客户端计算[/b]:
除了储存和分发数据是代价最昂贵的一部分,剩余的工作就是CPU计算时间。然而,把数据切分成易管理的小片,我们可以很容易地建立一个基于HTTP的工作流,让用户的浏览器来处理这些小的计算任务。
[img]http://www.igvita.com/posts/09/browser-mr.png[/img]
整体处理流程包括4部分:
[list]
[*]客户端浏览器向Job server(监控各个客户端计算进度)发送HTTP请求以加入计算集群;
[*]Job server定位一个Job,指示浏览器重定向到这个新分发的Job地址,以获取分片的数据和Map及Reduce函数;
[*]浏览器获取数据以后按Map和Reduce函数指令执行计算;
[*]浏览器把计算结果反馈给Job Server,Job Server再分发新的计算任务。如此循环。
[/list]
下面是一个简单的分布式的统计单词出现频率例子:
只要页面一加载,Javascript(随着JavaScript虚拟机大战的继续,JavaScript性能会越来越高)就会被执行。计算结果(每个单词的出现频率)会被反馈给Job Server,Job Server可以再分发新的计算任务,这个计算流程会一直循环直到所有计算都结束为止。因此,客户端加入计算群集的门栏非常低--简单到只需打开一个网址,分布式自然就交由久经考验的HTTP协议来处理啦。
下面是一个简单的Job Server,由ruby实现:
Job Server是用来协调分布式运算流程的。这个任务服务器仅由三十行ruby代码实现(借助于[url=http://www.sinatrarb.com/]Sinatra web 框架[/url]的力量)。
就这么多代码。启动Job Server,使用浏览器访问该URI即可。剩下的就是完全自动化的并行计算--只要开启足够多的浏览器访问Job Server。再加一些负载平衡、数据库、这个并行分布式框架就完整了,可以运行啦!
翻译水平不行,建议直接看原文链接。
[url=http://en.wikipedia.org/wiki/MapReduce]Google的Map-Reduce框架[/url]是非常强大、简洁、优雅的并行分布式处理框架。虽然Google公开了这个框架的设计理念,但其底层实现依然是闭源的,是他们的核心竞争优势之一(如[url=http://labs.google.com/papers/gfs.html] GFS[/url], [url=http://labs.google.com/papers/bigtable.html] BigTable[/url]等)。也有众多的开源实现,如[url=http://hadoop.apache.org/core/]Apache Hadoop[/url], [url=http://discoproject.org/] Disco[/url], [url=http://skynet.rubyforge.org/]Skynet[/url]等。但是不得不关注的是Map/Reduce简洁优雅的设计理念和其众多实现的脱节(Disconnection):特定协议,特定服务器,特定的文件系统,特定的冗余策略实现等等。我们如何降低门栏哪?如何实现人人都可以参与的并行分布式运算哪?
[b]大量的协同计算[/b]:
经过几次迭代,以及与[url=http://michaelnielsen.org/blog/?page_id=181]Michael Nielsen,[/url]的交流,一个灵感诞生了:[b] HTTP + Javascript![/b]只是简单地把你的浏览器指向一个链接,就可以向一个并行分布式计算工作(Map/Reduce Job)贡献力量。你的网友只需要打开一个浏览器标签页(Tab Panel)就可以帮你进行数据计算。
不使用专有的特定协议,我们仅使用久经考验的HTTP和你喜欢的浏览器就可以进行并行分布式计算。JavaScript是理想的计算平台--网络上分布着无数浏览器。
Google的服务器集群据说有有六位数并且还在持续快速增长,这已经是一个颇为惊人的数量了。但是Google是否可以鼓励成千上万的网民为其分布式计算贡献力量哪?只要参与的门槛低足够低,我想这并非不可能。当然,计算效率可能会降低,但是可以拥有更大的潜在集群。这可能会使致我们可以解决许多以前无法解决的问题。
[b]在浏览器中进行客户端计算[/b]:
除了储存和分发数据是代价最昂贵的一部分,剩余的工作就是CPU计算时间。然而,把数据切分成易管理的小片,我们可以很容易地建立一个基于HTTP的工作流,让用户的浏览器来处理这些小的计算任务。
[img]http://www.igvita.com/posts/09/browser-mr.png[/img]
整体处理流程包括4部分:
[list]
[*]客户端浏览器向Job server(监控各个客户端计算进度)发送HTTP请求以加入计算集群;
[*]Job server定位一个Job,指示浏览器重定向到这个新分发的Job地址,以获取分片的数据和Map及Reduce函数;
[*]浏览器获取数据以后按Map和Reduce函数指令执行计算;
[*]浏览器把计算结果反馈给Job Server,Job Server再分发新的计算任务。如此循环。
[/list]
下面是一个简单的分布式的统计单词出现频率例子:
<html>
<head>
<script type="text/javascript">
function map() {
/* count the number of words in the body of document */
var words = document.body.innerHTML.split(/\\n|\\s/).length;
emit('reduce', {'count': words});
}
function reduce() {
/* sum up all the word counts */
var sum = 0;
var docs = document.body.innerHTML.split(/\\n/);
for each (num in docs) { sum+= parseInt(num) > 0 ? parseInt(num) : 0 }
emit('finalize', {'sum': sum});
}
function emit(phase, data) { ... }
</script>
</head>
<body onload="map();">
... DATA ...
</body>
</html>
只要页面一加载,Javascript(随着JavaScript虚拟机大战的继续,JavaScript性能会越来越高)就会被执行。计算结果(每个单词的出现频率)会被反馈给Job Server,Job Server可以再分发新的计算任务,这个计算流程会一直循环直到所有计算都结束为止。因此,客户端加入计算群集的门栏非常低--简单到只需打开一个网址,分布式自然就交由久经考验的HTTP协议来处理啦。
下面是一个简单的Job Server,由ruby实现:
Job Server是用来协调分布式运算流程的。这个任务服务器仅由三十行ruby代码实现(借助于[url=http://www.sinatrarb.com/]Sinatra web 框架[/url]的力量)。
require "rubygems"
require "sinatra"
configure do
set :map_jobs, Dir.glob("data/*.txt")
set :reduce_jobs, []
set :result, nil
end
get "/" do
redirect "/map/#{options.map_jobs.pop}" unless options.map_jobs.empty?
redirect "/reduce" unless options.reduce_jobs.empty?
redirect "/done"
end
get "/map/*" do erb :map, :file => params[:splat].first; end
get "/reduce" do erb :reduce, :data => options.reduce_jobs; end
get "/done" do erb :done, :answer => options.result; end
post "/emit/:phase" do
case params[:phase]
when "reduce" then
options.reduce_jobs.push params['count']
redirect "/"
when "finalize" then
options.result = params['sum']
redirect "/done"
end
end
# To run the job server:
# > ruby job-server.rb -p 80
就这么多代码。启动Job Server,使用浏览器访问该URI即可。剩下的就是完全自动化的并行计算--只要开启足够多的浏览器访问Job Server。再加一些负载平衡、数据库、这个并行分布式框架就完整了,可以运行啦!
翻译水平不行,建议直接看原文链接。