Spark集群的资源(CPU&Memory)是有限的,如何充分利用资源计算更多的任务,就必须要理解File 节点数 Executors数 cores tasks的关系

这里主要解决集群资源的合理使用包括cores executors memory 等

从一个问题说起,我曾经启动spark-sql cli时经常出现Initial job has not accepted any resources; check your cluster UI to ensure that workers are registered and have sufficient resources

测试集群配置如下图所示,13个节点,每个节点配置了8-12cores  & 30g memory ,启动了thriftserver占用72cores,此时我启动一个spark-sql cli默认占用6个cores——defaultCores,由于每个节点剩下可用的只有4cores,无法在任何一个节点启动一个Executor,所以就会轮训该日志;如果内存成稀缺资源了,同样会引起该问题,因此怎么配置任务所使用的资源需要根据集群当前的资源分布的。

spark1

不加任何参数执行spark-sql spark-submit spark-shell使用的是spark.deploy.defaultCores  & SPARK_EXECUTOR_MEMORY 两个参数,为了规避这个问题,将spark.deploy.defaultCores设置成4能让集群启动更多的Executors。而不至于像刚才那样导致一直等待资源。

spark3

除了spark-env.sh里的参数外,还可以手动指定cores & memory & executors

spark-sql –master spark://10.0.18.14:7077 –executor-memory 10G –total-executor-cores 8 –executor-cores 4

这条命令将启动8/4=2个executors ,每个executors占用10G memory

spark4

 

spark5

 

 

 

所以根据这三个参数,你就能决定启动多少个 Executors  每个executor使用多少cores & memory

–executor-memory  executor使用的内存数

–total-executor-cores 8  Job使用总的cores

–executor-cores 4 每个executor占用的cores