今年,云计算炒得火热,《程序员》杂志11月更以云计算为专题,综合了从不同概念,不同厂商的方案,不同的技术大牛的分析和预测,收益良多。让人一种山雨欲来风满楼的感觉。
作为一个程序员,多少了解一些,也算跟得上时代,呵呵。
其中Google的MapReduce技术更是一个亮点。但《程序员》及网上的中文文章介绍以概念性居多,看完之后感觉大致了解,但又还是有些云里雾里的。不如直接看官方文档。
看过Google工程师Dean,Jeff and Ghemawat,Sanjay.的论文MapReduce: Simplified Data Processing on Large Clusters, http://labs.google.com/papers/mapreduce-osdi04.pdf, 踩在云中的双脚算是稍微落地了,之前一直好奇的几个技术细节终于有了答案。
以下是我初识 MapReduce 的认识:
用个例子来说比较直观:对100个网页的内容,统计出现的每个word的频率。
[b]1. MapReduce是一个大规模数据(large scale data set),平行计算(paralle computation)的技术方案;[/b]
[b]2. MapReduce 的基本运行环境是成百上千台普通的PC机组成的集群[/b],每台PC机运行Linux系统,MapReduce 控制集群各节点进行数据存储,和逻辑计算。 存储和计算是MapReduce集群两大核心功能。
[b]3. MapReduce基本架构 Master-Slave 模型[/b], Master负责任务(Task) 和 数据和运算的切分,和分发,分发到集群的各节点上; Slave 在这里叫 Worker,负责执行Master分发的任务;
Master还需负责Worker死亡监测 和 容错 (Fault Tolerant)等总控性工作。
[img]http://code.google.com/intl/zh-CN/edu/parallel/img/mrfigure.png" alt="[/img]
[b]4 Map Reduce 的运算过程是先分后合。[/b]
Map 意思直译为映射,不过理解为“分治”更容易懂。就是将数据和运算进行切分,并分发到集群节点上;
Reduce (本意是减少,所以初看名称时一直不理解减少为合意), 这里应该理解为该词的另一个意思,“归并”, 就是将分开执行的众多计算任务和数据进行合并,形成最终的输出结果。
[b] 5. 程序员基于MapReduce进行开发很easy。[/b]
Google MapReduce 提供了一个编程模型和环境(C++),允许程序员只通过少量代码,就可以实现大数据的计算,程序员只需关心自定义的 Map Function 和 Reduce Function。字定义的Map函数在众多Worker上执行原子任务, Reduce函数在部分Worker上合并相关 Map Worker上的中间结果,最终形成最终输出结果,一般为一个输出文件(Output file)。
细节方面:
6. 任务切分 (Partition) 和分发(Distribution)。 以前面举的100网页word词频统计为例,按 M=100个Task进行切分,每台Worker PC 负责统计一个URL网页的词频; 合并(Reduce) Worker数R 由用户指定。
如何分发任务(Distribute Task)? Map任务分发,按url哈希码决定分发到那个机器:hash(url) mod M ; Reduce 任务分发,同理 hash(url) mod R。
7. Map 函数伪代码(代码来源于 google的该篇论文 ), 负责一篇文章的词频统计,
Reduce 函数伪代码,合并多篇文章的中间统计结果
8 容错。 Google的说法是,集群容易出现某台PC死掉或硬盘坏掉的情况,MapReduce采用了自动容错机制。原理是重复执行 Re-excution, Master通过 ping 周期性监测机器的监控情况,发现不可用时,就将原先分配给他的任务转发给其他节点执行。
9 备份任务(Backup Task). 当MapReduce程序整体快要执行完毕时,对一些task,Master会安排他们的备份版本进行执行,当主任务和备份任务任何一个执行完毕,就表示该Task任务执行完毕,再进行后续工作。 Google说,这样可以避免某些task由于网络IO,磁盘IO等原因,执行缓慢,拖延整体进度。 文中举例,在一项测试中,启用备份任务机制,可以提高提前 30% 的时间完成任务。
10 一个典型的Google MapReduce硬件环境:
1800PC机集群,
每台 2GHz Xeon处理器, 4G内存, 160G IDE硬盘, 1000M以太网。
组网: 这些机器被组织为:两层,三向(tree-shaped,不知翻译准不准,呵呵)交换网络,根节点聚合带宽 100-200 Gbps。
这应该是2004年google的一个MapReduce应用集群配置情况,现在配置估计高一些。但对我们来说是不是也不难组织? 几台PC机还是可以搞掂的,呵呵。感兴趣的朋友也可以搞一个来玩玩。
11. 另外google有一个Cluster管理系统,来管理集群的机器,安装软件客户端,不过这篇论文没有怎么提及。还得再了解......
参考资料:
Jeffrey Dean and Sanjay Ghemawat. MapReduce: Simplified Data Processing on Large Clusters 2004
作为一个程序员,多少了解一些,也算跟得上时代,呵呵。
其中Google的MapReduce技术更是一个亮点。但《程序员》及网上的中文文章介绍以概念性居多,看完之后感觉大致了解,但又还是有些云里雾里的。不如直接看官方文档。
看过Google工程师Dean,Jeff and Ghemawat,Sanjay.的论文MapReduce: Simplified Data Processing on Large Clusters, http://labs.google.com/papers/mapreduce-osdi04.pdf, 踩在云中的双脚算是稍微落地了,之前一直好奇的几个技术细节终于有了答案。
以下是我初识 MapReduce 的认识:
用个例子来说比较直观:对100个网页的内容,统计出现的每个word的频率。
[b]1. MapReduce是一个大规模数据(large scale data set),平行计算(paralle computation)的技术方案;[/b]
[b]2. MapReduce 的基本运行环境是成百上千台普通的PC机组成的集群[/b],每台PC机运行Linux系统,MapReduce 控制集群各节点进行数据存储,和逻辑计算。 存储和计算是MapReduce集群两大核心功能。
[b]3. MapReduce基本架构 Master-Slave 模型[/b], Master负责任务(Task) 和 数据和运算的切分,和分发,分发到集群的各节点上; Slave 在这里叫 Worker,负责执行Master分发的任务;
Master还需负责Worker死亡监测 和 容错 (Fault Tolerant)等总控性工作。
[img]http://code.google.com/intl/zh-CN/edu/parallel/img/mrfigure.png" alt="[/img]
[b]4 Map Reduce 的运算过程是先分后合。[/b]
Map 意思直译为映射,不过理解为“分治”更容易懂。就是将数据和运算进行切分,并分发到集群节点上;
Reduce (本意是减少,所以初看名称时一直不理解减少为合意), 这里应该理解为该词的另一个意思,“归并”, 就是将分开执行的众多计算任务和数据进行合并,形成最终的输出结果。
[b] 5. 程序员基于MapReduce进行开发很easy。[/b]
Google MapReduce 提供了一个编程模型和环境(C++),允许程序员只通过少量代码,就可以实现大数据的计算,程序员只需关心自定义的 Map Function 和 Reduce Function。字定义的Map函数在众多Worker上执行原子任务, Reduce函数在部分Worker上合并相关 Map Worker上的中间结果,最终形成最终输出结果,一般为一个输出文件(Output file)。
细节方面:
6. 任务切分 (Partition) 和分发(Distribution)。 以前面举的100网页word词频统计为例,按 M=100个Task进行切分,每台Worker PC 负责统计一个URL网页的词频; 合并(Reduce) Worker数R 由用户指定。
如何分发任务(Distribute Task)? Map任务分发,按url哈希码决定分发到那个机器:hash(url) mod M ; Reduce 任务分发,同理 hash(url) mod R。
7. Map 函数伪代码(代码来源于 google的该篇论文 ), 负责一篇文章的词频统计,
map(String key, String value):
// key: document name
// value: document contents
for each word w in value:
EmitIntermediate(w, "1");
Reduce 函数伪代码,合并多篇文章的中间统计结果
reduce(String key, Iterator values):
// key: a word
// values: a list of counts
int result = 0;
for each v in values:
result += ParseInt(v);
Emit(AsString(result));
8 容错。 Google的说法是,集群容易出现某台PC死掉或硬盘坏掉的情况,MapReduce采用了自动容错机制。原理是重复执行 Re-excution, Master通过 ping 周期性监测机器的监控情况,发现不可用时,就将原先分配给他的任务转发给其他节点执行。
9 备份任务(Backup Task). 当MapReduce程序整体快要执行完毕时,对一些task,Master会安排他们的备份版本进行执行,当主任务和备份任务任何一个执行完毕,就表示该Task任务执行完毕,再进行后续工作。 Google说,这样可以避免某些task由于网络IO,磁盘IO等原因,执行缓慢,拖延整体进度。 文中举例,在一项测试中,启用备份任务机制,可以提高提前 30% 的时间完成任务。
10 一个典型的Google MapReduce硬件环境:
1800PC机集群,
每台 2GHz Xeon处理器, 4G内存, 160G IDE硬盘, 1000M以太网。
组网: 这些机器被组织为:两层,三向(tree-shaped,不知翻译准不准,呵呵)交换网络,根节点聚合带宽 100-200 Gbps。
这应该是2004年google的一个MapReduce应用集群配置情况,现在配置估计高一些。但对我们来说是不是也不难组织? 几台PC机还是可以搞掂的,呵呵。感兴趣的朋友也可以搞一个来玩玩。
11. 另外google有一个Cluster管理系统,来管理集群的机器,安装软件客户端,不过这篇论文没有怎么提及。还得再了解......
参考资料:
Jeffrey Dean and Sanjay Ghemawat. MapReduce: Simplified Data Processing on Large Clusters 2004