参考:
http://weblambdazero.blogspot.com/2008/08/mapreduce-in-erlang.html
MapReduce的主要原理是将一个数据集上的计算分发到许多单独的进程上(map),然后收集它们的结果(reduce)。
在Erlang里实现MapReduce非常细节也十分简单,例如Erlang的作者Joe Armstrong发表了一段代码来表示MapReduce版本的Erlang标准lists:map/2方法:
pmap.erl
-module(pmap).
-export([pmap/2]).
pmap(F, L) ->
S = self(),
Pids = lists:map(fun(I) ->
spawn(fun() -> do_fun(S, F, I) end)
end, L),
gather(Pids).
gather([H|T]) ->
receive
{H, Result} -> [Result|gather(T)]
end;
gather([]) ->
[].
do_fun(Parent, F, I) ->
Parent ! {self(), (catch F(I))}.
pmap的原理也很简单,对List的每项元素的Fun调用都spawn一个process来实际处理,然后再调用gather来收集结果。
如此简洁的代码就实现了基本的MapReduce,不得不服Erlang!
下面是一个fib的示例调用:
fib.erl
-module(fib).
-export([fib/1]).
fib(0) -> 0;
fib(1) -> 1;
fib(N) when N > 1 -> fib(N-1) + fib(N-2).
编译好之后比较一下lists:map/2和pmap:pmap/2的执行效率:
Eshell > L = lists:seq(0,35).
Eshell > lists:map(fun(X) -> fib:fib(X) end, L).
Eshell > pmap:pmap(fun(X) -> fib:fib(X) end, L).
测试结果lists:map执行时间大概4s,pmap:pmap执行时间大概2s,节约了一半的时间,呵呵。
分享到:
相关推荐
1. 分布式架构:Riak的数据分布在整个集群中,每个节点都存储数据的一部分,并通过一致性哈希(Consistent Hashing)进行数据分区,实现水平扩展。 2. 冗余与复制:Riak支持多副本机制,可以设置不同的复制因子以...
一个简单的库,可在远程erlang节点上运行代码并收集结果。 它将给定的erlang源代码编译为二进制波束,并将其加载到已配置的目标节点上。 然后,对具有给定Mod,Fun和Args的目标节点执行rpc调用。 收集结果,并从...
同时,采用小消息与大计算的原则,以及mapreduce来实现并行化处理。 mapreduce是一个并行高阶函数,它将一系列输入数据转换成输出结果。它由两个函数组成:F1处理数据项并将结果发送给一个或多个进程;F2则处理这些...
`couchbaserl` 是一个用 Erlang 实现的 Couchbase 客户端驱动程序,它允许开发者在 Erlang 应用程序中与 Couchbase 服务器进行通信,执行诸如存储、检索和管理数据等操作。下面我们将详细探讨 `couchbaserl` 的关键...
此外,你还可以研究CouchDB如何处理冲突、优化视图更新,以及如何通过Erlang OTP(Open Telephony Platform)框架实现高并发和容错。 对于开发者来说,熟悉CouchDB源码能提升数据库设计和管理的能力,帮助开发更...
3. **Erlbase**: 使用Erlang语言实现的XMPP Server,提供实时消息服务。 这种架构允许系统处理大规模并发的消息交换,同时利用Hadoop和HBase的分布式特性保证数据的持久性和可用性。 **HBase入门** HBase是一个非...
第一篇论文《Erlang___v3.pdf》可能涉及了Erlang编程语言在云计算环境中的应用。Erlang因其并发处理和容错能力而受到青睐,常常用于构建分布式系统。在云计算中,这种特性使得Erlang成为构建高效、可靠服务的理想...
7. **MapReduce**:Google提出的分布式计算框架,用于大规模数据集的并行处理,由Hadoop等开源项目实现。 8. **Actor模型**:每个Actor是独立的计算实体,通过异步消息传递进行通信,确保并发安全,如Erlang和Akka...
- **优点**:遵循AMQP协议,由Erlang实现,Spring社区活跃。 - **缺点**:需要掌握AMQP协议,Erlang语言可能不熟悉。 ##### 4. ZeroMQ - **优点**:轻量级、高效,提供多种常见通讯模型的抽象,几乎支持所有主流...
riak_kv概述Riak KV是使用 Erlang库分发的开源Erlang应用程序。 Riak KV提供了键/值数据存储,并具有MapReduce,轻量级数据关系和几种不同的客户端API。快速开始您必须具有或更高版本,以及GNU风格的构建系统才能...
- **MapReduce支持**:MongoDB内置了MapReduce功能,用于大规模数据集上的数据汇总操作,方便进行大数据分析工作。 - **跨平台兼容性**:MongoDB可以在多种操作系统上运行,包括但不限于OS X、Linux和Windows等,并...
CouchDB 最初是用 C++ 编写的,但在 2008 年 4 月,这个项目转移到 Erlang OTP 平台进行容错测试。 CouchDB官方网站是:http://couchdb.apache.org/ 2、适应人群 有一定的Java基础,JavaWeb基础,并对数据库管理...
- **现代语言的支持**:现代编程语言如Scala、Erlang、Clojure等提供了更为丰富的并发支持,如Actor模型、CSP(Communicating Sequential Processes)、数据并行计算等。 - **未来趋势**:随着摩尔定律的逐渐失效,...
除了上述知识点,分布式系统还涉及到复制、分区容错、一致性模型(如强一致性、弱一致性、最终一致性)、CAP理论、Paxos和Raft一致性算法、MapReduce编程模型等。学习分布式系统不仅需要理解这些基本概念,还需要对...
通过实时收集和分析用户行为数据,借助Kafka进行消息队列处理,MongoDB、Redis和HBase提供键值存储,以及Storm进行实时MapReduce,实现了实时推荐和统计分析。 在用户画像的构建上,通过SVM算法分析用户的购物习惯...
MongoDB提供多语言驱动支持,包括Ruby/Ruby-on-Rails、Java、C#、JavaScript、C/C++、Erlang、Python、Perl等。 5. MongoDB的优势: MongoDB不需要额外的缓存,支持丰富的查询和数据类型,同时商业公司10gen提供...
其使用Erlang语言构建的高性能服务器系统支持高并发交易,Memcached和Redis缓存系统确保快速响应,而MySQL和NoSQL数据库组合解决了数据存储问题。eBay还利用A/B测试和实时数据分析来优化用户体验。 四、Amazon的...
- **MapReduce**:MongoDB利用MapReduce框架来进行大数据处理任务。 #### MongoDB数据模型 - **文档**:MongoDB中的基本单位是文档,每个文档都是一组键值对。 - **集合(Collection)**:集合是一系列文档的容器。 ...