点击上方“数风云”关注我们吧

文/李萌

Spark作为分布式计算引擎的一颗璀璨之星,继承了MapReduce分布式并行计算的优点,并改进了MapReduce明显的缺陷。它使用一种面向对象、函数式编程语言Scala来实现,能够像操作本地集合对象一样轻松地操作分布式数据集,具有运行速度快、易用性好、通用性强、兼容性好等诸多优点。

图1.大数据生态

从整个大数据生态来看,Spark和MapReduce同为大数据计算框架,但是Spark的产生是基于MapReduce几个明显缺陷:

(1)MapReduce仅支持Map和Reduce两种操作;

(2)MapReduce是基于进程的计算,任务调度和启动开销大。此外Map中间结果要落地到磁盘,网络I/O和磁盘I/O十分频繁,延迟高,处理效率低,无法充分利用内存;

(3)Map端和Reduce端均需要排序,耗费时间;

(4)不适合迭代计算(如机器学习、图计算等),交互式处理(数据挖掘)和流式处理(点击日志分析),无法满足实时性较高的业务;

(5)编程不够灵活,因其是用 Java 编写的,编写一个完整的MapReduce任务代码的数据行数要远远大于Spark实现相同的功能。

基于MapReduce的这些缺陷,Spark做了很多改进。

首先是把计算过程的一些中间数据放到了内存中,中间结果可以不落地,减少了磁盘IO,提升了性能。但这并不能说Spark就是内存计算,MapReduce也是要把数据放到内存计算,也具备将数据文件缓存到内存的策略,然后写到磁盘的。

Spark并不具备将数据存储在RAM的选项,它所能做的事就是在内存中缓存数据,而这个并不是数据持久化。Spark允许我们使用内存缓存以及LRU替换规则,因此从本质上说,Spark是一种有效使用内存LRU策略的技术。

Spark是如何提高性能并兼具如此多的优点,它能完全取代MapReduce吗? 我们从以下几个方面来探讨一下。

01

什么是RDD

提到Spark,不得不说的是RDD (Resilient Distributed Dataset)——弹性分布式数据集,从本质上说它是一种只读的、分区记录的集合,一个不可变的分布式对象集合。如图2所示,每个RDD都被分为多个分区,这些分区运行在集群的不同节点上。我们可以通过读取文本文件、HDFS、数据库、内存等创建一个RDD。

图2 RDD

为什么说RDD是弹性的呢?是因为每个RDD都可以按照分区被读入内存和磁盘,并能在内存和磁盘之间手动或自动切换,如图3所示。

图3 RDD转化

可能我们还会有疑问,既然RDD是只读的不可改变的,那计算过程中如何改变RDD的值呢?RDD可以通过转换成其他的RDD,跟人类之间的血缘关系一样。

对RDD有两种类型的操作,一个是转化 (Transformation),比如过滤,把数据集中的每个元素都乘以2,变成一个新的RDD,就像数学中的函数f(x)一样,可以把f(x)作用于一个RDD,映射成一个新的RDD。

这种转换是惰性执行的,也就是说从一个RDD 转换生成另一个 RDD 的转换操作不是马上执行,需要等到有 Action 操作的时候才会真正触发运算。Action操作是数据执行部分,其通过执行count,reduce,collect等方法真正执行数据的计算部分。它会触发 Spark提交作业(Job),并将数据输出 Spark系统,返回的类型是一个其他的数据类型RDD,如图4所示。

图4 RDD操作类型

在实际应用中,我们可能会多次使用同一个RDD,如果简单地对 RDD 调用Action操作,Spark每次都会重新计算RDD及相关依赖,这样就会带来太大的消耗。

为了避免多次计算同一个RDD,可以对数据进行持久化,调用persist和cache方法将SparkRDD缓存到内存、磁盘文件系统中。这样缓存的 RDD 在使用时,存取速度会被大大提高。

一般情况下,Executor内存的60%会分配给Cache,剩下的40% 用来执行任务。cache方法可以将RDD缓存到内存中,persist可以让用户根据需求指定一个持久化级别,如下表所示。我们可以根据具体场景来对RDD设置不同的缓存级别。

表1 RDD的不同缓存级别

此外,根据RDD之间的转换关系,还定义了宽依赖(Wide Dependency)和窄依赖(Narrow Dependency)。宽依赖是指每个父RDD的分区会被多个子RDD分区所使用,也就是说一个父亲会有多个孩子;窄依赖是指每个父RDD分区只有一个子RDD,相当于是独生子女。RDD的依赖关系是后面划分任务阶段的重要依据。

图5 RDD的依赖关系

02

Spark计算框架

理解了RDD的原理和机制,我们来看一下Spark框架,以及Spark是如何基于RDD执行任务的呢?

图6 Spark计算框架

Spark中设立了资源管理器(Cluster Manager),来负责资源申请和管理在运行节点 Worker Node 上运行应用所需的资源。每一个Spark应用都会创建一个驱动器程序Driver Program, 它通过运行SparkContext对象来访问Spark。

