Spark任务的某个Stage卡住不动问题

原文链接: https://blog.csdn.net/whgyxy/article/details/88779965

有时候Spark任务莫名会在某个Stage卡住,然后一直停在那里,如果任务重新跑的话又是没有问题的,在实际项目中如果这样的任务出现了,需要仔细分析Spark的log,这样的情况一般是数据不均衡导致的某个节点任务量偏大,而这个节点分配不到太多内存(其他还有很多任务都在这里运行)导致任务卡顿。有几个参数非常有效,主要是Spark的任务推测执行参数,任务推测执行默认是不开启的,因为开启了是会浪费资源的,如果经常有任务卡顿,需要添加这个参数

参数名 默认值 含义
spark.speculation False 以下几个参数是关于Spark推测执行机制的相关参数。此参数设定是否使用推测执行机制,如果设置为true则spark使用推测执行机制,对于Stage中拖后腿的Task在其他节点中重新启动,并将最先完成的Task的计算结果最为最终结果
spark.speculation.interval 100 Spark多长时间进行检查task运行状态用以推测,以毫秒为单位
spark.speculation.quantile 0.75 推测启动前,Stage必须要完成总Task的百分比
spark.speculation.multiplier 1.5 比已完成Task的运行速度中位数慢多少倍才启用推测

在实际应用在,可以根据实际情况设置参数值,例如可以设置500ms检查一下状态,Stage完成0.9我们才开启推测任务,比已完成Task的运行速度中位数慢1.2倍才开启。总之,这是个非常不错的参数。

参考:https://blog.csdn.net/whgyxy/article/details/88779965

另外,也需要注意是否是spark-submit提交时参数分配的问题:
例如在standalone /yarn 模式运行的时候 client 模式正常运行,而cluster 模式卡死的问题.

spark-env.sh 里的配置 

SPARK_MASTER_PORT=7077

SPARK_MASTER_WEBUI_PORT=8080

SPARK_WORKER_CORES=2

SPARK_WORKER_MEMORY=1G      #开辟多大内存运行 worker

SPARK_WORKER_PORT=7078

SPARK_WORKER_WEBUI_PORT=8081

SPARK_WORKER_INSTANCES=1
  spark-submit \

  --driver-memory:  		 #driver运行的内存大小,默认1024M

  --executor-memory      	 #executor 运行内存大小,默认 1024M

当使用 client模式运行的时候,master运行在本机,占用linux机器的内存;

master -------占用 虚拟机 1G 内存
Worker (1G) ------executor 1G 运行任务

当使用 master模式的时候,由于使用的是为分布模式,所以master只能运行在本机的worker上,占用 1G的内存,由于worker内存用完,当执行任务的时候executor分配不到内存,所以卡死

Worker (1G) ------ master 占用1G
----- executor 卡死

解决方法:
执行任务打时候规定 driver的内存小于等于executor的内存

spark-submit   \

--master spark://cdh01:7077   \

--deploy-mode cluster \

--driver-memory 512m \

--executor-memory 1G \

/home/kequan/data/sparkdemo01.jar

猜你喜欢

转载自blog.csdn.net/weixin_44455388/article/details/101671012