Spark中指定Executor数量:SparkSession与spark-submit的最佳实践
Spark Executor数量配置:spark-submit vs SparkSession的差异与最佳实践
二者的核心差异
- 优先级不同:spark-submit传入的配置参数优先级高于SparkSession.builder中设置的参数。比如你同时在spark-submit用
--num-executors 5,代码里设置spark.executor.instances=3,最终生效的是5个Executor。 - 灵活性不同:spark-submit的配置是提交时动态指定,不需要修改代码就能适配不同场景——比如测试环境用2个Executor,生产环境用10个,直接改提交命令就行;如果把Executor数量写死在代码里,换环境就得修改代码、重新打包,效率极低。
- 环境耦合度不同:代码里硬写
master和spark.executor.instances会让代码和特定集群绑定,后续切换集群模式(比如从Standalone转YARN)或者换集群地址,都得改代码;用spark-submit指定master和资源配置,代码可以保持通用,适配多种集群环境。 - 可见性不同:提交命令里的资源配置一目了然,运维排查问题时能快速知道作业的资源需求;代码里的配置需要查看源码才能发现,不直观,不利于团队协作。
最佳实践
- 资源类配置(Executor数量、内存、核数)优先用spark-submit指定:比如用
--num-executors参数设置Executor数量,这样既能灵活调整,又能避免代码和环境绑定。 - 代码中只保留通用配置:比如
spark.eventLog.enabled这类不随环境变化的配置,可以放在SparkSession里;但master和资源相关配置尽量从提交命令传入,让代码更通用。
修改后的代码示例:
spark = SparkSession.builder \ .appName("Spark-job-on-cluster-example") \ .config("spark.eventLog.enabled", True) \ .getOrCreate()
对应的提交命令:
$ spark-submit --master spark://spark-master:7077 --num-executors 3 --py-files my_libs.zip my_spark-main.py
内容的提问来源于stack exchange,提问作者MDH
相关产品推荐
相关产品推荐

