Spark 3.X on Kubernetes及EKS环境下动态分配支持性与Shuffle Service必要性咨询
您好!针对您在EKS上使用Spark动态分配的两个问题,我结合实际生产经验给您梳理下:
一、EKS完全支持Spark动态分配
Spark 3.X在Kubernetes(包括EKS)环境下是完全支持动态分配的,这也是目前生产环境中优化资源利用率的常用方案。要启用它,只需要在Spark配置中开启核心参数,并搭配相关阈值配置即可:
- 开启动态分配:
spark.dynamicAllocation.enabled=true - 配置 executor 数量范围:比如
spark.dynamicAllocation.minExecutors=2、spark.dynamicAllocation.maxExecutors=20(根据集群资源和作业需求调整) - 设置 executor 闲置回收超时:
spark.dynamicAllocation.executorIdleTimeout=300s(闲置超过5分钟就自动回收)
另外需要注意,EKS本身的集群配置(比如节点组的弹性伸缩)可以和Spark动态分配配合使用,进一步优化整体资源的弹性能力。
二、Shuffle Service(DaemonSet部署)对动态分配的必要性
这个问题要分场景来看:
生产环境有shuffle操作的作业:非常有必要
Spark动态分配的核心是按需启停executor,但默认情况下,shuffle数据是存储在executor的本地磁盘上的。如果executor因为闲置被回收,它上面的shuffle数据就会丢失,后续依赖这些数据的stage就不得不重新计算,这会大幅降低作业性能,甚至导致作业延迟飙升。
而将Shuffle Service以DaemonSet的形式部署在EKS的每个节点上后,shuffle数据会由节点上的Shuffle Service进程托管存储,即使executor被回收,数据依然保留在节点本地,后续stage可以直接从Shuffle Service获取数据,避免重复计算。此时需要额外配置:spark.shuffle.service.enabled=true,指定Shuffle Service的端口等参数。无shuffle或对性能要求极低的作业:可暂时不用
如果你的Spark作业几乎没有shuffle操作,或者可以接受偶尔的重新计算开销,那么不部署Shuffle Service也能正常使用动态分配,但这只适合测试或非核心场景。
总结来说,在EKS上使用Spark动态分配时,生产环境强烈建议部署Shuffle Service DaemonSet,这是保障作业性能和稳定性的关键配置。
备注:内容来源于stack exchange,提问作者Rajashekhar Meesala

