Spark SQL入门与实践指南
上QQ阅读APP看书,第一时间看更新

1.1 Spark SQL的前世今生

1.Spark的诞生

相信大家都听说过MapReduce这个框架,MapReduce是对分布式计算的一种抽象。程序员对map方法和reduce方法进行简单的编写就能迅速地构建出并行化的程序,而不用担心工作在集群上的分布和集群当中数据的容错,这就大大地降低了程序的编写和部署难度。

遗憾的是,MapReduce这个框架缺少了对分布式内存利用的抽象,这就导致了在不同的计算任务间(比如说两个MapReduce工作之间)对数据重用的时候只能采用将数据写回到硬盘中的方法。而计算机将数据写回到磁盘的这个过程耗时是很长的。如今,许多机器学习的算法都需要对数据进行重用,并且这些算法中都包含着大量的迭代计算,比如说PageRank、K-means等算法。如果使用MapReduce来实现这些算法,那么在执行的时候,将会有大量的时间被消耗在I/O上面。针对这个问题,伯克利大学提出了RDDs(弹性分布式数据集RDDs是一个具有容错性和并行性的数据结构,它可以让我们将中间结果持久化到内存中)的思想,RDDs提供了对内存的抽象,然后伯克利大学根据RDDs的思想设计出了一个系统,Spark就这样诞生了。

2.从Shark到Spark SQL

Spark诞生之后,人们开始使用Spark,并且喜欢上了Spark。渐渐的,使用Spark的人越来越多。突然有一天,一部分人产生了一个大胆的想法:Hadoop上面有Hive,Hive能把SQL转成MapReduce作业,这多么方便啊!Spark这么好用的系统却没有配备类似Hive这样的工具,要不我们也造一个这样的工具吧!于是Shark被提了出来,Shark将SQL语句转成RDD执行。这就仿照了Hadoop生态圈,做出了一个Spark版本的“Hive”。做出这个工具之后人们十分开心,因为他们终于也能愉快地使用SQL对数据进行查询分析了,可以大大地提高程序的编写效率。图1-1所示是Shark的架构示意图,来自https://amplab.cs.berkeley.edu/wp-content/uploads/2012/03/mod482-xin1.pdf。

图1-1

随着越来越多的人使用Shark和其版本的更新,人们发现Shark具有一定的局限性。细心的小伙伴会发现图1-1中Shark的框架使用了HiveQL Parser这一模块。这样一来Shark对Hive有了依赖,导致Shark添加一些新的功能或者修改一些东西时特别不方便。这样Shark的发展受到了严重的限制。

由于Shark这样的一些弊端,在2014年左右人们决定终止Shark这个项目并且将精力转移到Spark SQL的研发当中去。之后一个新的SQL引擎——Spark SQL就诞生了。