客户那边需要快速出一个版本,开发的这块使用到的之前没怎么用过,比如用oozie调度spark程序时候,你可能在你本地调试代码没有问题,上传到集群上之后,运行就出各种错,加上我们使用的服务器配置很差,导致各种服务需要的资源都不都用,然后每天就是在各种配置,话不多说了,赶紧来复习一下spark;
大概从以下几点进行说明:
1、Spark有哪些特点
2、Spark的部署方式有哪些?
3、Spark提交作业流程?
Spark有哪些特点?
Spark有速度快、容错性高、通用性强、兼容性强等特点;
速度快
我们先来说一下rdd,rdd 全英文 Resilient Distributed Datasets。
Resilient:能复原的,弹回的,有弹性的。谈谈spark的内存机制,spark的内存整体分为堆内内存和堆外内存,而在内存的使用上又分为数据内存和运行内存,就是数据存储和程序运行。
Distributed 分布式,就指的是spark的partition,spark就是将一整块特别大的数据按照一定规则分到各个机器上,然后将代码也发送过去,每个分区执行完逻辑后,最后将结果汇总到一块就是最终的结果。
Datasets spark的数据处理快还要得益于它的数据的处理方式,就像早上坐地铁一样,大家排队上地铁,坐满之后等待下一个地铁过来,下一个地铁过来大家再坐上去,以此类推,也是它为什么称为pipeline处理方式。但是要注意的是,并不是每处理完一个rdd就交给这个下一个节点,一般是小批量的方式传递,这一般也是优化考虑的地方。
每一个rdd, 不管它经历了多少个算子,rdd只用来存储他们之间的关系,这样spark就会知道他的来龙去脉,当出现问题的时候,很容易根据记录的关系(r又称为“血缘关系”)重新计算出数据。
Spark把运算过程中间的数据(如:shuffle阶段产生的数据存放在内存,这样迭代计算效率会更高);在计算时,为了节省内存,不把所有的数据一次全部加载到内存中,有一种设计模式叫迭代器模式。
Spark RDD迭代器模式是什么呢?
迭代器模式:在逻辑代码执行时,真正的逻辑并未执行,而是创建了新的迭代器,新的迭代器保存着对当前迭代器的引用从而形成链表,每个迭代器需要实现hasNext(),next()两个方法。当触发计算时,最后一个创建的迭代器会调用next方法,next方法会调用父迭代器的next方法。而且rdd之间是串联的关系,在一块就称为迭代器串联;
容错性高
相邻的两个RDD的关系称之为依赖关系,新的RDD依赖于旧的RDD,多个连续的RDD的依赖关系,称之为血缘关系;每个RDD会保存血缘关系,但每个RDD不会保存数据,如果在reduceByKey过程中出现错误时,由于RDD2不会保存数据,但可以根据血缘关系将数据源重新读取进行计算;黄色区域就是每个RDD保存的血缘关系,reducrByKey出现错误后,会根据RDD2存储的血缘关系重新计算。
通用性:
以Spark为基础建立起来的模块(库)有Spark SQL,Spark Streaming,MLlib和GraphX。我们可以很容易地在同一个应用中将这些库结合起来使用,以满足我们的实际需求。并且提供了transformation和action这两大类的多功能api。
兼容性:
Spark任务支持多种调度方式包括Yarn、mesos、Standalone等。可通过Spark直接对接大数据生态中Hbase、Hdfs、Kafka等多种数据源。
Spark的部署方式有哪些?
Spark有以下四种部署方式,分别是:Local,Standalone,Yarn,Mesos
本地模式(Local)
该模式运行任务不会提交在集群中,只在本节点执行,有两种情况:
本地模式: 测试或实验性质的本地运行模式 (单机)
运行该模式非常简单,只需要把Spark的安装包解压后,改一些常用的配置即可使用,而不用启动Spark的Master、Worker守护进程( 只有集群的Standalone方式时,才需要这两个角色),也不用启动Hadoop的各服务(除非你要用到HDFS)。
Spark不一定非要跑在hadoop集群,可以在本地,起多个线程的方式来指定。将Spark应用以多线程的方式直接运行在本地,一般都是为了方便调试,本地单机模式分三类:
local:只启动一个executor
local[k]:启动k个executor
local[*]:启动跟cpu数目相同的 executor
Yarn
通常,生产环境中,我们是把Spark程序在YARN中执行。而Spark程序在YARN中运行有两种模式,一种是Cluster模式、一种是Client模式。这两种模式的关键区别就在于Spark的driver是运行在什么地方。
client模式:
1、spark-submit脚本提交,Driver在客户端本地运行;
2、Client向RM申请启动AM,同时在SC(client上)中创建DAGScheduler和TaskScheduler。
3、RM收到请求之后,查询NM并选择其中一个,分配container,并在container中开启AM
4、client中的SC初始化完成之后,与AM进行通信,向RM注册,根据任务信息向RM申请资源
5、AM申请到资源之后,与AM进行通信,要求在它申请的container中开启CoarseGrainedExecutorBackend(executor)。Executor在启动之后会向SC注册并申请task
6、SC分配task给executor,executor执行任务并向Driver(运行在client之上的)汇报,以便客户端可以随时监控任务的运行状态
7、任务运行完成之后,client的SC向RM注销自己并关闭自己
cluster模式:
1、spark-submit脚本提交,向yarn(RM)中提交ApplicationMaster程序、AM启动的命令和需要在Executor中运行的程序等
2、RM收到请求之后,选择一个NM,在其上开启一个container,在container中开启AM,并在AM中完成SC的初始化
3、SC向RM注册并请求资源,这样用户可以在RM中查看任务的运行情况。RM根据请求采用轮询的方式和RPC协议向各个NM申请资源并监控任务的运行状况直到结束
4、AM申请到资源之后,与对应的NM进行通信,要求在其上获取到的Container中开启CoarseGrainedExecutorBackend(executor), executor 开启之后,向AM中的SC注册并申请task
5、AM中的SC分配task给executor,executor运行task并向AM中的SC汇报自己的状态和进度
6、应用程序完成之后(各个task都完成之后),AM向RM申请注销自己并关闭自己;
Standalone独立模式
自带完整的服务,可单独部署到一个集群中,无需依赖任何其他资源管理系统。它是Spark实现的资源调度框架,其主要的节点有Client节点、Master节点和Worker节点;
在standalone部署模式下又分为client模式和cluster模式
client模式:driver和client运行于同一JVM中,不在worker上启动,该JVM进程直到spark application计算完成返回结果后才退出;
cluster模式:driver由worker启动,client在确认spark application成功提交给cluster后直接退出,并不等待spark application运行结果返回;
总结:
yarn-cluster本地进程则仅仅只是一个client,它会优先向yarn申请AppMaster资源运行AppMaster,在运行AppMaster的时候通过反射启动Driver(我们的应用代码),在SparkContext初始化成功后,再向yarn注册自己并申请Executor资源,此时Driver与AppMaster运行在同一个container里,是两个不同的线程,当Driver运行完毕,AppMaster会释放资源并注销自己。所以在该模式下如果结束了该进程,整个Spark任务也不会退出,因为Driver是在远程运行的;
如果是Client模式,Driver就运行在提交spark程序的地方,Spark Driver是需要不断与任务运行的Container交互的,所以运行Driver的client是必须在网络中可用的,直到应用程序结束。在本地环境测试的时候经常使用;
Spark on Yarn作业提交流程
YARN Client模式
在YARN Client模式下,Driver在任务提交的本地机器上运行,Driver启动后会和ResourceManager通讯申请启动ApplicationMaster,随后ResourceManager分配container,在合适的NodeManager上启动ApplicationMaster,此时的ApplicationMaster的功能相当于一个ExecutorLaucher,只负责向ResourceManager申请Executor内存。
ResourceManager接到ApplicationMaster的资源申请后会分配container,然后ApplicationMaster在资源分配指定的NodeManager上启动Executor进程,Executor进程启动后会向Driver反向注册,Executor全部注册完成后Driver开始执行main函数,之后执行到Action算子时,触发一个job,并根据宽依赖开始划分stage,每个stage生成对应的taskSet,之后将task分发到各个Executor上执行。
YARN Cluster模式
在YARN Cluster模式下,任务提交后会和ResourceManager通讯申请启动ApplicationMaster,随后ResourceManager分配container,在合适的NodeManager上启动ApplicationMaster,此时的ApplicationMaster就是Driver。
Driver启动后向ResourceManager申请Executor内存,ResourceManager接到ApplicationMaster的资源申请后会分配container,然后在合适的NodeManager上启动Executor进程,Executor进程启动后会向Driver反向注册,Executor全部注册完成后Driver开始执行main函数,之后执行到Action算子时,触发一个job,并根据宽依赖开始划分stage,每个stage生成对应的taskSet,之后将task分发到各个Executor上执行。