Spark的三大误解

    xiaoxiao2021-04-16  36

    一 Spark是一种内存技术 大家对Spark最大的误解就是其是一种内存技术。 什么样的才能称得上内存技术呢?就是润迅你将数据持久化在RAM(RAM-RamdomAccessMemory易挥发性随机存取存储器,高速存取,读写时间相等,且与地址无关,如计算机内存等)中并有效处理的技术。 然而Spark并不是具备将数据存储在RAM的选项,虽然我们知道可以将数据存储在HDFS、Tachyon,Hbase、Cassandra等系统张。但是数据不管是存在磁盘还是内存,都没有内置的持久化代码。它所能做的事就是缓存cache数据,而这个不是数据持久化。缓存很容易被删掉,后期需要时需重新计算。 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运行逻辑回归机器学习算法的时间比较,Spark可能比Hadoop快上百倍。事实上是怎样的呢? 大多数机器学习的核心部分就是对同一份数据集进行相同的迭代计算,而这个地方正是Spark的LRU算法所骄傲的地方。当你多次扫描相同的数据集时,你只需要在首次访问时加载到内存,后面的访问直接从内存中获取即可。二官方的Hadoop运行逻辑回归的时候很可能没用使用HDFS的缓存功能。如果Hadoop在运行逻辑回归的时候采用HDFS缓存功能,其表现可能只会比Spark差3x-4x,而不是100x。 一般来说Spark比MapReduce快的原因主要有以下几点: 1、task启动时间比较快,Spark是fork出线程,而MR是启动一个新的线程; 2、更快的shuffles,Spark只有在shuffle的时候才会将数据放在磁盘,而MR却不是 3、更快的工作流:典型的MR工作流是很多的MR作业组成的,他们之间的数据交互需要把数据持久化到磁盘才可以;而Spark支持DAG以及pipelining,在没有遇到shuffle完全可以不把数据缓存到磁盘。 4、缓存:虽然目前HDFS也支持缓存,但是一般来说,Spark的缓存功能更加高效,特别是在SparkSQL中,我们可以将数据以列的形式存储在内存中。 所有的这些原因才使得Spark相比Hadoop拥有好的性能表现,在比较短的作业确实能快上100倍,但是真实的生产环境下,一般只会快2.5x-3x!


    三 Spark在数据处理方面引入了全新的技术 事实上,Spark并没有引入任何革命性的新技术!其擅长的LRU缓存策略和数据的pipelining处理其实在MPP数据库中早就存在!Spark做出重要的一步就是使用开源的方式来实现它!并且企业可以免费使用它。大部分企业势必会选择开源的Spark技术,而不是付费的MPP技术。

    转载请注明原文地址: https://ju.6miu.com/read-672837.html

    最新回复(0)