单个HIVE查询是否会创建多个YARN应用?Spark运行场景相关疑问
单个Hive on Spark查询生成多个YARN应用的原因说明
首先可以明确:单个Hive查询在Spark引擎运行时,确实有可能生成多个YARN应用,自连接场景是非常典型的触发情况,具体原因和触发逻辑如下:
- Spark提交任务的底层逻辑:Spark on YARN默认会为每个SparkSession创建独立的YARN应用,但如果查询的执行计划被拆分为多个独立的Spark Job批次,且批次之间需要释放资源重新调度、或者遇到需要重启SparkContext的场景时,就会启动新的YARN应用。
- 自连接的特殊触发逻辑:当自连接涉及的表数据量过大、或者存在
笛卡尔积自连接、多阶段聚合嵌套自连接的情况时,Hive的SQL解析器会将整个查询拆分为多个互不依赖的执行阶段,每个阶段会单独提交Spark任务,对应独立的YARN应用。 - 常见的其他触发场景:
- 查询包含多个互不关联的UNION分支,且分支数据量超过
spark.sql.shuffle.partitions的阈值 - 开启了
spark.dynamicAllocation且空闲资源释放阈值设置过小,前序阶段执行完后资源被回收,后序阶段需要重新申请资源启动新的YARN应用 - 查询中包含多次
INSERT INTO/INSERT OVERWRITE写入不同分区/表的逻辑
- 查询包含多个互不关联的UNION分支,且分支数据量超过
如果要限制单个查询只能生成一个YARN应用,可以调整以下参数:
# 关闭执行计划的多阶段拆分提交 set spark.sql.hive.mergeMultipleSparkJobs=true; # 调大动态分配的空闲资源保留时间 set spark.dynamicAllocation.executorIdleTimeout=300s;
注意:如果自连接逻辑本身存在数据倾斜或者笛卡尔积,强制合并任务可能会导致单应用内存溢出,需要结合实际业务SQL优化后再调整参数。
内容的提问来源于stack exchange,提问作者M Michael
相关产品推荐
相关产品推荐

