YARN集群部署Spark与Flink的三类技术疑问咨询
YARN集群上运行Spark与Flink的常见问题解答
问题1:部署Spark时,是否需要在ResourceManager及每个NodeManager上安装并配置Spark?
其实不用这么麻烦!Spark支持YARN客户端模式和YARN集群模式,两种模式都不需要在YARN的所有节点上全量安装Spark。你只需要在提交应用的机器上(可以是ResourceManager所在节点,也可以是集群外的客户端机器)安装配置好Spark即可。
当提交应用时,Spark会把需要的核心依赖包(比如spark-assembly.jar这类胖包)上传到YARN对应的HDFS路径或者本地共享存储,NodeManager会自动下载这些依赖来启动Executor进程。不过有个小前提:所有NodeManager节点得先装好Java环境,毕竟Spark是基于Java运行的,但Spark本身真的不用每个节点都装。
问题2:向YARN提交Spark应用时,除运行YARN的ResourceManager和NodeManager外,是否还需要运行Spark集群(Master和Slaves)?
完全不需要!当你把YARN作为Spark的资源管理器时,Spark自身的Master-Slaves集群架构就彻底没用了——YARN的ResourceManager会全权接管资源调度的工作,NodeManager负责具体的容器启动和运行。
Spark的Driver程序(客户端模式下在你提交作业的本地机器,集群模式下会在YARN分配的容器里运行)会直接向ResourceManager申请资源,RM分配好容器后,NodeManager就会启动Spark Executor进程。整个过程中,你根本不需要启动Spark自己的Master和Worker(Slaves)服务,YARN已经把资源管理的活儿全包了。
问题3:是否可以配置YARN,让Flink运行在特定的NodeManager上?
必须可以!有几种灵活的方式能实现这个需求,推荐按优先级选择:
- 节点标签(Node Labels):这是最常用也最优雅的方式。先给你指定的NodeManager节点打上专属标签(比如
flink-exclusive),然后在YARN的队列配置里把特定队列和这个标签绑定。提交Flink作业时指定该队列,YARN就只会把Flink的容器调度到带有对应标签的节点上。 - Flink提交参数直接指定:提交作业时,通过
yarn.application.node-label-expression参数直接声明要使用的节点标签,比如:./bin/flink run -m yarn-cluster -ynm my-flink-job -Dyarn.application.node-label-expression=flink-exclusive ./your-job.jar - 调度器节点亲和性配置:如果你用YARN的Capacity Scheduler或者Fair Scheduler,可以在调度器的配置文件里给目标队列设置节点亲和规则,绑定到特定NodeManager的IP或者主机名,不过这种方式灵活性不如节点标签。
内容的提问来源于stack exchange,提问作者Soheil Pourbafrani




