Spark 2.1.1 Standalone集群--total-executor-cores配置未生效问题咨询
问题分析与解决方案
针对你遇到的Spark Standalone集群作业核数分配不生效的问题,我整理了几个实用的排查方向和解决办法:
一、先确认集群的实际资源瓶颈
从你的描述看,集群总剩余29核但作业仅用6核,内存不足是最常见的诱因:
你指定了--executor-memory 24G,每个executor需要占用24G内存。如果你的Worker节点单台剩余内存不够24G,或者集群总剩余内存不足以支撑多个24G的executor,Spark Master就会限制executor的启动数量,自然达不到16核的总分配量。
快速排查步骤:
- 打开Spark Master的Web UI(默认地址
http://<master-ip>:8080),查看每个Worker节点的:Cores Used / Cores TotalMemory Used / Memory Total
- 核算剩余内存是否能支撑你的executor需求:
- Spark 2.1.1默认每个executor占用1核,若要16核则需要16个executor,总内存需求是
16 * 24G = 384G,看看集群剩余内存是否达标。 - 如果剩余内存不够,这就是核心问题所在。
- Spark 2.1.1默认每个executor占用1核,若要16核则需要16个executor,总内存需求是
二、调整executor资源配置适配集群
根据集群实际资源情况,修改参数组合:
- 降低
--executor-memory:比如改成12G,减少单个executor的内存占用,就能启动更多executor来凑够16核。 - 配合指定
--executor-cores:比如设置--executor-cores 4,让每个executor用4核,仅需4个executor就能达到16核,总内存需求降至4 * 24G = 96G,更容易满足集群内存条件。
修改后的spark-submit命令示例:
PYSPARK_PYTHON="/usr/bin/python3.4" PYSPARK_DRIVER_PYTHON="/usr/bin/python3.4" \ /opt/spark/spark-2.1.1-bin-hadoop2.7/bin/spark-submit \ --master spark://XXXX.XXXX:7077 \ --conf "spark.sql.shuffle.partitions=2001" \ --conf "spark.port.maxRetries=200" \ --conf "spark.executorEnv.PYTHONHASHSEED=0" \ --executor-memory 12G \ --executor-cores 4 \ --total-executor-cores 16 \ --driver-memory 8G \ /home/XXXX/XXXX.py \ --spark_master "spark://XXXX.XXXX:7077" \ --topic "XXXX" \ --broker_list "XXXX" \ --hdfs_prefix "hdfs://XXXX"
三、检查作业并行度是否匹配资源
从你传入的--topic和--broker_list参数来看,这应该是一个Spark Streaming消费Kafka的作业。即使集群分配了16核,如果作业并行度不够,核也会处于闲置状态:
- 检查Kafka Topic的分区数:如果Topic分区数少于16,DStream的并行度会受限于分区数,最多只能用到和分区数相同的核数。
- 调整
spark.streaming.kafka.maxRatePerPartition:如果限制了每个分区的消费速率,也会导致作业无法充分利用资源。 - 确认计算逻辑的分区数:对于非Streaming的处理环节,确保RDD/DataFrame的分区数不低于总executor核数,避免并行度不足。
四、通过集群日志定位深层问题
如果以上方法都没解决,去Spark Master节点的日志目录(默认$SPARK_HOME/logs)查看Master日志,里面会有资源分配的详细记录,比如是否有Insufficient memory to launch executor这类报错,能直接定位具体的资源瓶颈。
内容的提问来源于stack exchange,提问作者Gal Shaboodi
相关产品推荐
相关产品推荐

