YARN
Yarn 是一个操作系统级别的统一的资源管理和调度框架
多种计算框架可以通过Yarn共享集群资源,按需分配 ==> 可以提升资源的利用率
Yarn上可以跑:
批处理作业(MR)
交互式INTERACTIVE(Tez)
ONLINE (HBASE)
Streaming (Storm/Flink)
In-Memory (Spark)
Spark on YARN执行流程
- Client端将任务提交到YARN的RM中的ApplicationsManager,这其中包含Driver程序和启动命令;
- ApplicationsManager会找一个NodeManager来分配第一个Container容器,用来启动ApplicationMaster程序,ApplicationMaster启动Driver。启动之后Application会向ApplicationsManager注册,汇报已经创建成功,这时可以从WebUI来观测整个App的运行情况;
- ApplicationMaster会向ResourceManager的ResourceScheduler以轮询的方式申请资源(所谓轮询是指:如果集群资源不够,会先拿部分资源来运行,运行完之后释放container再执行),申请到资源并拿到资源列表,ApplicationMaster会到对应的NodeManager上去要求分配Container,继而启动Executor分配各种Task。
- AppMaster会一直监测各个Executor的执行情况,如果挂掉会进行重跑;
- 当所有的Executor执行完任务,AppMaster会向ApplicationsManager注销并关闭自己。
MR 与 Spark作业对比
- MR: base-process
each task in its process: MapTask,ReduceTask process
when a task completes,the process goes away - Spark: base-thread
many tasks can run concurrently in a single process (executor)
一个Executor进程可以跑多个Task(这几个Task是并行计算的)
this process sticks around for the lifetime of the Spark Application
lifetime of the Spark Application:
整个Spark Application包括一个driver和多个Executor
一个程序起来以后,即使是没有job运行,Executor还是存在的
基于线程比基于进程的好处:
3. MapReduce启动,因为都是进程,启动时资源都需要申请,结束后需要销毁
4. Spark在申请到Executor之后,所有的task可以直接启动,不需要再去申请资源,这样省去了很多时间。
Cluster Manage
Spark Application ==> CM (Local,Standalone,Yarn,Mesos,K8S==> Pluggable 可插拔的)
Application Master :AM
每一个YARN Application 都会有AM (first container)
Executor runs in container ===> (memory of container > Executor memory)
Spark在YARN模式下仅仅是一个客户端
Spark on Yarn 中,Spark仅仅只是一个客户端而已,不需要装一个集群:
提交Spark作业的这台机器必须是有GATEWAY权限的机器,只要能访问到Hadoop的配置文件就可以了。跑Yarn的时候,只需要这台机器作为客户端就可以了,并不需要slaves那些东西,所以 Spark on Yarn 仅仅只需要一台客户端。不需要 spark 节点 ,不需要 start-master.sh,start-slaves.sh,不需要在那些节点上起任何的Spark的进程。生产上95%都跑在Yarn上的。
工作上,只要GATEWAY+spark-submit就可以了,不需要起别的任何的进程
Deploy Mode
Spark的部署模式分为 Cluster 和 Client
-
Client
the Spark driver runs in the client process,AM is only used for requesting resources;
由于AM只是需要申请资源,driver跑在本地,所以需要client监测并调度各个节点的任务,所以Client不能停掉;
适用于交互、调试,希望立即看到 app 的输出,Cluster模式看日志比较麻烦,因为不知道AM运行在那个节点上;
默认是client模式 -
Cluster
the Spark driver runs inside an ApplicationMaster process which is managed by YARN;
the Client can go away after initiating the application
适用于生产环境
ApplicationMaster:在client模式中只是申请资源的;在 cluster模式中既申请资源又调度task。
实例
export HADOOP_CONF_DIR=/home/hadoop/software/hadoop-xxxx/etc/hadoop
./spark-shell --master yarn
--deploy-mode DEPLOY_MODE 默认是client,所以这个启动模式时client模式;
注意,这里不能使用cluster模式,会报错:
Error: Cluster deploy mode is not applicable to Spark shells.
因为spark-shell作为一个与用户交互的命令行,必须将Driver运行在本地,而不是yarn上
--num-executors NUM 指定YARN模式下启动多少个Executor 默认是2个Executor
在WebUI中,显示 RunningContainer为3,AllocatedCPU VCores为3
RunningContainer为3是因为driver占用一个Container加上默认的2个Executor各自占用一个Container,所以是占用3个Container;
而默认一个Container占用一个虚拟Core,所以AllocatedCPU VCores为3。