`
鹤惊昆仑
  • 浏览: 230050 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

collaborative-map-reduce-in-the-browser

阅读更多
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部分:
  • 客户端浏览器向Job server(监控各个客户端计算进度)发送HTTP请求以加入计算集群;
  • Job server定位一个Job,指示浏览器重定向到这个新分发的Job地址,以获取分片的数据和Map及Reduce函数;
  • 浏览器获取数据以后按Map和Reduce函数指令执行计算;
  • 浏览器把计算结果反馈给Job Server,Job Server再分发新的计算任务。如此循环。

   下面是一个简单的分布式的统计单词出现频率例子:
<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。再加一些负载平衡、数据库、这个并行分布式框架就完整了,可以运行啦!

翻译水平不行,建议直接看原文链接。
分享到:
评论
1 楼 cloud21 2009-11-06  
蛮不错的paper,希望有机会多多交流下 分布式

相关推荐

Global site tag (gtag.js) - Google Analytics