Spark Standalone集群模式下如何通过spark-submit同时运行多作业?
Spark Standalone集群同时运行多应用问题解决
问题场景
通过以下步骤搭建Spark Standalone集群:
- 启动Master:
spark-class org.apache.spark.deploy.master.Master - 启动Worker:
spark-class org.apache.spark.deploy.worker.Worker spark://IP:PORT
提交第一个应用可正常运行:
spark-submit \ --class pack1.Maintest \ --master spark://IP:PORT \ --deploy-mode cluster \ Program_1.jar
但提交第二个应用时,即使额外启动Worker,应用仍处于等待状态:
spark-submit \ --class pack0.test2 \ --master spark://IP:PORT \ --deploy-mode cluster \ Program_2.jar
尝试过--detach参数及类YARN提交命令,均未解决,需实现集群模式下同时运行2-3个应用。
排查与解决步骤
1. 检查集群资源占用
通过Master Web UI(默认http://<Master_IP>:8080)查看:
- 各Worker的可用CPU核心、内存总量
- 已运行应用的资源占用情况
若第一个应用耗尽集群全部资源,新增Worker后需确认其资源是否被Master识别,同时检查第二个应用的资源请求是否在剩余资源范围内。
2. 限制单应用资源请求
提交应用时显式指定资源参数,避免单个应用占用全部集群资源,示例:
spark-submit \ --class pack0.test2 \ --master spark://IP:PORT \ --deploy-mode cluster \ --executor-cores 2 \ # 每个Executor占用2核 --executor-memory 2g \ # 每个Executor占用2G内存 --total-executor-cores 4 \ # 该应用最多占用4核 Program_2.jar
根据集群总资源调整参数,比如2个Worker各4核8G内存时,可给每个应用分配4核6G资源,实现同时运行2个应用。
3. 切换为FAIR调度模式
Spark Standalone默认使用FIFO调度器,会优先让第一个应用占用所有资源,后续应用排队。切换为FAIR调度器可实现多应用公平分配资源:
- 在Master节点的
spark/conf目录下创建(或修改)spark-defaults.conf,添加:
spark.scheduler.mode FAIR
- 重启Spark Master及所有Worker节点
- (可选)自定义资源分配规则:在
spark/conf下创建fairscheduler.xml,示例:
<?xml version="1.0"?> <allocations> <pool name="default"> <schedulingMode>FAIR</schedulingMode> <weight>1</weight> <minShare>2</minShare> </pool> <pool name="app-group-1"> <schedulingMode>FAIR</schedulingMode> <weight>2</weight> <minShare>3</minShare> </pool> </allocations>
提交应用时指定资源池:
spark-submit \ --class pack1.Maintest \ --master spark://IP:PORT \ --deploy-mode cluster \ --conf spark.scheduler.pool=app-group-1 \ Program_1.jar
4. 验证Worker节点状态
确认新增Worker已成功连接到Master,在Web UI的Workers列表中状态为ALIVE。若未连接,检查网络连通性及Worker启动命令中的Master地址是否正确。
5. 查看日志定位问题
查看Master节点spark/logs目录下的日志,或通过Web UI进入等待应用的详情页,排查是否存在资源不足、节点通信失败等具体报错信息。
内容的提问来源于stack exchange,提问作者zainab
相关产品推荐
相关产品推荐

