文洲 2011-08-19
hadoop获得的巨大的成功令人不得不关注和研究它。本文将从它如何提高计算性能,减少计算时间入手分析hadoop。
1.性能可以线性提高
hadoop的计算模型就是map/reduce,每一个计算任务会被分割成很多互不依赖的map/reduce计算单元,将所有的计算单元执行完毕后整个计算任务就完成了。因为计算单元之间互不依赖所以计算单元可以分配到不同的计算机上执行,这样就可以将计算压力平摊到多个机器上面。如果一个计算任务可以分成n个计算单元,每个计算单元执行时间为t,如果有m太机器那么最终的计算时间就是t*(n/m),m越多时总体计算时间越少。因此hadoop可以让系统性能随机器增加而线性提高。
当然性能线性提高是有条件的,前提是计算任务所采用的算法必须能够适应map/reduce模式。例如对于海量数据排序任务来说,绝大多数的排序算法都是不适应map/reduce模式的,如堆排序,插入排序,冒泡排序都是不适用于map/reduce的,因为这些算法都需要维护一个全局有序队列,这会导致数据与数据之间严重依赖而导致计算任务不能分解。而桶排序算法(bucketsort)是可以适应map/reduce算法的。桶排序过程是这样的,首先对数据分段,段内是无序的,段间是有序的,后段的任何一个数据大于前段任何一个数据。此时可以把每一段划分成一个计算单元,这样就可以适用map/reduce模式了,每一个段有序后,排序任务就完成了。
2.将计算和数据融为一体
用Google的话来说就是movingcomputationismuchcheaperthanmovingdata。
很多时候数据存放在数据中心,当需要数据的时候,通过网络下载数据到本地然后处理数据得到结果。这种情形下数据从数据中心到计算中心会有很大的IO开销,很多时候这将成为性能瓶颈。而hadoop的做法是数据存放哪台机器上,计算任务就在那台机器上执行,然后将计算结果传送到需要的地方,这样就可以节约数据传输的时间。如果计算结果的数据量大于原始数据的数据量那么hadoop是不划算的,但通常情况下,计算结果数据量远远小于原始数据的数据量,如日志分析,数据搜索等。
hadoop的实现方式是这样的。hadoop不仅是一个计算框架,hadoop也包含一个分布式文件系统HDFS,这个文件系统将文件分别存放在不同的机器上。hadoop的map/reduce计算框架会和HDFS协作,将map/reduce计算单元分配到数据存放的机器上,这样就实现了"movingcomputation"。
从分析可以看出,map/reduce计算框架必须和HDFS这样的分布式文件系统协作,否则会出现数据传输的瓶颈。
——————————————————————————
标题中nuclearbomb对应的中文竟然是敏感词,悲剧,只有用英语啦,见谅。