云计算之分布式计算系统
云计算属于分布式系统,众所周知,并行程序的设计、编码和调试非常挑战,在云计算分布式系统中,由于网络延时(毫秒级)远远大于单机系统内延时(微秒级)、部件的不可靠性以及节点之间较松的耦合度(低于通常的并行大型计算机)和异构性,高效并行程序的设计和实现难度更大,极大地阻碍普通程序员使用云计算系统。为了解决这个问题,Google创造性地把Map/Reduce模型成功地应用到了云计算系统中,极大地降低了云计算系统应用程序的开发难度且提高了云计算系统的并行度和运行效率,这就是云计算的分布式计算系统,它的基本原理是:每个应用程序被分成map函数和reduce函数,都由应用程序开发者编写,map函数的输入是<key, value>对,输出是中间结果<key, value>对,云计算分布式计算系统对这些中间结果按reduce分组,然后传给对应的reduce函数,reduce函数以迭代器的方式接收这些中间结果并进行合并等处理,然后输出所需的内容。例如,以海量文档的单词个数的统计问题为例,map函数输出的中间结果可以是:<单词,“1”>,即:
Map(string key, string value)
{
对于文档中的每个单词w
}
reduce函数则把所有的“1”加起来,最后输出:
Reduce(string key, iterator values)
//key: 一个单词
//values: 该单词对应的所有“1”
{
int num = 0;
for each v in values:
emit(itoa(num));
}
云计算的分布式计算系统的主要优点是:
l
开发者只需要设计、编写和调试普通的串行程序,即map函数和reduce函数,调试通过后提交到云计算系统,由云计算分布式系统框架把它们分发到成百上千台计算机(云计算的worker)上运行,并汇总和返回运行后的结果。开发者甚至不需要有分布式或者并行程序方面的经验或背景;
l
云计算分布式计算系统的master根据用户设置自动把作业切分为许多map任务和reduce任务,然后以按需的方式分配map和reduce任务到所有的worker上,每个worker完成一个任务后就报告给master,master就给该worker再分配一个map或reduce任务,该worker执行新分配的任务…..,如此直到所有任务执行完;
l
上述按需分配任务的方式使得每个worker的计算能力都能得到最大限度的发挥:快的worker执行更多的任务,慢的worker执行较少的任务;
l
由于整个作业被切分成许多map任务和reduce任务,worker故障后,只要再次执行对应的map和reduce任务即可;master则定期记录检查点(checkpoint),一旦master异常,新的master读入最后一次检查点,则整个作业可以最后一次检查点的基础上继续执行。
云计算的分布式计算系统也自身的局限性。云计算分布式系统的易用和高效建立Map/Reduce模型的基础上,Map/Reduce模型要求切分出来的map和reduce可以多次以任意顺序执行而没有副作用,等等。幸运的是,绝大部分应用能够适用于该模型,不适合的应用也常常能够找到可用的近似算法,这使得云计算系统在实际工作中发挥了巨大的作用。
尽管云计算的分布式计算系统是其中相对比较简单的部分,但也不是非常容易理解,后续文章还有更多的说明。
阳振坤 (yangzhenkun@gmail.com)