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

文/李萌

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。

f分布表完整图_分布式计算引擎之星——Spark相关推荐

  1. f分布表完整图_【教育统计答疑】如何理解正态分布、均值分布、^2分布、t分布和F分布...

    许多教育统计的初学者都表示这几个分布感到学起来非常吃力,结合最近上课的体会以及答疑的情况,觉得很有必要在这里简单地对这部分内容进行澄清和梳理,以助理解. 首先,"为什么要学习这几个分布&qu ...

  2. f分布表完整图_标准正态分布函数数值表怎么查?(加完整分布函数表)

    最近在整理数据时,忽然想到数理统计的其中一种分布,相信作为质量人一定不陌生,我们常常提到数据的分布是否服从正态分布,这是对一组连续数据分布一种描述,还会涉及到如何检验正态分布,对于这个分布的来龙去脉和 ...

  3. f分布表完整图a=0.01_建筑电气工程图的一般规定

    建筑工程图的格式与幅面尺寸 1.图纸格式 一张图纸的完整图面是由边框线.图框线.标题栏.会签栏等组成的,其格式如图1-1所示. 图1-1 图纸格式示例 (a)留装订边;(b)不留装订边 2.图纸幅面尺 ...

  4. f分布表完整图a=0.01_使用 Infer.NET 评价竞争对手

    Infer.NET 是开放源代码的代码库,可用于创建概率性编程系统.我往往会将普通的计算机程序视作,主要基于有指定类型的值的变量(如有值"Q"的 char 变量).概率性编程主要基 ...

  5. f分布表完整图a=0.05_MySQL8.0新特性-invisible indexes

    作者 李春·沃趣科技首席架构师 出品 沃趣科技 作者简介: 曾就职于阿里巴巴,全程参与阿里数据架构从Oracle迁移到MySQL过程,参与分布式中间件Cobar设计. | 导语 MySQL 8.0版本 ...

  6. f分布表完整图a=0.05_2019年05月16日,沪深A股股票分析

    纽约华尔街,伦敦金融城,Tier 1投行,我们希望撕掉标签,用数据说话. 欢迎您留言和赞赏,谢谢.一.整体分析 我们选取了沪深A股的股票,利用历史数据对超过60种交易策略进行了预测回测. 下表中列出了 ...

  7. f分布表完整图a=0.01_自动控制原理2.2.2传递函数零极点,零点如何影响输出响应曲线...

    2.传递函数零点和极点 传递函数分子多项式和分母多项式经因式分解后可写为如下形式: Zi是分子多项式零点,称为传递函数零点,Pj是分母多项式零点,称为传递函数极点.系数K*=b0/a0称为传递函数系数 ...

  8. f分布表完整图a=0.01_SQL Server从入门到精通——学习笔记01(数据库基础知识篇)...

    1.1 数据库的概念 数据库(DataBase,DB):是存放数据的仓库,只不过这些数据存在一定的关联,并按一定的格式存放在计算机上. 1.2 数据库管理系统 数据库管理系统(DataBase Man ...

  9. 如何利用EXCEL生成任意自由度任意显著因子的F分布表

    1.Excel软件中的FINV()函数.当已知自由度,求某累计概率所对应的F值时,可以使用Excel软件中的FINV()函数.有了此函数,即可省去查F分布表的麻烦.该函数的语法格式为:FINV(Pro ...

最新文章

  1. 重构一个功能块的总结
  2. TOPSIS(逼近理想解)算法原理详解与代码实现
  3. 操作系统 实验3【动态分区存储管理】
  4. 通道抠图--火焰,背景颜色统一为黑色
  5. MPAndroidChart——饼图
  6. Auto login to your computer
  7. Java反序列化漏洞研究
  8. Office报错:错误代码:30015-6(-1)
  9. EXCEL 制作下拉选项,限制输入内容范围
  10. linux访问samba命令,smbclient命令
  11. 网易2019校招笔试题-瞌睡
  12. python for ArcGIS 绘制重庆市板块地图
  13. 软件人才争夺战日趋白热化
  14. 在vue项目中引入高德地图并使用
  15. 【Java项目实战】CRM客户关系管理系统
  16. MAC-MAC-MAC-MAC
  17. c udp文件发送到服务器端,基于UDP的客户端和服务器端的代码设计
  18. android微信点赞ui,Android中使用PopupWindow 仿微信点赞和评论弹出
  19. 【更新中】人教版高一数学知识点汇总(必修1)
  20. Mysql的下载安装以及配置(超详细)

热门文章

  1. Android开发之EditText无法获取光标的问题
  2. 在控制台中输出 出现SIGBAT或者EXC_BAD_ACCESS的原因的方法
  3. UILocalNotification详解
  4. oracle如何改变连接属性,怎样设置navicate连接属性
  5. SpringMVC Root WebApplicationContext启动流程
  6. 【SIS-OAS 1.52.0】【C03-测试报告】常规版本回归测试报告-------回归测试报告模板...
  7. UI组件库从1到N开发心得-组件篇
  8. shell中函数返回值
  9. 在装好的xp系统里面如何添加新的硬件设备
  10. Spring 2.0技术手册 下载