SparkContext对象代表着对计算集群的连接,可以认为就是main运行的地方,可以进行RDD的初始化,向Cluster Manager申请任务运行的资源。Worker Node是真正工作的节点,Executor是Worker Node上的一个进程,负责准备Task环境和执行Task,负责内存和磁盘的使用,一个Executor对应一个具体的任务Task。

03

Spark执行过程

当一个应用提交到Spark集群,会有多个计算算子,也就是多个Job,每个Job会对应创建Driver构建Spark应用的运行环境,启动SparkContext上下文。

SparkContext作为DriverProgram的核心,做了很多工作,所有与Cluster、Worker Node交互的操作都需要SparkContext来完成。其中DAGScheduler负责分析用户提交的应用,根据输入的RDD,创建一个有向无环图。同时根据RDD组成的有向无环图之间的宽窄依赖划分成不同的阶段Stage, 遇到宽依赖,就划分出一个Stage,每个Stage由若干个Task组成。

图7 DAGScheduler

Stage划分完毕,DAGScheduler最终提交给任务调度器TaskScheduler 的是一个含有多个Task的集合。TaskScheduler会根据一定策略(先进先出、公平策略等)将这些任务集合提交到TaskManager运行。Task在Executor上运行完释放所有资源。

图8 任务执行流程

04

Spark运行模式

Spark目前有四种运行模式,Local模式、Standalone模式、Spark on Mesos模式以及Spark on Yarn模式。

Local本地模式主要用于开发、测试代码功能时使用。Standalone独立模式,自带完整的服务,可单独部署到一个集群中,无需依赖任何其他资源管理系统。如果我们只想在一堆机器上运行Spark,独立模式是部署集群最简单的方法。

但是如果需要与其他的分布式应用共享集群时,比如既可以运行Spark作业又可以运行MapReduce作业,就需要运行在集群管理器上。

官方推荐运行在Mesos之上,除了血缘关系的原因,由于Spark开发之初就考虑到支持Mesos,因此,Spark运行在Mesos上会比运行在Yarn上更加灵活,更加自然。但是在实际应用中,为了让Spark更快速的访问HDFS中的数据,运行在Yarn上也非常有意义,是一种很有前景的部署模式。

05

Spark生态

Spark生态圈是伯克利APMLab实验室打造的,涉及到机器学习、数据挖掘、数据库、信息检索、自然语言处理和语音识别等多个领域。包含SparkCore、SparkSQL、SparkStreaming、MLlib和GraphX等组件,能无缝集成并提供一站式解决方案。

06

Spark能完全取代MapReduce吗?

Spark替代MapReduce的讨论已经屡见不鲜了,Spark在任何情况下均比MapReduce高效吗?答案是否定的。Spark并不是在任何情况下都比MapReduce高效的,我们要根据不同的应用场景择优选择。

当做一个简单的数据转换,且只需要Map操作时,MapReduce的处理效率要比Spark高,相对而言Spark预处理和启动的成本比较高。当遇到确实非常大的数据以至于无法完全读入内存,又或是依靠着大量对该平台有经验的技术人员,它可能会比 Spark 更加高效。

在资源处理上,MapReduce的资源申请是以Task为粒度的,在处理完Task后会立即释放资源;而Spark Executor是粗粒度的资源分配模式,在完成任务处理后并不会关闭,继续等待后续任务的处理,资源不能得到释放。

在安全性上,此时的 Spark还略显不足。MapReduce 拥有所有 Hadoop 支持的安全机制,但是如果Spark运行在Yarn上并配合使用HDFS的话,需要具备HDFS文件许可机制和节点间的加密机制。

总之,Spark作为一颗冉冉升起的新星,正在蓬勃发展,应用非常广泛,目前已经推出3.0版本,开发了更多新的功能,赋予我们更强大处理数据的能力,值得我们每个IT人去研究学习。

参考文献

http://spark.apache.org/

http://cnblogs.com/intsmaze/p/7197420.html

http://zhihu.com/question/51378885

顾问:许国平 李湘宜

赵晓玲 张刚

总编:孙鹏晖

美编:白羽

-本文为“数风云”第8期文章;

-转载本公众号文章请联系我们;

-欢迎来稿:请按“题目-作者”格式命名发送到sunpenghui@abchina.com。

