误解一:Spark是一种内存技术算法
你们对Spark最大的误解就是其是一种内存技术(in-memorytechnology)。其实不是这样的!没有一个Spark开发者正式说明这个,这是对Spark计算过程的误解。数据库
咱们从头开始说明。什么样的技术才能称得上是内存技术?在我看来,就是容许你将数据持久化(persist)在RAM中并有效处理的技术。然而Spark并不具有将数据数据存储在RAM的选项,虽然咱们都知道能够将数据存储在HDFS,Tachyon,HBase,Cassandra等系统中,可是不论是将数据存储在磁盘仍是内存,都没有内置的持久化代码(nativepersistencecode)。它所能作的事就是缓存(cache)数据,而这个并非数据持久化(persist)。已经缓存的数据能够很容易地被删除,而且在后期须要时从新计算。缓存
可是即便有这些信息,仍然有些人仍是会认为Spark就是一种基于内存的技术,由于Spark是在内存中处理数据的。这固然是对的,由于咱们没法使用其余方式来处理数据。操做系统中的API都只能让你把数据从块设备加载到内存,而后计算完的结果再存储到块设备中。咱们没法直接在HDD设备上计算;因此现代系统中的全部处理基本上都是在内存中进行的。机器学习
虽然Spark容许咱们使用内存缓存以及LRU替换规则,可是你想一想如今的RDBMS系统,好比Oracle和PostgreSQL,你认为它们是如何处理数据的?它们使用共享内存段(sharedmemorysegment)做为tablepages的存储池,全部的数据读取以及写入都是经过这个池的,这个存储池一样支持LRU替换规则;全部现代的数据库一样能够经过LRU策略来知足大多数需求。可是为何咱们并无把Oracle和PostgreSQL称做是基于内存的解决方案呢?你再想一想LinuxIO,你知道吗?全部的IO操做也是会用到LRU缓存技术的。oop
你如今还认为Spark在内存中处理全部的操做吗?你可能要失望了。好比Spark的核心:shuffle,其就是将数据写入到磁盘的。若是你再SparkSQL中使用到groupby语句,或者你将RDD转换成PairRDD而且在其之上进行一些聚合操做,这时候你强制让Spark根据key的哈希值将数据分发到全部的分区中。shuffle的处理包括两个阶段:map和reduce。Map操做仅仅根据key计算其哈希值,并将数据存放到本地文件系统的不一样文件中,文件的个数一般是reduce端分区的个数;Reduce端会从Map端拉取数据,并将这些数据合并到新的分区中。全部若是你的RDD有M个分区,而后你将其转换成N个分区的PairRDD,那么在shuffle阶段将会建立M*N个文件!虽然目前有些优化策略能够减小建立文件的个数,但这仍然没法改变每次进行shuffle操做的时候你须要将数据先写入到磁盘的事实!性能
因此结论是:Spark并非基于内存的技术!它实际上是一种能够有效地使用内存LRU策略的技术。学习
误解二:Spark要比Hadoop快10x-100x测试
这个图片是分别使用Spark和Hadoop运行逻辑回归(LogisticRegression)机器学习算法的运行时间比较,从上图能够看出Spark的运行速度明显比Hadoop快上百倍!可是其实是这样的吗?大多数机器学习算法的核心部分是什么?其实就是对同一份数据集进行相同的迭代计算,而这个地方正是Spark的LRU算法所骄傲的地方。当你屡次扫描相同的数据集时,你只须要在首次访问时加载它到内存,后面的访问直接从内存中获取便可。这个功能很是的棒!可是很遗憾的是,官方在使用Hadoop运行逻辑回归的时候很大可能没有使用到HDFS的缓存功能,而是采用极端的状况。若是在Hadoop中运行逻辑回归的时候采用到HDFS缓存功能,其表现极可能只会比Spark差3x-4x,而不是上图所展现的同样。优化
根据经验,企业所作出的基准测试报告通常都是不可信的!通常独立的第三方基准测试报告是比较可信的,好比:TPC-H。他们的基准测试报告通常会覆盖绝大部分场景,以便真实地展现结果。操作系统
通常来讲,Spark比MapReduce运行速度快的缘由主要有如下几点:
task启动时间比较快,Spark是fork出线程;而MR是启动一个新的进程;
更快的shuffles,Spark只有在shuffle的时候才会将数据放在磁盘,而MR却不是。
更快的工做流:典型的MR工做流是由不少MR做业组成的,他们之间的数据交互须要把数据持久化到磁盘才能够;而Spark支持DAG以及pipelining,在没有遇到shuffle彻底能够不把数据缓存到磁盘。
缓存:虽然目前HDFS也支持缓存,可是通常来讲,Spark的缓存功能更加高效,特别是在SparkSQL中,咱们能够将数据以列式的形式储存在内存中。
全部的这些缘由才使得Spark相比Hadoop拥有更好的性能表现;在比较短的做业确实能快上100倍,可是在真实的生产环境下,通常只会快2.5x~3x!
误解三:Spark在数据处理方面引入了全新的技术
事实上,Spark并无引入任何革命性的新技术!其擅长的LRU缓存策略和数据的pipelining处理其实在MPP数据库中早就存在!Spark作出重要的一步是使用开源的方式来实现它!而且企业能够免费地使用它。大部分企业势必会选择开源的Spark技术,而不是付费的MPP技术