Spark是什么?算法
Spark,是一种通用的大数据计算框架,正如传统大数据技术Hadoop的MapReduce、Hive引擎,以及Storm流式实时计算引擎等。 Spark包含了大数据领域常见的各类计算框架:好比Spark Core用于离线计算,Spark SQL用于交互式查询,Spark Streaming用于实时流式计算,Spark MLlib用于机器学习,Spark GraphX用于图计算。 Spark主要用于大数据的计算,而Hadoop之后主要用于大数据的存储(好比HDFS、Hive、HBase等),以及资源调度(Yarn)。sql
Spark总体架构编程
Spark的特色:json
·速度快:Spark基于内存进行计算(固然也有部分计算基于磁盘,好比shuffle)。 ·容易上手开发:Spark的基于RDD的计算模型,比Hadoop的基于Map-Reduce的计算模型要更加易于理解,更加易于上手开发,实现各类复杂功能,好比二次排序、topn等复杂操做时,更加便捷。 ·超强的通用性:Spark提供了Spark RDD、Spark SQL、Spark Streaming、Spark MLlib、Spark GraphX等技术组件,能够一站式地完成大数据领域的离线批处理、交互式查询、流式计算、机器学习、图计算等常见的任务。 ·集成Hadoop:Spark并非要成为一个大数据领域的“独裁者”,一我的霸占大数据领域全部的“地盘”,而是与Hadoop进行了高度的集成,二者能够完美的配合使用。Hadoop的HDFS、Hive、HBase负责存储,YARN负责资源调度;Spark复杂大数据计算。实际上,Hadoop+Spark的组合,是一种“double win”的组合。架构
Spark VS MapReduce:并发
MapReduce可以完成的各类离线批处理功能,以及常见算法(好比二次排序、topn等),基于Spark RDD的核心编程,均可以实现,而且能够更好地、更容易地实现。并且基于Spark RDD编写的离线批处理程序,运行速度是MapReduce的数倍,速度上有很是明显的优点。 Spark相较于MapReduce速度快的最主要缘由就在于,MapReduce的计算模型太死板,必须是map-reduce模式,有时候即便完成一些诸如过滤之类的操做,也必须通过map-reduce过程,这样就必须通过shuffle过程。而MapReduce的shuffle过程是最消耗性能的,由于shuffle中间的过程必须基于磁盘来读写。而Spark的shuffle虽然也要基于磁盘,可是其大量transformation操做,好比单纯的map或者filter等操做,能够直接基于内存进行pipeline操做,速度性能天然大大提高。 可是Spark也有其劣势。因为Spark基于内存进行计算,虽然开发容易,可是真正面对大数据的时候(好比一次操做针对10亿以上级别),在没有进行调优的状况下,可能会出现各类各样的问题,好比OOM内存溢出等等。致使Spark程序可能都没法彻底运行起来,就报错挂掉了,而MapReduce即便是运行缓慢,可是至少能够慢慢运行完。 此外,Spark因为是新崛起的技术新秀,所以在大数据领域的完善程度,确定不如MapReduce,好比基于HBase、Hive做为离线批处理程序的输入输出,Spark就远没有MapReduce来的完善。实现起来很是麻烦。框架
Spark SQL VS Hive:机器学习
Spark SQL实际上并不能彻底替代Hive,由于Hive是一种基于HDFS的数据仓库,而且提供了基于SQL模型的,针对存储了大数据的数据仓库,进行分布式交互查询的查询引擎。 严格的来讲,Spark SQL可以替代的,是Hive的查询引擎,而不是Hive自己,实际上即便在生产环境下,Spark SQL也是针对Hive数据仓库中的数据进行查询,Spark自己本身是不提供存储的,天然也不可能替代Hive做为数据仓库的这个功能。 Spark SQL的一个优势,相较于Hive查询引擎来讲,就是速度快,一样的SQL语句,可能使用Hive的查询引擎,因为其底层基于MapReduce,必须通过shuffle过程走磁盘,所以速度是很是缓慢的。不少复杂的SQL语句,在hive中执行都须要一个小时以上的时间。而Spark SQL因为其底层基于Spark自身的基于内存的特色,所以速度达到了Hive查询引擎的数倍以上。 可是Spark SQL因为与Spark同样,是大数据领域的新起的新秀,所以还不够完善,有少许的Hive支持的高级特性,Spark SQL还不支持,致使Spark SQL暂时还不能彻底替代Hive的查询引擎。而只能在部分Spark SQL功能特性能够知足需求的场景下,进行使用。 而Spark SQL相较于Hive的另一个优势,就是支持大量不一样的数据源,包括hive、json、parquet、jdbc等等。此外,Spark SQL因为身处Spark技术堆栈内,也是基于RDD来工做,所以能够与Spark的其余组件无缝整合使用,配合起来实现许多复杂的功能。好比Spark SQL支持能够直接针对hdfs文件执行sql语句!分布式
Spark Streaming VS Storm:高并发
Spark Streaming与Storm均可以用于进行实时流计算。可是他们二者的区别是很是大的。其中区别之一,就是,Spark Streaming和Storm的计算模型彻底不同,Spark Streaming是基于RDD的,所以须要将一小段时间内的,好比1秒内的数据,收集起来,做为一个RDD,而后再针对这个batch的数据进行处理。而Storm却能够作到每来一条数据,均可以当即进行处理和计算。所以,Spark Streaming实际上严格意义上来讲,只能称做准实时的流计算框架;而Storm是真正意义上的实时计算框架。 此外,Storm支持的一项高级特性,是Spark Streaming暂时不具有的,即Storm支持在分布式流式计算程序(Topology)在运行过程当中,能够动态地调整并行度,从而动态提升并发处理能力。而Spark Streaming是没法动态调整并行度的。 可是Spark Streaming也有其优势,首先Spark Streaming因为是基于batch进行处理的,所以相较于Storm基于单条数据进行处理,具备数倍甚至数十倍的吞吐量。 此外,Spark Streaming因为也身处于Spark生态圈内,所以Spark Streaming能够与Spark Core、Spark SQL,甚至是Spark MLlib、Spark GraphX进行无缝整合。流式处理完的数据,能够当即进行各类map、reduce转换操做,能够当即使用sql进行查询,甚至能够当即使用machine learning或者图计算算法进行处理。这种一站式的大数据处理功能和优点,是Storm没法匹敌的。 所以,综合上述来看,一般在对实时性要求特别高,并且实时数据量不稳定,好比在白天有高峰期的状况下,能够选择使用Storm。可是若是是对实时性要求通常,容许1秒的准实时处理,并且不要求动态调整并行度的话,选择Spark Streaming是更好的选择。