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。再加一些负载平衡、数据库、这个并行分布式框架就完整了,可以运行啦!
翻译水平不行,建议直接看原文链接。
分享到:
相关推荐
git clone https://github.com/swri-robotics/collaborative-robotic-sanding.git # clone the repository 下载源依赖项 安装 cd进入您的colcon工作区根目录 如下运行wstool cd ~/crs_ws wstool init src src/...
Miks合作编辑 | 协作编辑器,支持基于Quill和ShareDB的作者身份显示,图像占位符和CJK字符组成。 特征 运营转型(OT) 该文档由一系列操作表示: insert , delete和retain 。 文档的每次修改也可以通过一系列OT...
《CMO Council:协同营销的指数级力量》白皮书探讨了在数据革命时代,企业如何通过合作营销实现突破。该文件指出,许多公司,无论大小,由于各种原因未能充分利用关键客户数据,提取有价值洞察,并据此采取行动,...
离线协同代码编辑器,如"collaborative-editor",是一种专为开发者设计的工具,它允许用户在没有网络连接的情况下进行代码编辑,并在重新上线时同步修改。这种编辑器结合了离线存储和实时协作的功能,使得团队成员...
本项目"draft-js-collaborative-editor"正是一个基于DraftJS和WebSocket技术实现的协同编辑器,旨在帮助开发者快速搭建支持多人实时协作的文本编辑环境。 首先,我们要理解DraftJS的核心概念。DraftJS使用模型-视图...
"Collaborative-online-judgment-system-master" 这个文件名可能是项目的主分支或主线,意味着它是系统的核心代码库。开源用户可以从这个仓库下载源码,自行部署或参与项目的开发和改进。通过深入研究这个系统,...
协同在线评审系统该在线判断系统是Google-Doc之类的协作代码编辑器。 主要部分:oj-client:具有引导程序的基于Angular2的前端oj-server:具有express.js中间件执行程序的node.js后端平台:具有Docker Engine API的...
使用子模块git clone --recurse-submodules https://github.com/epfml/collaborative-attention.git克隆此git clone --recurse-submodules https://github.com/epfml/collaborative-attention.git我们提供了一个...
本项目专注于实现一种推荐系统技术——协同过滤(Collaborative Filtering, CF)。协同过滤分为基于用户的协同过滤(User-based CF)和基于物品的协同过滤(Item-based CF),这两种方法都是基于用户与物品交互的...
Online-collaborative-writing-system 基于学习分析技术开发的在线协同写作系统 系统数据库是MySQL数据库 在spring配置文件中需要配置相应的数据库 在运行该系统之前需要将Etherpad-online-collaborative-writing-...
基于用户的协作过滤 Python中基于用户的协作过滤(改编自明尼苏达大学CSci 1901H类项目) 概述 实施简单的基于用户的协作过滤推荐系统,以使用给定的数据预测商品的评分。 应该使用k个最近邻居和Pearson相关来完成此...
Collaborative Denoising Auto-Encoder (CDAE), for top-N recommendation that utilizes the idea of Denoising Auto-Encoders. We demonstrate that the proposed model is a generalization of several well-...
Discrete-Collaborative-Filtering in python This is implementation Discrete-Collaborative-Filtering in python refered as below links. Implementation DCF in matlab Original paper Hanwang Zhang, Fumin ...
Discrete-Collaborative-Filtering This is the code used in paper: Hanwang Zhang, Fumin Shen, Wei Liu, Xiangnan He, Huanbo Luan, Tat-Seng Chua. "Dicrete Collaborative Filtering". SIGIR 2016
Scala-c-工作表 工作正在进行中 怎么跑 git clone git@github.com:MeiSign/Scala-collaborative-worksheets.git cd Scala-collaborative-worksheets chmod +x sbt ./sbt run
协同编辑 基于实时会议室的协作式RTF编辑器。安装要求节点js mongodb Redis 设置npm安装凉亭安装redis和mongodb应该已经启动并运行堆Express.js Socket.io + Angle-socket-io 雷迪斯MongoDB的Passport.js 加密Ejs ...
eliom-协作编辑器 用于展示如何使用 Eliom 和 Ocsigen 实现此类编辑器的存储库
协同蒸馏 我们CVPR-20海报纸“”的官方PyTorch代码,在此我们提出了一种新的知识蒸馏方法来减少VGG-19过滤器,在单个12GB GPU上实现超分辨率通用样式传递。 我们专注于模型压缩,而不是新的样式化方案。...
【标题】"zusammen-collaborative-git"是一个关于使用Git进行团队协作的项目,其核心在于利用Git的强大功能来实现高效的代码协同工作。Git是一个分布式版本控制系统,由Linus Torvalds为Linux内核开发,如今已经成为...
克隆此项目并运行bundle以安装gems并rake db:create foodora-collaborative-project_development以在postgres中创建数据库。 运行rake db:migrate以生成具有用户表的架构文件,该表通过devise添加 需求规范(用户...