在Spark三种常见的资源调度器,YARN、Mesos和Standalone中,最受欢迎的莫过于YARN。YARN与Hadoop原生集成,可以支持不同计算框架在Hadoop集群上的调度,这使得Spark on YARN无需改变配置就可以与MapReduce共享同一个资源池,避免了资源浪费,节省了开发成本。
提交到YARN上的任务称为Application,这与Spark的Application概念是相似的。每个Application需要有一个Application Master(下简称AM)代表它与Resource Manager协商资源以及与Node Manager管理分配给该Application的container。AM会在Application启动的时候自动分配,是Application占有的首个container,而其后AM申请的container上会运行Spark的executor。
实际上YARN on Spark有client和cluster两种模式,它们之间又有什么区别呢?
YARN-client模式
Spark Application的Driver会在提交作业的节点(也就是client)上运行,Spark Executor的调度由client上的Driver负责,所以整个运行时间client是一直需要和Spark集群保持链接的,各个executor的标准输出和错误输出都会打印到client的控制台。如果在Spark Application运行期间将client kill掉,那么Driver也会随之被kill,整个Spark Application就会停止运行。
YARN-cluster模式
Spark Application的Driver在AM内运行,也就是说AM不仅负责资源协商,也负责作业执行的调度。因为client提交Application之后就没有后续的任务了,进程自然退出,Application的运行日志可以在Spark AM的WebUI看到。如果要结束Spark Application,需要使用Hadoop yarn.sh的 application -kill [ApplicationID] 命令。
综上所述,yarn-client和yarn-cluster的不同在于Spark Driver在client运行还是在AM运行。yarn-client更适合调试或者需要交互的任务(比如Spark-shell),因为Driver标准IO是在client本地。而yarn-cluster更适用于生产任务,因为资源统一由YARN分配,不依赖于某台机器。
参考资料:
1.Apache Spark Resource Management and YARN App Models
2.Apache Spark探秘:三种分布式部署方式比较