运行中的EMR集群提交Spark任务后多久能执行业务逻辑?
现有无负载的运行态EMR集群,经过合理配置后,完全可以做到提交Spark任务后几秒内启动业务逻辑。下面对应你的三个疑问逐一解答:
1. spark-submit执行到业务逻辑启动的完整步骤
- 本地参数校验:
spark-submit命令首先在提交节点本地解析传入的配置参数、依赖路径、主类信息等,校验参数合法性 - 集群资源申请:向EMR默认的YARN资源调度器申请Application Master(AM)容器,空载集群下资源会直接分配
- AM启动:YARN分配的容器加载Spark AM依赖、启动AM进程,AM同步连接YARN ResourceManager、HDFS等集群基础服务
- Executor分配:AM根据配置的
executor-memory、executor-cores参数申请对应数量的Executor容器,空载集群下容器会快速分配,Executor启动后向AM注册 - Spark上下文初始化:Driver端(cluster模式在AM内,client模式在提交节点)初始化
SparkContext/SparkSession,加载内置配置、连接元数据服务、完成作业环境初始化 - 业务代码执行:上述所有初始化完成后,正式执行业务逻辑的第一行代码
2. 影响初始化耗时的通用因素
- 提交模式:client模式比cluster模式少了AM内启动Driver的步骤,初始化速度更快,适合小作业快速启动
- 资源配置:开启动态资源分配且初始Executor数设为0的话,第一次任务会增加Executor启动耗时;提前配置固定数量的常驻Executor可大幅缩短初始化时间
- 依赖加载:每次提交都通过
--jars上传大量第三方依赖会增加分发耗时;提前把依赖放到集群节点classpath或HDFS公共路径引用,可减少这部分耗时 - 内置服务开关:不需要用到Hive的话关闭
spark.sql.catalogImplementation=hive,调小作业不需要的spark.driver.memory、spark.executor.memory配置(JVM启动速度和分配内存大小负相关)都能缩短初始化时间 - 集群后台负载:哪怕表面空载,后台运行的定时监控任务、资源预留策略也可能拉长资源调度等待时间
3. EMR特有的影响初始化时长的因素
- 内置服务默认加载:EMR默认给Spark配置了Hive Metastore集成、Ranger权限校验、对象存储连接客户端等组件,业务不需要的话手动关闭对应自动加载配置,可减少数百毫秒到数秒的初始化耗时
- 资源调度优化配置:EMR支持配置Spark专用YARN节点标签、资源预分配,提前把空闲资源打上Spark专用标签后,资源调度速度会比默认调度快很多
- 版本自带优化:高版本EMR默认开启Spark冷启动优化、依赖缓存、容器预热等特性,可大幅缩短初始化时间;低版本EMR没有这些优化,耗时会更长
- 托管元数据延迟:如果使用EMR托管的Hive Metastore、Glue Catalog等托管元数据服务,元数据请求的网络延迟也会影响Spark上下文初始化速度
正常优化后的空载EMR集群,小型Spark作业的初始化耗时可以控制在1~3秒,完全满足几秒内启动业务逻辑的需求。
内容的提问来源于stack exchange,提问作者malana
相关产品推荐
相关产品推荐

