Spark的误解-不只spark是内存计算,hadoop也是内存计算

       市面上有一些初学者的误解,他们拿spark和hadoop比较时就会说,Spark是内存计算,内存计算是spark的特性。请问在计算机领域,mysql,redis,ssh框架等等他们不是内存计算吗?依据冯诺依曼体系结构,有什么技术的程序不是在内存中运行,须要数据从硬盘中拉取,而后供cpu进行执行?全部说sprk的特色是内存计算至关于什么都没有说。那么spark的真正特色是什么?抛开spark的执行模型的方式,它的特色无非就是多个任务之间数据通讯不须要借助硬盘而是经过内存,大大提升了程序的执行效率。而hadoop因为自己的模型特色,多个任务之间数据通讯是必须借助硬盘落地的。那么spark的特色就是数据交互不会走硬盘。只能说多个任务的数据交互不走硬盘,可是sprk的shuffle过程和hadoop同样仍然必须走硬盘的。html

本文是翻译的出处 https://0x0fff.com/spark-misconceptions/。

原文和做者一块儿讨论:http://www.cnblogs.com/intsmaze/p/7197420.htmlmysql

微信:intsmazeredis

避免微信回复重复咨询问题,技术咨询请博客留言。算法

误解一:Spark是一种内存技术

  你们对Spark最大的误解就是spark一种内存技术。其实没有一个Spark开发者正式说明这个,这是对Spark计算过程的误解。Spark是内存计算没有错误,可是这并非它的特性,只是不少专家在介绍spark的特性时,简化后就成了spark是内存计算。sql

  什么样是内存技术?就是容许你将数据持久化在RAM中并有效处理的技术。然而Spark并不具有将数据数据存储在RAM的选项,虽然咱们都知道能够将数据存储在HDFS, HBase等系统中,可是不论是将数据存储在磁盘仍是内存,都没有内置的持久化代码。它所能作的事就是缓存数据,而这个并非数据持久化。已经缓存的数据能够很容易地被删除,而且在后期须要时从新计算。数据库

  可是有人仍是会认为Spark就是一种基于内存的技术,由于Spark是在内存中处理数据的。这固然是对的,由于咱们没法使用其余方式来处理数据。操做系统中的API都只能让你把数据从块设备加载到内存,而后计算完的结果再存储到块设备中。咱们没法直接在HDD设备上计算;因此现代系统中的全部处理基本上都是在内存中进行的。缓存

  虽然Spark容许咱们使用内存缓存以及LRU替换规则,可是你想一想如今的RDBMS系统,好比Oracle ,你认为它们是如何处理数据的?它们使用共享内存段做为table pages的存储池,全部的数据读取以及写入都是经过这个池的,这个存储池一样支持LRU替换规则;全部现代的数据库一样能够经过LRU策略来知足大多数需求。可是为何咱们并无把Oracle 称做是基于内存的解决方案呢?再想一想操做系统IO,你知道吗?全部的IO操做也是会用到LRU缓存技术的。微信

  Spark在内存中处理全部的操做吗?Spark的核心:shuffle,其就是将数据写入到磁盘的。shuffle的处理包括两个阶段:map 和 reduce。Map操做仅仅根据key计算其哈希值,并将数据存放到本地文件系统的不一样文件中,文件的个数一般是reduce端分区的个数;Reduce端会从 Map端拉取数据,并将这些数据合并到新的分区中。全部若是你的RDD有M个分区,而后你将其转换成N个分区的PairRDD,那么在shuffle阶段将会建立 M*N 个文件!虽然目前有些优化策略能够减小建立文件的个数,但这仍然没法改变每次进行shuffle操做的时候你须要将数据先写入到磁盘的事实!框架

 

因此结论是:Spark并非基于内存的技术!它实际上是一种能够有效地使用内存LRU策略的技术。ssh

误解二:Spark要比Hadoop快 10x-100x

  你们在Spark的官网确定看到了以下所示的图片

 

  这个图片是分别使用 Spark 和 Hadoop 运行逻辑回归(Logistic Regression)机器学习算法的运行时间比较,从上图能够看出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!

  吹一波水,最近太忙了,不只要克服竞争对手给的数据中埋的雷,还要不断和比利时的合做伙伴通邮件去核对项目的进度与解决方案。可是不妨碍我每个月更新一篇文章,-_-。

                                               老铁,点赞,关注

相关文章
相关标签/搜索