spark的作者Matei Zaharia在投稿其论文的时候,曾被reviewer批评不过是“in-memory hadoop”,而在博文中,博文作者(下文中“作者”均指代博文作者Alexey Grishchenko)又驳斥了下述三个流传甚广的结论:
- Spark is an in-memory technology
- Spark performs 10x-100x faster than Hadoop
- Spark introduces completely new approach for data processing on the market
下面,就针对这个“misconception”谈一谈个人的理解
对于in-memory这一点,先谈一点“佐证”的几点个人印象,spark中有*persist()*操作可以供选择是存储在内存或者是硬盘中,具体有以下几种选项(图来自《Spark快速大数据分析》):
hadoop中shuffle操作是需要将数据先写到磁盘中,后续操作再从磁盘中拉取数据到一个节点上。Spark也存在shuffle spill的现象,也就是说即使spark考虑将数据不先写到磁盘而是放到内存,庞大的数据量也不是内存容量能够放得下的。
如果spark的任何工程师都没有官方正式宣布(“none of the Spark developers officially states this”),那到底是什么给人们留下了这样一个"in-memory"的印象呢?
再来看博文作者的批驳依据:
- 首先,作者自身对“in-memory”中的定义是能够将数据持久化存储到RAM中,而认为spark没有内存中数据持久化的选项,RAM仅起到一个缓存的作用。
- 对于spark在内存中处理数据这一点,作者认为现代计算的存储分级结构下的任何程序都需要内存来缓存硬盘中的数据来处理。
- Oracle和PostgreSQL数据库使用共享内存缓存table page,此区域同样有针对non-dirty table page的LRU替换策略,像RDD谱系图一样设置checkpoint来防止页过多。所以为什么Oracle和PostgreSQL不被看作“in-memory”?
对于第一点,没有理解作者是否考虑了前文所述的persist操作,还是说作者认为这种操作也不算。第三点,数据库是有“in-memory”的形式的,与列存储同是数据库较前沿的发展技术,不过既然是想放到内存中,数据量是肯定不会太大。既然数据库都可以说是“in-memory”,spark应该也可以。这里笔者对“in-memory”的定义存疑,“in-memory”显然不会是存内计算类似的定义,分级存储和现有存储硬件技术决定了RAM容量不可能大,必然是缓存硬盘的内容,作者认为的持久化存储在内存中目前没有技术可以对应得上,最起码掉电的时候数据就会丢失,这是其一;其二,只对一部分数据能显示选择并缓存固定在RAM中,就已经可以了,作者的定义实属太严格了。
Spark performs 10x-100x faster than Hadoop这一部分,作者先分析了这种说法的由来。在Spark的主页上可以看到下图所示的结果,110相比于0.9能达到100x数量级上的提升,但是显然这是在logistic regression应用下的测评结果。而Spark的设计初衷就是针对可迭代(iterative)数据的复用,尤其适合机器学习领域。作者进一步抨击在得到下述结果时,采取了一些“tricky”,使用Hadoop的时候没有使用HDFS Cache机制,强行让本可以3到4倍的差距拉升到100倍以上。作者发出了感叹“***The long history of benchmarking in the enterprise space has taught me one thing: never trust the benchmarks.***”当然作者对TPC-H这样的独立机构还是嘴下留情了。
Spark能在Hadoop之后迅猛发展起来,肯定是有其原因的,基于开源和开发生态环境的构建。作者将Spark为什么快的原因归结如下:
Spark introduces completely new approach for data processing on the market
- Faster task startup time. Spark forks the thread, MR brings up a new JVM
- Faster shuffles. Spark puts the data on HDDs only once during shuffles, MR do it 2 times
- Faster workflows. Typical MR workflow is a series of MR jobs, each of which persists data to HDFS between iterations. Spark supports DAGs and pipelining, which allows it to execute complex workflows without intermediate data materialization (unless you need to “shuffle” it)
- Caching. It is doubtful because at the moment HDFS can also utilize the cache, but in general Spark cache is quite good, especially its SparkSQL part that caches the data in optimized column-oriented form
作者认为在Spark之前,Spark的很多机制早已经被其他架构提出过,spark不是全面革新。这一点可以从Spark 12年NSDI的论文里看出来,尤其是在介绍相关工作的时候,作者是明确写明了哪些技术源自哪里,并进行了一个对比。
最后,作者告诫诸位:
I would like to recommend you not to trust everything you hear from the media. Trust the subject matter experts, they are usually the best persons to ask.



