-
传统的MapReduce框架是google于2004年在论文:“MapReduce: Simplified Data Processing on Large Clusters”提出的,该框架把一些数据密集型应用的数据处理过程简化抽象成map和reduce两个阶段,用户在设计分布式程序时,只要实现 map()和reduce()两个函数,至于其它细节,例如数据分片,任务调度,机器容错,机器间通信等,都交由MapReduce框架处理。随着技术的 发展,在传统MapReduce框架的基础上,出现了一些针对特殊应用的MapReduce框架,主要有以下几种:
(1) 支持迭代MapReduce的Twister和Haloop(参见我的博文:迭代式MapReduce框架介绍).
(2) 支持多阶段流式计算的Sector/Sphere(参见我的博文:流式MapReduce实现Sector/Sphere ).
(3) 支持DAG(Directed Acyclic Graph)的Dryad和Cascading(参见文章:Dryad , Cascading 以及 Cascading的主页).
(4) MapReduce与Database结合的产物:HadoopDB 和 greenplum.
本文主要讲解当下较为出名的传统MapReduce开源实现。现在有非常多的开源MapReduce框架实现, 最出名的莫过于Java实现版本Hadoop。 实际上,它属于重量级的实现版本(代码量大),要理解其细节或者对其进行改进需要很大工作量。 为了克服重量级实现存在的缺陷,一些轻量级的版本出现了,如erlang实现版本Disco,Python实现版本micemeat,bash版本 bashreduce等。
本文主要介绍Disco,粗略讲解micemeat和bashreduce。
传统MapReduce实现之Disco
1、概述
Disco是一个轻量级的MapReduce框架实现,核心模块使用Erlang语言实现,外部接口为易于编程的Python。同Hadoop一 样,拥也有自己的分布式文件系统DDFS,不过DDFS是与计算框架高度耦合的。 Disco由诺基亚研究中心开发,用于处理实际应用中的大规模数据。
2、Disco的总体设计架构
Disco由分布式存储系统DDFS(Disco Distributed File System)和MapReduce框架组成,本节主要介绍Disco的总体设计架构,下面一节介绍DDFS。
Disco也是master/slave架构:
Disco master从client端接收作业,并将它们添加到作业队列中,以便进行调度。
Client processes是一些python程序,它们使用函数disco.job()向master提交作业。
Worker supervision是由master启动的,每个节点启动一个,用于监控该节点上python worker的运行情况。
Python worker用于执行用户提交的作业。
输入文件是通过http获取的,但若要读取的文件在本地,直接从磁盘上获取即可。为了能够从个远程节点上获取数据,每个节点上进行一个httpd后台进程。
3、DDFS的架构
DDFS是嵌入到Disco中的,目前只有一个master节点(存在单点故障)。每个存储节点由一组磁盘或者卷宗组成(vol0..volN), 它们分别挂载在$DDFS_ROOT/vol0 … $DDFS_ROOT/volN。每个卷宗下面有两个文件,分别为tag 和 blob,分别用于存储标记(tag,相当于key)和标记对应的值(value)。DDFS会监控每个节点上的磁盘使用情况,并每隔一段时间进行负载均 衡。
4、分布式索引Discodex
Discodex是专门为Disco设计的分布式索引系统。
Discodex实际上是一个分布式key/value存储系统。通过某一个key,可以检索出与该key相关的所有value。Discodex对外提供了一些ReST API,用户通过这些API检索数据。
当我们使用Discodex时,实际上是运行了一个HTTP 服务器,它把ReSTful url映射成Disco作业。 Discodex在DDFS上存储key和value值,其中每个文件都是分布式的,称为index,chunks或者ichunks。
5、参考资料
(1)官方网址:http://discoproject.org/
(2)安装方法:http://blog.csdn.net/socrates/archive/2009/05/26/4217641.aspx
传统MapReduce实现之micemeat
1、介绍
micemeat是MapReduce的python实现,整个代码由一个python文件构成(<13KB),它仅依赖于python标准库,非常容易部署,同时它还支持以下功能:
(1) 容错:任何一个slave可以随时加入或者离开集群而不会影响其他slave。
(2) 安全:micemeat会对每一条连接进行授权验证,防止未经授权的代码被执行。
2、参考资料:
官方网址:http://remembersaurus.com/mincemeatpy/
传统MapReduce实现之bashreduce
1、 介绍
Bashreduce采用bash脚本语言编写,整合了常用的shell命令,如sort, awk, ssh, netcat等。目前仅在ubuntu/debian系统上进行了测试。
2、 参考资料
(1) https://github.com/erikfrey/bashreduce
另外,还有Perl实现RobotArmy和ruby实现skyner
参考资料:
(1) RobotArmy官方主页:http://bulletsweetp.github.com/robotarmy/
(2) RobotArmy论文:RobotArmy: A Casual Framework for Massive Distributed Processing
(3) Skynet官方主页:http://skynet.rubyforge.org/