Spark(二)关于对Spark的误解

原文链接:https://0x0fff.com/spark-misconceptions/

这篇文章我主要将关于Spark的三大误解:
1、Spark是一种内存固化的技术
2、Spark比Hadoop快10-100倍
3、在数据分析市场,Spark创新地引进新的方法

Spark是一种内存固化的技术?

首先我们看最大的误解“Spark是一种内存固化的技术”,这种观点是错误的,而且没有任何官方的声明如此,这是谣言。

我们先从头开始。什么样的技术才能称为内存固化(in-memory)技术?在我看来,把数据固化(就像磁盘那样)到内存里然后高效地计算才能算内存技术(后面称为内存固化)。Spark并没有提供内存固化选项,它有基于HDFS,Tachyon,HBase,Cassandra等固化选项,但就是没有内存固化,甚至也没有本地磁盘固化的选项。除掉固化,它能做的就是缓存,缓存并非固化,缓存可以被轻易删除也可以轻易重新基于已固化的数据源重新计算出来。

接着,有些人开始抱怨上述信息,Spark是在内存中处理数据,关于这个说法,我想说的是任何数据的处理都要经过内存,CPU是无法直接处理磁盘的数据的。

基于Spark允许你使用基于LRU算法的内存缓存的事实,你可能仍会假设它就是内存固化技术,至少在数据能完全地放进内存种的情况下。但我们先离开主题把目光看向关系型数据库市场的两个案例:Oracle和PostgreSQL。你认为它们会怎样处理数据?它们使用共享内存端作为一个池来把表页放进去,所有的读写操作都是同通过这个池。这个池同样地也是使用LRU规则来淘汰non-dirty的表页。所以一般而言,现代数据库也是高效地利用内存缓存。但为什么我们不称这些数据库为内存固化解决方案呢?我们在看Linux的IO, 你知道其实这个操作系统也是利用基于LRU算法的缓存来支持IO操作的吗(把文件块缓存到内存)?

Spark(二)关于对Spark的误解

更多的,你是否认为Spark的所有transformation全部是在内存中执行的?如果是那你可能就要失望了,在Spark中有个关键技术叫“shuffle”,它会把数据写到磁盘上。 在SparkSQL查询中如果你有一个“group by”语句,或者想以key做聚合时,你将面临基于key的哈希值的数据重分布过程。“shuffle”过程包括两个阶段,称为map阶段和reduce阶段。在“Map”阶段,每个分区会输出N个文件,map通过计算每个key-value的key的哈希值,来决定每个kv存储在那个文件中。如果分区数量为M,则一共会生成M*N个文件。

所以综上所述,Spark并非一种内存固化技术,它只不过是让你透明地利用了基于内存的LRU技术。它也没有内置的固化功能(既没有内存的,也没有磁盘的)。然后在执行“shuffle”过程中,它还将数据集中的数据写到磁盘中。

Spark比Hadoop快10-100倍

你可能已经看过下图:
Spark(二)关于对Spark的误解

注意这种图跑的基准测试是LR,这篇文章已经讲到为什么快那么多的原因。

Spark执行短任务或许能比MR快100倍,至于生产环境的一般任务(非迭代,非短任务),我认为Spark最多也就快个2.5到3倍。

在数据分析市场,Spark创新地引进新的方法?

事实上,Spark没有引进任何革新。Spark之所以优秀是因为它实现了高效的LRU缓存以及数据处理管道,它并非唯一这样做的系统。它的实现和甚至概念都和已存在的MPP数据是异曲同工:查询执行管道化,没有中间数据,把表页放在LRUcache中。不过当然,Spark最大的贡献是它是开源的,能免费使用,对于那些没准备好部署MPP的企业是个好消息。

Spark(二)关于对Spark的误解

上一篇:Pytorch项目基本结构


下一篇:UOJ372【UR #17】滑稽树前做游戏【状压 dp,多项式】