
三、数据计算
1.原理与方法
仅仅实现数据存储是远远不够的,数据的存储与数据计算紧密相连。对数据进行任何的操作都会涉及同一个过程:从数据存储介质中获取目标数据,把读取的数据传送到CPU进行计算,然后CPU把计算的结果数据保存到数据存储介质中。在数据处理的过程中这一过程会不断地反复发生,在日常生活中使用个人电脑的时候因为数据规模有限,所以这一过程的每个步骤在大多数情况下都会在几乎人类感官无法察觉的时间尺度中完成。例如,当你打开日历应用,记录下某个重要事项,然后单击“保存”按钮,在这之后的一瞬间整个计算和存储过程就已经完成了。但是,当数据规模变得越来越大,这一过程的每个步骤所耗费的时间会迅速增加。不同的数据存储介质的读写速度会有很大的差别。即使是固态硬盘现在的数据读取速度可以达到5GB每秒(大约5000MB每秒),要读取一个4TB硬盘的所有数据就需要13分钟,写入数据的速度则会更慢。
4TB数据在大数据时代只能算是沧海一粟,但是13分钟这个时间尺度对于任何互联网应用而言都是灾难。几乎不会有用户会有如此的耐心,超过1秒的等待时间都会影响到用户体验。在计算机发展史上,因为计算机的计算能力有限,很多超前的想法最终都停留在了理论层面没有取得突破。不管是科技层面还是商业层面,获取更大的计算能力长期以来一直是计算机科学的努力方向。虽然,计算机的计算能力一直以来都在提升,但是数据计算的需求也在不断增加,特别是在大数据时代这种需求更是在爆发性地增长。
读者应该已经设身处地地体会到这个难题的本质了:庞大的数据集和计算效率之间的矛盾。我们举一个直观的例子,想象一下,你是一名学校的老师,在一次考试完成之后有1000份试卷需要批改,三天之内需要完成,但是一个人每天最多只能批改100份试卷,怎么办?一个可能的解决方案就是:把1000份试卷分派给10名老师,每人100份,一天的时间可以把所有的试卷批改完成。第二天花少量的时间就可以把所有的试卷汇总,还会有余下的时间休息。
让我们把这个问题抽象并简化为计算机领域的问题:数据规模和时间限制明确的情况下,如何满足计算的需求?要实现这一目标唯有提供更多的资源,例如:一台计算机无法完成,需要计算机集群来完成(对应上面例子中的人数增加)。通过增加计算资源来满足时间限制被证明是一个行之有效的办法,毕竟计算机的价格越来越便宜,这一点正是摩尔定律的反映。
这个解决问题方案的核心是把一个大的任务分解成为多个可并行解决的小任务来执行,在每个小任务完成之后再进行汇总。把小的任务进行汇总会产生额外的负担和时间消耗,但是相比于在处理巨大数据集时分布与并行运算所节约的时间,这样的消耗已经显得微不足道。
这个解决方案的本质是用空间换时间。
到目前为止,这个方法是不是听起来还不错,剩下来的问题是,如何让这些计算机有条不紊地的分工协作?MapReduce就是为解决这个问题而生的。MapReduece的理论最开始由Google研发人员Jeffrey Dean和Sanjay Ghemawat在论文《MapReduce:Simplified Data Processing on large Clusters》(MapReduce:在大型计算机集群上的简化数据处理)中阐述。文中提到MapReduce思想的灵感来源于函数式计算机语言的内置函数Map(映射)和Reduce(规约)。
我们还是以上面提到的试卷批改的例子来说明MapReduce的工作原理。如果要从这1000份试卷中统计出及格的人数,按照MapReduce的思想可以把1000份试卷平均分给10位老师,这10位老师在MapReduce的理论中称为mapper。每个mapper找到自己试卷中的及格人数并告诉给另一组老师,这一组称为reducer,reducer把得到的各个组的及格人数进行相加后得到这1000份试卷中总的及格人数。除了mapper和reducer之外,还有主管(main或者master node)会管理mapper和reducer之间的协作。你会发现,在正常情况下,增加mapper和reducer的数量会加快任务完成的效率。事实上我们的大数据处理就是按照这个原理来操作的。下面介绍的这些计算平台就是这一原理的具体实现,对于数据科学家来说这是必不可少的武器。
2.Apache Hadoop
Hadoop是MapReduce思想的软件实现,而且是开源免费的。Hadoop是隶属于Apache基金会的项目,由Java语言编写。Hadoop不仅实现了MapReduce的分布式计算,而且还自带分布式文件系统HDFS(Hadoop Distributed File System)。通过Hadoop可以方便地对计算机集群进行管理和协调,来进行分布式计算,同时对数据进行有效的存储,而且开发者不需要涉及分布式底层的细节。因为这一系列的优点,Hadoop在业界得到了广泛的应用。
Hadoop诞生于2006年,最开始是搜索引擎项目Apache Nutch的子项目,但很快同年就作为了一个单独的项目独立了出来,Yahoo最先应用和部署了Hadoop计算机集群,并对Hadoop进行了持续的优化,发展出众多的子项目,使Hadoop成为了一个越来越完善和强大的系统。在2008年6月,Yahoo的一个Hadoop集群赢得了太字节(TeraByte)排序竞赛的冠军,以209秒的成绩创造了当时新的世界纪录,这是有史以来第一次开源项目,也是第一次Java项目获此殊荣,Hadoop一战成名,在业界得到了广泛的应用,很长一段时间内Hadoop甚至成为了大数据平台的代名词。
Hadoop这个名字有些特立独行,既不是现有的英文单词,也不是单词的缩写,而是虚构的。Hadoop项目的创建者——Doug Cutting从他的孩子那里“窃取”了这个名字。他的孩子给一个棕黄色大象玩具命名为Hadoop,Doug Cutting就借用了这个名字命名了自己的“玩具”。毕竟Doug Cutting创建了Lucene、Nutch和Hadoop等深刻改变了我们世界的项目,有时候有点小调皮也无可厚非。
Hadoop已经发展成为了具有多个子项目的生态系统,但其核心一直是HDFS和MapReduce。HDFS实现数据的存储,而MapReduce实现对数据的计算和处理。HDFS可以存储超大规模PB级的文件,这些文件的大小甚至超过通常的单一存储介质的容量。HDFS会把超大规模文件切分成一个个数据块(block),然后把数据块保存到不同的磁盘上。这样既降低了对存储介质的要求,也提升了容错能力。Hadoop会协调HDFS和MapReduce之间的工作能够在HDFS存储数据的节点上运行map任务,使计算在本地进行。各个节点mapper的计算结果汇总到reduce端。Reduce计算之后最终结果再通过HDFS进行存储。
3.Apache Spark
Spark在2009年诞生于伯克利大学的AMP实验室(University of California Berkeley’s AMP Lab)。2010成为开源项目,并于2013年被捐献给Apache软件基金会。虽然是后起之秀,但相比于Apache Hadoop,Apache Spark有几个方面的优势。
首先,快速。所谓“天下武功,唯快不破”,在大数据时代更快的数据处理速度无疑是所有大数据平台都在不断追求的力量源泉。Apache Spark的口号是闪电般迅速的集群运算,因为能够更好地使用内存和磁盘,Apache Spark的处理速度可以比Apache Hadoop快10倍到100倍。然后,易用,Apache Spark虽然是用Scala编写,但是可以用Scala语言,Pyhton语言和Java语言,甚至是R语言进行操作。数据算法的编写一直是Python语言和R语言的传统领地,Apache Spark能够进行多语言的灵活兼容无疑为数据科学家进行算法编写和测试提供了极大的方便。最后,通用,Apache Spark搭建集群既能够独立完成,又能够通过Apache Hadoop Yarn或是Apache Mesos来实现。“有容乃大”,良好的兼容性让Apache Spark快速崛起。
Apache Hadoop和Apache Spark是目前最有代表性和使用最广泛的大数据平台,作为Apache旗下的同门师兄弟,二者有着激烈的竞争,同时还面临着其他挑战,比如Apache Storm和Cloudera为代表的商业非开源的大数据平台等。大数据领域的技术革新是风起云涌只争朝夕,正所谓“天下风云出我辈,一入江湖岁月催”。
大数据技术提供了可以持续升级和扩大的计算能力,这也是大数据技术通常和云计算相提并论的原因所在。大数据技术和云计算是大规模数据处理和分析的基础设施,接下来的问题是要怎样进行数据处理与分析,以及这样做的意义何在。