优点 spark_分布式计算引擎之星——Spark相关推荐

  1. f分布表完整图_分布式计算引擎之星——Spark

    点击上方"数风云"关注我们吧 文/李萌 Spark作为分布式计算引擎的一颗璀璨之星,继承了MapReduce分布式并行计算的优点,并改进了MapReduce明显的缺陷.它使用一种面 ...

  2. 分布式计算引擎MapReduce

    应用场景 当数据量大到一定程度,传统的技术无法进行解决的时候,那么需要采用分布式计算引擎MapReduce来尝试解决了! 操作步骤 1. 架构图 Hadoop是由Apache基金会所开发的分布式系统基 ...

  3. 大数据理论与实践5 分布式计算框架MapReduce和Spark

    MapReduce和Spark MapReduce 简介 原理示例 基本概念 作业运行模式 Spark 简介 概念 编程模型 RDD RDD操作(Operator) RDD依赖(Dependency) ...

  4. 两款高性能并行计算引擎Storm和Spark比较

    2019独角兽企业重金招聘Python工程师标准>>> Spark基于这样的理念,当数据庞大时,把计算过程传递给数据要比把数据传递给计算过程要更富效率.每个节点存储(或缓存)它的数据 ...

  5. php 模板引擎 优点,Smarty模板引擎的优点

    Smarty模板引擎的优点 时间:2015-11-17 对PHP语言熟悉的程序员就会知道有个Smarty的名词,那么这个具体是什么呢?smarty是一个使用PHP编写的PHP模板引擎,是目前业务最著名 ...

  6. php中smarty模板的优点,Smarty模板引擎的优点

    Smarty模板引擎的优点 对PHP语言熟悉的程序员就会知道有个Smarty的名词,那么这个具体是什么呢?smarty是一个使用PHP编写的PHP模板引擎,是目前业务最著名,功能最强大的一种PHP模板 ...

  7. mllib逻辑回归 spark_大数据技术之Spark mllib 逻辑回归

    本篇教程探讨了大数据技术之Spark mllib 逻辑回归,希望阅读本篇文章以后大家有所收获,帮助大家对大数据技术的理解更加深入. 逻辑回归 逻辑回归其实是一个分类算法而不是回归算法.通常是利用已知的 ...

  8. 成为国产大数据基础软件第一股的星环科技,未来发展空间几何? | 爱分析调研

    10月18日,星环科技正式登陆科创板,成为国产大数据基础软件第一股.这一事件不仅代表了星环科技这家公司取得的阶段性成就,也标志着在当前数字化转型以及信创建设持续推进的背景下,国产大数据基础软件已驶入了 ...

  9. 有哪些大数据处理工具?

    简介:近几年里,大数据行业发展势头迅猛,故而相应的分布式产品和架构层出不穷,本文分享作者在大数据系统实践过程中接触过的一些工具及使用感受,抛砖引玉,和同学们一起构建一个分布式产品的全景图. 下图是由著 ...

  10. 盘点 | 有哪些大数据处理工具?

    导读:近几年里,大数据行业发展势头迅猛,故而相应的分布式产品和架构层出不穷,本文分享作者在大数据系统实践过程中接触过的一些工具及使用感受,抛砖引玉,和同学们一起构建一个分布式产品的全景图. 下图是由著 ...

最新文章

  1. Blender3.0动画制作入门学习教程 Learn Animation with Blender (2021)
  2. Chapter 17 高级进程间通信
  3. FreeBSD没有安装Ports的解决办法
  4. shell脚本发邮件内容html,[转]Shell脚本中发送html邮件的方法
  5. Linux 命令之 curl -- 文件传输工具/下载工具/网络接口调试
  6. linux一台机器如何安装两个mysql,在一台linux机器上启动两个mysql实例
  7. 问题 L: 求一元二次方程的根
  8. 20191128每日一句感恩节
  9. ubuntu 14安装droidcam调用手机摄像头
  10. 如何利用Python网络爬虫抓取微信好友数量以及微信好友的男女比例
  11. 流程图软件Visio的使用笔记
  12. 威胁快报|Nexus Repository Manager 3新漏洞已被用于挖矿木马传播,建议用户尽快修复...
  13. 尺缩钟慢之动钟变慢——思想实验推导狭义相对论(七)
  14. 郑捷《机器学习算法原理与编程实践》学习笔记(第三章 决策树的发展)(二)_C4.5...
  15. 数据结构-C语言代码 day6-栈及其应用
  16. Java学习笔记之 Lambda表达式
  17. FlexPaper+SWFTools 实现仿百度文库及一些小问题
  18. curl: (60) Peer‘s Certificate issuer is not recognized
  19. ISO、光圈、曝光、焦距
  20. java-se项目--嗖嗖移动

热门文章

  1. Apache优化配置
  2. 小技巧:如何在 js 中使用 apply 语法执行 new?
  3. PHP Smarty增删改查(考试题库)
  4. linux早期内核的khttpd服务器--策略污染机制
  5. 80.共享内存实现进程通信
  6. python基础(初识Python)
  7. Win32程序和控制台应用程序的项目互转设置
  8. Gravatar是什么?全球通用头像简单介绍与使用教程
  9. 为什么败者树的访问外存次数要比胜者树少_为什么说蒙地卡罗搜索树MCTS是AlphaZero的核心?[AlphaZero理论篇之三]...
  10. java的基本数据类型有什么特点_【Java】常用数据类型及其特点(万物都是变量)...