多Spark-submit作业运行报错:DSE Cassandra集群资源配置排查
问题分析与解决方案
咱们先从资源核算入手,看看你当前的配置为啥没办法并行跑多个Spark作业:
集群资源总览
你的集群是4个节点,每个节点4核、6GB内存,那:
- 集群总CPU核心:
4节点 × 4核 = 16核 - 集群可用内存(要留一部分给DSE/Cassandra自身运行,不能全给Spark):每个节点大概能给Spark分配4GB左右,总可用内存约
4节点 × 4GB = 16GB
当前单作业的资源占用问题
你给每个Spark作业设置的参数,已经把集群的大部分资源占满了:
- CPU方面:
spark.executor.instances=4×spark.executor.cores=2= 8核,直接占了总核心的50% - 内存方面:
spark.executor.instances=4×spark.executor.memory=2g= 8GB,再加上cluster模式下driver会占用worker节点的2GB内存,单作业总共要占10GB内存,几乎把可用内存用掉大半
更关键的是,每个节点只有4核,你给每个executor分配2核,意味着单个节点最多只能跑2个executor,但同时还要容纳driver或者Cassandra的进程,资源根本腾不出来给第二个作业,这就是为什么第二个作业会报"Initial job has not accepted any resources"的错误。
调整建议(让多作业并行运行)
1. 缩减单作业的固定资源配置
把单个作业的资源需求降下来,给其他作业留空间:
- 调低executor实例数和核数:比如把
spark.executor.instances改为2,spark.executor.cores改为1,这样单作业只占用2×1=2核,CPU资源压力瞬间减小 - 调整executor内存:考虑到每个节点要给Cassandra留至少2GB内存,把
spark.executor.memory改为1.5g,单作业内存占用变为2×1.5g=3g,加上driver的1GB(可以把spark.driver.memory降到1g,非必要别占太大),总内存只占4GB,剩余资源足够跑多个作业
调整后的参数示例:
.set("spark.executor.memory", "1.5g") .set("spark.driver.memory", "1g") .set("spark.submit.deployMode", "cluster") .set("spark.executor.instances", "2") .set("spark.executor.cores", "1")
2. 开启动态资源分配
开启Spark的动态资源分配功能,让Spark根据作业的实际需求自动调整executor数量,最大化资源利用率:
.set("spark.dynamicAllocation.enabled", "true") .set("spark.dynamicAllocation.minExecutors", "1") .set("spark.dynamicAllocation.maxExecutors", "6")
开启后,单个作业不会一直占用固定数量的executor,当作业完成或者资源空闲时,会释放executor给其他作业使用。
3. 注意DSE与Spark的资源隔离
确保每个节点给Cassandra预留了足够的内存(至少2GB),避免Spark占用过多内存导致Cassandra性能下降甚至崩溃,这也是DSE集群中必须注意的点。
内容的提问来源于stack exchange,提问作者Pinnacle
相关产品推荐
相关产品推荐

