spark troubleshotting之解决YARN队列资源不足导致的application直接失败

本文探讨了基于YARN提交Spark应用时可能遇到的资源分配问题,特别是在多作业并发执行场景下如何合理分配内存和CPU资源,提出了通过队列管理、作业调度及性能优化等策略解决资源竞争的问题。

现象:

如果,你是基于yarn来提交spark,比如yarn-cluster或者是yarn-client,你可以指定某个hadoop队列上的,每个队列都是有自己的资源的,

生产环境中,给spark用的yarn资源队列的情况:500G内存,200个cpu core

比如说,某个spark application,在spark-submit里面你自己配了,executor,80个,每个executor 4G内存,每个executor, 2个cpu core。你的spark作业每次运行大约消耗掉320G内存,以及160个cpu core

按计算来说,咱们的队列资源,是足够的,500G内存,200个cpu core

首先,第一点,你的spark作业实际运行起来以后,耗费掉的资源量,可能是比你在spark-submit里面配置的,以及你预期的,是要大一些的可能是400G内存,190个cpu core.

那么这是时候,的确,咱们的队列资源是还有一些剩余的,但是问题是,如果同时,你又提交了一个spark作业上去,那么就可能会出问题。

第二个spark作业,又要申请320G内存+160个cpu core.结果,发现队列资源不足

此时,可能会出现俩种情况,(具体出现哪中情况,跟版本,运维,配置都有关系)

1. Yarn 发现资源不足时,你的spark作业,并没有等待在那里,等待资源的分配,而是直接打印一行fail的log,直接fail掉了

2. Yarn 发现资源不足,你的spark作业,就等待在那里,一直等待之前的spark作业执行完,等待有资源分配给自己来执行

 

采用如下方案:

1. 在J2EE平台做一个限制,限制只能同时提交一个spark作业到yarn上去执行,确保一个spark作业的资源肯定是有的。

2. 你应该采用简单的调度区分的方式,比如,你的spark作业需要长时间运行,有的是短时间运行,此时,都提交到一个队列上去不合适,分队列,可以申请(跟你们的Yarn、Hadoop同学申请),给自己搞俩个调度队列,每个队列根据你要执行的作业情况来设置,在J2EE平台判断,如果是长时间作业,提交到一个队列,短时间提交到另一个队列

3. 你的队列里面,无论何时,只会有一个作业在里面运行,那么此时,就应该用我们的性能调优手段,去将每个队列能承受的最大的资源分配给你的每一个spark作业,

<think> 我们正在讨论如何提交Spark作业到YARN时指定队列。在YARN中,队列资源分配和调度的基本单位,通常由管理员配置多个队列以实现资源隔离和优先级控制。 提交Spark作业时,我们可以通过设置`spark.yarn.queue`属性来指定作业要提交到的队列。 以下是一个提交作业的示例命令: </think>### 提交 Spark 作业到 YARN 指定队列YARN 集群中提交 Spark 作业时,可以通过以下方式指定队列: #### 1. 使用 spark-submit 命令行参数 ```bash spark-submit \ --master yarn \ --deploy-mode cluster \ --queue production \ # 指定YARN队列 --driver-memory 4g \ --executor-memory 8g \ --num-executors 10 \ --class com.example.Main \ your-application.jar ``` **关键参数说明**: - `--queue`:直接指定 YARN 队列名称 - `-Dspark.yarn.queue=production`:等价的 Java 系统属性设置方式 #### 2. 在 Spark 代码中配置 在 Spark 应用程序初始化时设置队列: ```scala // Scala 代码示例 import org.apache.spark.SparkConf import org.apache.spark.sql.SparkSession object Main { def main(args: Array[String]): Unit = { val conf = new SparkConf() .setAppName("YARN Queue Demo") .setMaster("yarn") .set("spark.yarn.queue", "research") // 指定队列 .set("spark.executor.memory", "8g") val spark = SparkSession.builder() .config(conf) .getOrCreate() // 业务逻辑代码... spark.stop() } } ``` #### 3. 通过 spark-defaults.conf 配置文件 在 `$SPARK_HOME/conf/spark-defaults.conf` 中添加: ```properties spark.yarn.queue analytics spark.executor.memory 8g spark.executor.instances 5 ``` #### 4. 队列优先级示例 当需要根据作业类型动态选择队列时: ```bash #!/bin/bash # 根据作业类型选择队列 JOB_TYPE=$1 if [ "$JOB_TYPE" == "critical" ]; then QUEUE="prod_urgent" elif [ "$JOB_TYPE" == "batch" ]; then QUEUE="batch_processing" else QUEUE="default" fi spark-submit \ --master yarn \ --queue $QUEUE \ --class com.example.JobRunner \ app.jar ``` #### 5. 验证队列分配 提交后可以通过 YARN Web UI 或命令行验证: ```bash # 查看作业分配的队列 yarn application -list | grep "YourAppName" # 查看队列资源使用 yarn queue -status <queue_name> ``` #### 队列配置最佳实践 1. **队列命名规范**: - `prod_critical`:生产关键任务 - `dev_interactive`:开发交互式查询 - `batch_etl`:批量ETL作业 2. **容量调度器配置示例** (`capacity-scheduler.xml`): ```xml <property> <name>yarn.scheduler.capacity.root.queues</name> <value>prod, dev, batch</value> </property> <property> <name>yarn.scheduler.capacity.root.prod.capacity</name> <value>50</value> <!-- 50%资源 --> </property> <property> <name>yarn.scheduler.capacity.root.dev.capacity</name> <value>30</value> <!-- 30%资源 --> </property> ``` 3. **队列访问控制**: ```xml <property> <name>yarn.scheduler.capacity.root.prod.acl_submit_applications</name> <value>prod_team</value> <!-- 仅prod_team用户可提交 --> </property> ``` #### 常见问题排查 **错误:队列不存在或权限不足** ```log ERROR spark.SparkContext: Error initializing SparkContext. org.apache.hadoop.yarn.exceptions.YarnException: User 'dev_user' cannot submit applications to queue 'prod' ``` **解决方案**: 1. 检查队列名称拼写 2. 联系管理员添加用户到队列ACL: ```bash yarn queue -addUser <queue> <username> ```
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值