有时候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