当前位置: 首页>编程语言>正文

spark图像识别示例 spark图片



文/李萌

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

spark图像识别示例 spark图片,spark图像识别示例 spark图片_f分布表完整图,第1张

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

spark图像识别示例 spark图片,spark图像识别示例 spark图片_f分布表完整图_02,第2张

图2 RDD

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

spark图像识别示例 spark图片,spark图像识别示例 spark图片_f分布表完整图_03,第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所示。

spark图像识别示例 spark图片,spark图像识别示例 spark图片_f分布表完整图a=0.05_04,第4张

图4 RDD操作类型

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

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

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

表1 RDD的不同缓存级别

spark图像识别示例 spark图片,spark图像识别示例 spark图片_f分布表完整图a=0.05_05,第5张

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

spark图像识别示例 spark图片,spark图像识别示例 spark图片_f分布表完整图_06,第6张

图5 RDD的依赖关系

02

Spark计算框架

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

spark图像识别示例 spark图片,spark图像识别示例 spark图片_spark图像识别示例_07,第7张

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

spark图像识别示例 spark图片,spark图像识别示例 spark图片_spark图像识别示例_08,第8张

图7 DAGScheduler 

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

spark图像识别示例 spark图片,spark图像识别示例 spark图片_f分布表完整图a=0.05_09,第9张

图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://zhihu.com/question/51378885

spark图像识别示例 spark图片,spark图像识别示例 spark图片_spark图像识别示例_10,第10张


https://www.xamrdz.com/lan/5r51961772.html

相关文章: