更新时间:2024-09-30 GMT+08:00

Spark任务由于内存不够,作业卡住

用户问题

Spark提交作业内存不足导致任务长时间处于pending状态或者运行中内存溢出。

问题现象

使用Spark提交作业后,长期卡住不动。反复运行作业后报错,内容如下:

Exception in thread "main" org.apache.spark.SparkException: Job aborted due to stage failure: 
Aborting TaskSet 3.0 because task 0 (partition 0) cannot run anywhere due to node and executor blacklist. 
Blacklisting behavior can be configured via spark.blacklist.*. 

原因分析

内存不足导致Spark提交的作业任务长时间处于pending状态。

处理步骤

  1. 登录MRS Console页面,在现有集群中,选择集群名称,在“节点信息”页面,查看当前集群的节点规格。
  2. 提高nodemanager进程所持有的集群资源。

    MRS Manager界面操作:

    1. 登录MRS Manager页面,选择“服务管理 > Yarn > 服务配置”。
    2. “参数类别”中选择“全部配置”,然后在搜索框中搜索yarn.nodemanager.resource.memory-mb,查看该参数值。建议配置成节点物理内存总量的75%-90%。

    FusionInsight Manager界面操作:

    1. 登录FusionInsight Manager。选择“集群 > 服务 > Yarn”。
    2. 单击“配置”,选择“全部配置”。然后在搜索框中搜索yarn.nodemanager.resource.memory-mb,查看该参数值。建议配置成节点物理内存总量的75%-90%。

  3. 修改Spark的服务配置。

    MRS Manager界面操作:

    1. 登录MRS Manager页面,选择“服务管理”>“Spark” >“服务配置”。
    2. “参数类别”中选择“全部配置”,然后在搜索框中搜索spark.driver.memoryspark.executor.memory

      根据作业的需要调大或者调小该值,具体以提交的Spark作业的复杂度和内存需要为参考(一般调大)。

    FusionInsight Manager界面操作:

    1. 登录FusionInsight Manager。选择“集群 > 服务 > Spark”。
    2. 单击“配置”,选择“全部配置”。然后在搜索框中搜索spark.driver.memoryspark.executor.memory,根据作业的需要调大或者调小该值,具体以提交的Spark作业的复杂度和内存需要为参考(一般调大)。
    • 如果使用到SparkJDBC作业,搜索并修改SPARK_EXECUTOR_MEMORYSPARK_DRIVER_MEMORY两个参数取值,具体以提交的Spark作业的复杂度和内存需要为参考(一般调大)。
    • 如果对核数有要求,可以搜索并修改spark.driver.coresspark.executor.cores的核数取值

  4. Spark依赖内存做计算,如果以上还是不能满足任务的提交需要,建议扩容集群。