Spark是什么
- 如果你关注过大数据领域的任何事情,甚至做任何互联网有关的工作,你会发现Spark这个词四处都是:机器学习需要Spark,数据流传输需要Spark,ETL也需要Spark。
有没有想过,Spark到底是什么?居然能够得到这种程度的关注? - 用最简单的语言去描述Spark的话,听起来或许有点百度百科:
Spark是一个通用的分布式数据处理引擎。 - 上面这句话听起来或许很抽象,我们一个词一个词的来解释通用:通用指的是Spark可以做很多事情。刚刚我们提到过的,包括机器学习,数据流传输,交互分析,ETL,批处理,图计算等等等等都是Spark可以做到的。甚至可以说,你需要用数据实现的任何事情,你都可以用Spark试试看。分布式:指的是Spark处理数据的能力是建立在许多机器上的,是可以和分布式的存储系统对接的,是可以做横向扩展的(简单点说就是电脑越多,能力越大)引擎:所谓引擎,说的就是Spark自己不会存储数据,它就像实体的机械引擎一样,会将燃料(对Spark来说是数据)转化成使用者需要的那种形式——例如驱动汽车,再例如得到一个需要的目标结论。但无论如何,巧妇难为无米之炊,没数据是万万不行的。
(图片来源:http://gigaom.com/2014/06/28/4-reasons-why-spark-could-jolt-hadoop-into-hyperdrive/)
Spark的历史
- Spark是个和Hadoop血缘很深的东西,从最开始的设计,Spark就是为了代替MapReduce这个笨重的算法的。我们之前说过,MapReuce是一个很重型的计算工具。究其原因,一个是因为MapReduce有大量的磁盘IO(读写电脑磁盘)工作要做,这磁盘IO可以说是相当花时间,再加上一旦把中间结果存储在HDFS文件里面(而不是本地磁盘),上一个节点得花时间去发文件,下一个计算节点也得花时间去做网络请求取数据,难道网络通讯不要时间吗?
另一者是因为MapReduce这算法很底层,只提供map和reduce两个操作给你,我们现在经常需要的什么where啊,join啊,全得依靠data shuffle的过程洗出来(data shuffle,广义来说就是在map和reduce之间做的一切事情,例如排序,分片,筛选)。这就好比让你用汇编语言去写个Moba类的游戏:能写是能写,但是非常费劲。归根到底是抽象层次太低了,使用者只有get hands very dirty - 再写两个小插曲,在Spark出现之前,Hadoop生态内也出现过抽象程度更高的项目,比如Apache Pig。Pig这个项目提供了一般人最经常使用的SQL接口,然后自己在内部将SQL转化为MapReduce过程;也出现过Apache Tez这种执行引擎,提供DAG(有向无环图,简单来说就是一个执行流程图)的方式去执行MapReduce,同时也去除了一些不必要的操作(比如不再是必须一个map对应一个reduce),以此来加速整个数据处理的过程
- 在2009年,加州大学伯克利分校的AMP实验室,诞生了一个叫做Spark的项目。这个项目在2013年成为了Apache的孵化项目,并以极快的速度成为了一个备受欢迎和关注的顶级项目
Spark项目的初衷是为了代替MapReduce,提供一种既可以极大批量的处理分布式的数据,又有足够的容错能力,且上手容易,速度快,可以让人实现实时交互分析的解决方案。
(实时交互分析的意思是,在使用正确的方法的前提下,可以马上得到自己需要的分析结果——这一点MapReduce可做不到)
Spark和Hadoop
- 有些人说Spark的出现代表着Hadoop的死亡,这个观点我是不认同的。Hadoop是一个分布式的系统生态,不是靠着Spark这个引擎可以替代的。
但不得不承认,Spark的出现对于Hadoop来说,确实极大程度上弥补了一些短板,对Hadoop造成了一些影响。而Hadoop的生态,包括资源调度和文件存储的部分,对于Spark这个纯引擎来说,也是很有帮助的。 - 具体来说,Spark帮助Hadoop实现了用户友好。一个将Spark和Hadoop结合起来使用的人,和一个只使用Hadoop生态内工具的人,感受将会是截然不同的。
第一,使用Spark的时候,不再需要考虑怎么样把各种日常的操作硬塞到map和reduce这两个操作中间去。因为Spark提供了抽象程度更高的接口。
第二,使用Spark的时候,不用再为一个查询而等到油尽灯枯。建立在RDD和内存存储中间数据上的Spark,对实时性的支持很高。
- 在这里简单讲一下RDD。RDD是一个抽象的概念,一个逻辑上的数据结构,中文全称是弹性分布式数据集,最直接的理解就是一个大的dataframe——这个dataframe可能是所有机器上原始数据的总和,也可能是中间计算到某一步得到的一个中间结果形成的dataframe。
Spark Streaming
- 为什么要单独把Spark Streaming拿出来将呢?这属于个人执念。促使我去理解Spark这个概念的,就是Spark Streaming这个建立在Spark引擎上的应用。在我过去的想法里,Spark是一种数据处理工具,怎么还能做数据流的传输管理呢?直到我详细的去了解了Spark,才知道数据处理工具指的是MLLib或者Shark这些同样建立在Spark引擎上的应用。
- 单独说一下Spark Streaming。用Apache的官方说法是,Spark Streaming就是从某处接受实时数据,然后将实时数据进行分片分批,再做一些需要的处理(比如数据清洗或者数据聚合),最后再分批将数据向一个目标输送过去。
这个过程中分批分片这一点值得注意,这意味着Spark传出去的数据流是一批一批的,可以根据下游接受方的需要对传输速度和每批数据的大小进行调整。