谷歌遇到了同样的问题,它有很多数据,还有很多非结构化的数据,比如图片、视频越来越多,需要存储的量越来越大,计算量也始终保持在很高的水平。他们解决了一些方法,比如说在寒冷或者是低电价的地方建数据中心,减少机房电费的支出。大家都知道一个事情就是,我们在服务器上用一块钱的电,就要在空调上要用一块五毛钱的电甚至更多的来解决散热的问题,很多地方在建计算中心,建机房,有的沿海的缺电的省份也在做,海南都要开始做云计算机房,我也不知道他们到时候怎么去解决散热问题,怎么去解决电力问题。使用改造后的直流电服务器,或者是使用普通PC服务器。但是更重要的在下面,就是说他们发明了很多计算模型或者是工具,像MapReduce,过程是GFS谷歌的文件系统,或者是Big Table等并行计算模型、文件存储模型和NoSQL数据库模型。用他们无穷的智慧,将谷歌的产品进行开源化。谷歌把这些这套东西介绍出来,Doug Cutting敏锐地捕捉到这一契机,在业余时间就开始开发自己的分布式计算框架Hadoop。后来被雅虎招安,后来项目被赠送给Apache基金会,并成为Apache,后来被商业社会和学术界接受。
我们看一下主要的四个组件,或者应用到的例子。包括Hadoop这种分布式的文件系统,也就是说不仅仅是一个框架,还是一种文件系统,这个文件系统是高可用的,自己就构建了一些备份的机制,能够保证你的数据不会丢失。所以设备是适合于做这种文件备份系统,据说亚马逊的存储服务也是通过Hadoop的HDFS做出来的,昨天我们也讨论过,能不能存储栅格数据,我觉得还是非常合适的。MapReduce是一种分布式的计算模型,提供了两个函数的接口,让你自己选,一个是Map的函数,一个是Reduce的函数。还有一个HBase,是面向行的数据库,这种特性是建立在HDFS之上的。我的数据如果存储,一般的数据库容量大了,我要做分库分表的操作,这个不用,可以继续加一个节点上去就可以写数据。数据库不支持查询,通过这个来做数据查询的工作。
HDFS是怎么样保证数据具有高可靠性的?当我安装起一个Hadoop的软件以后,我把我的数据存到这个HDFS上面,比如你的数据有1G,它会按照168个数据块进行切分,并且把每一份数据块都放在不同的数据节点上,一般是三份,可以调更多,调四份或者是调五份。我们举这个例子,一个文件如果被切分到四份,有500多兆的话,切成了四份,数据块会被放在一号二号和三号机,它的优点是什么呢?就是说如果我这个机器坏了,实际上对我是没有影响的。因为我从外面Hadoop的平台读这个数据的话是没有影响的,这就能保证这个数据不会丢失。除非说你所有的两台甚至是三台机器坏了就很难说了。通过这个节点,会记录文件的位置,也会对一些大数据量进行优化和保存。我们可以自己进行调整,有的时候可能调整得更小一点,调整到64兆,在用户数据的处理上会更大,关键是看数据的规模有多大。当我们讲数据存到HDFS以后,我们要对它进行处理,这个是MapReduce的一个并行计算的框架,它是一种计算分布式的模型,从一大堆的结算节点,把它作为一个集群来解决这个问题。作为MapReduce它解决问题有一个很有趣的地方,因为它是把这个数据切开以后,给你进行计算,最后得出一个结果。我们前面说过,我的数据都被切成一片一片的,放在不同的企业上。它不会把你这个数据,比如一号这个数据需要做计算了,他不会把你的机器移到四号机器上做计算,就会本身在一号机器上做完,把结果可能放到一个Reduce里面,那台机器把数据移过去,所以是尽量避免网间数据的开销,称这种特性叫做移动计算比移动数据更加经济。因为如果你的数据增得很大,哪怕在局域网当中传来传去,还会遇到丢包等事情,最后造成计算功亏一篑。MapReduce是运行在Java上面的,如果你的计算是失败了,你错了怎么办?它会自动的再重启这个计算过程,有一个心跳的检测,直到你这个计算成功为止。
HBase,可能一般的习惯于放在HDFS上面,但是以后的还是习惯放在数据库里面。是建立在HDFS的数据库,通过原生的HDFS支持。一个好处就是能够使用MapReduce的平台和算法来处理里面存储的数据。但是它的缺点也很明显,就是查询的时候,可以装很多数据,它的数据是横向的扩展过去的,但是没有这种机制,只能通过硬暴力的方式来解决查询的问题。为了解决这个问题,他们还有一个新的工具就是Hive,Hive是一种数据仓库,能够基于MR架构。这种查询意味着什么?意味着它跑得再快,可能也不如我们这种关系数据库里面这种东西跑得快。比如说我查GIS查询的话,我可能希望我输入一个SQL的命令进去,可能零点几秒钟数据就进去了,通过Hive的查询,最快也要20多秒,30秒,甚至是更慢,因为它要启动进程,它要处理,要查找,把查找的结果汇聚到一点,最后输出。
我们按照分布式的并行机制,可以在上千台PC机组成的集成里面进行海量的计算。一般来讲,我们做这种完全分布式的部署的话,有一台主机的一个节点,负责监控所有的节点,就是说负责读取数据,负责分发录入,也负责监督下面的这些子节点有没有正常工作,如果没有正常工作,是不是再提交一次,再计算一次?会自己通过这种机制来解决负载均衡的问题。Reduce深受Lisp的影响,不知道大家使用过Lisp的没有,它将任务分为两个阶段,实际上两个函数,一个是Map函数,一个是Reduce函数。我们所有编程的任务都到这个函数里面实现,从HDFS或者是HBase里面读取出来,不一定是数值,可是你想要的任何数据,任何文本,甚至是对象都可以。读进来之后,你需要对它进行一些处理,然后把它输出为新的对。这个处理的过程,普遍就是我们处理的过程。输出可能会通过一个过程进入到Reduce这个阶段,有这么一个过程,是混写,会把所有Key相同的来合并,这样就使我们的数据量更小,然后Reduce再把它输出。