浏览 1951 次
精华帖 (0) :: 良好帖 (0) :: 新手帖 (0) :: 隐藏帖 (0)
|
|
---|---|
作者 | 正文 |
发表时间:2009-06-13
collaborative-map-reduce-in-the-browser这篇文章非常有趣,我简单意译一下。
Google的Map-Reduce框架是非常强大、简洁、优雅的并行分布式处理框架。虽然Google公开了这个框架的设计理念,但其底层实现依然是闭源的,是他们的核心竞争优势之一(如 GFS, BigTable等)。也有众多的开源实现,如Apache Hadoop, Disco, Skynet等。但是不得不关注的是Map/Reduce简洁优雅的设计理念和其众多实现的脱节(Disconnection):特定协议,特定服务器,特定的文件系统,特定的冗余策略实现等等。我们如何降低门栏哪?如何实现人人都可以参与的并行分布式运算哪? 大量的协同计算: 经过几次迭代,以及与Michael Nielsen,的交流,一个灵感诞生了: HTTP + Javascript!只是简单地把你的浏览器指向一个链接,就可以向一个并行分布式计算工作(Map/Reduce Job)贡献力量。你的网友只需要打开一个浏览器标签页(Tab Panel)就可以帮你进行数据计算。 不使用专有的特定协议,我们仅使用久经考验的HTTP和你喜欢的浏览器就可以进行并行分布式计算。JavaScript是理想的计算平台--网络上分布着无数浏览器。 Google的服务器集群据说有有六位数并且还在持续快速增长,这已经是一个颇为惊人的数量了。但是Google是否可以鼓励成千上万的网民为其分布式计算贡献力量哪?只要参与的门槛低足够低,我想这并非不可能。当然,计算效率可能会降低,但是可以拥有更大的潜在集群。这可能会使致我们可以解决许多以前无法解决的问题。 在浏览器中进行客户端计算: 除了储存和分发数据是代价最昂贵的一部分,剩余的工作就是CPU计算时间。然而,把数据切分成易管理的小片,我们可以很容易地建立一个基于HTTP的工作流,让用户的浏览器来处理这些小的计算任务。 整体处理流程包括4部分:
下面是一个简单的分布式的统计单词出现频率例子: <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代码实现(借助于Sinatra web 框架的力量)。 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。再加一些负载平衡、数据库、这个并行分布式框架就完整了,可以运行啦! 翻译水平不行,建议直接看原文链接。 声明:ITeye文章版权属于作者,受法律保护。没有作者书面许可不得转载。
推荐链接
|
|
返回顶楼 | |
发表时间:2009-11-06
蛮不错的paper,希望有机会多多交流下 分布式
|
|
返回顶楼 | |