ERROR executor.CoarseGrainedExecutorBackend: RECEIVED SIGNAL 15: SIGTERM

Spark提交任务执行遇到如下错误:

1.命令行错误:
2.yarn 日志错误:(yarn日志不知如何获取的请参考上一篇博客 yarn日志打印)

ERROR executor.CoarseGrainedExecutorBackend: RECEIVED SIGNAL 15: SIGTERM

19/12/05 11:03:53 INFO netty.NettyBlockTransferService: Server created on 26780
19/12/05 11:03:53 INFO storage.BlockManagerMaster: Trying to register BlockManager
19/12/05 11:03:53 INFO storage.BlockManagerMaster: Registered BlockManager
19/12/05 11:04:15 ERROR executor.CoarseGrainedExecutorBackend: RECEIVED SIGNAL 15: SIGTERM
19/12/05 11:04:15 INFO storage.DiskBlockManager: Shutdown hook called
19/12/05 11:04:15 INFO util.ShutdownHookManager: Shutdown hook called

LogType:stdout
Log Upload Time:5-Dec-2019 11:04:35
LogLength:0

解决思路:

1.减少shuffle数据

主要从代码层面着手,可以将不必要的数据在shuffle前进行过滤,比如原始数据有20个字段,只要选取需要的字段进行处理即可,将会减少一定的shuffle数据。

2.修改分区

通过spark.sql.shuffle.partitions控制分区数,默认为200,根据shuffle的量以及计算的复杂度适当提高这个值,例如500。

ERROR executor.CoarseGrainedExecutorBackend: RECEIVED SIGNAL 15: SIGTERM_第1张图片

spark.default.parallelism只有在处理RDD时才会起作用,对Spark SQL的无效。
spark.sql.shuffle.partitions则是对Spark SQL专用的设置
我们可以在提交作业的通过 --conf 来修改这两个设置的值,方法如下:
一般默认为200,可设置较大:400

提交任务的时候加上参数: spark-submit --conf spark.sql.shuffle.partitions=400 --conf spark.default.parallelism=400 --num-executors…

方案实现思路:在对RDD执行shuffle算子时,给shuffle算子传入一个参数,比如reduceByKey(1000),该参数就设置了这个shuffle算子执行时shuffle read task的数量。对于Spark SQL中的shuffle类语句,比如group by、join等,需要设置一个参数,即spark.sql.shuffle.partitions,该参数代表了shuffle read task的并行度,该值默认是200,对于很多场景来说都有点过小。

  方案实现原理:增加shuffle read task的数量,可以让原本分配给一个task的多个key分配给多个task,从而让每个task处理比原来更少的数据。举例来说,如果原本有5个key,每个key对应10条数据,这5个key都是分配给一个task的,那么这个task就要处理50条数据。而增加了shuffle read task以后,每个task就分配到一个key,即每个task就处理10条数据,那么自然每个task的执行时间都会变短了。具体原理如下图所示。

  方案优点:实现起来比较简单,可以有效缓解和减轻数据倾斜的影响。

  方案缺点:只是缓解了数据倾斜而已,没有彻底根除问题,根据实践经验来看,其效果有限。

  方案实践经验:该方案通常无法彻底解决数据倾斜,因为如果出现一些极端情况,比如某个key对应的数据量有100万,那么无论你的task数量增加到多少,这个对应着100万数据的key肯定还是会分配到一个task中去处理,因此注定还是会发生数据倾斜的。所以这种方案只能说是在发现数据倾斜时尝试使用的第一种手段,尝试去用嘴简单的方法缓解数据倾斜而已,或者是和其他方案结合起来使用。

3.增加失败的重试次数和重试的时间间隔

通过spark.shuffle.io.maxRetries控制重试次数,默认是3,可适当增加,例如10。
通过spark.shuffle.io.retryWait控制重试的时间间隔,默认是5s,可适当增加,例如10s。

4.提高executor的内存

在spark-submit提交任务时,适当提高executor的memory值,例如15G或者20G。

考虑是否存在数据倾斜的问题

5.还有一种可能是:机器之间通信可能有问题。问问运维,网关等

参考文章:
为什么Pyspark作业在进程中间消失而没有任何特定错误
Spark常见异常:Missing an output location for shuffle
spark.sql.shuffle.partitions 和 spark.default.parallelism 的区别

你可能感兴趣的:(Spark)