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

d1c44ca044309e2edfab01ef4c1d5ed9.png点击上方“数风云”关注我们吧 98c3e5e5f84e9002dc8dac2764fa082f.png

文/李萌

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

469d36cc08f34c9b86d01ccd2bf9a6a9.png

图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。

545d886114ad7f5ff7a79eb6515bc218.png

图2 RDD

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

b93de0f6576acc73f6e666fe1be21822.png

图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所示。

cb0f822c61ceece8572444e83a1caf3b.png

图4 RDD操作类型

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

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

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

表1 RDD的不同缓存级别

39e27e223374f4fdade098ad36104482.png

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

cb82611a57fcaeca35b683c1d61f27a5.png

图5 RDD的依赖关系

02

Spark计算框架

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

205871ecbe2327ea271fa21619be5c66.png

图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。

0 3

Spark执行过程

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

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

42d822611a105ad909063e9e47763488.png

图7 DAGScheduler 

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

b24ca722f7becdfc06eecc960854eecc.png

图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人去研究学习。

122d27cfa72239afb63025b59203a69f.png参考文献

http://spark.apache.org/ 

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

http://zhihu.com/question/51378885

0f4f73ada94c795624c74a38727da03e.png 1ec0b7fbb2f6c40eec36532373a11c47.png

顾问:许国平 李湘宜

     赵晓玲 张刚

总编:孙鹏晖

美编:白羽

72b92a19f4028b95e3bc0cc4905ab834.png

de058b6e805c3b13e685c86f4ba38e0e.png

1ec0b7fbb2f6c40eec36532373a11c47.png

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

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

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

72b92a19f4028b95e3bc0cc4905ab834.png
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值