spark问题优化

1、ERROR cluster.YarnScheduler: Lost executor 5 onhdp-14-9876: Container marked as failed: container_1560518528256_0014_01_000003 on host: hadoop-master. Exit status: 143. Diagnostics: Container killed on request. Exit code is 143 Container exited with a non-zero exit code 143

从spark的执行计划来看(如下图),coalesce(5),相当于一共有5个stage,一般一个stage对应对应多个task,目前从spark UI来看是一个stage对应了一个task,然后一个executorID分配到同个host上了,导致该台机器的内存不够,相应的container killer了,然后该executor 被强制退出( 默认情况下一个task对应cpu的一个核。如果一个executor可用cpu核数为8,那么一个executor中最多同是并发执行8个task)
spark相应的任务重试机制
spark.yarn.max.executor.failures ,当executor挂了一定个数之后,整个任务就会挂掉
在这里插入图片描述

解决办法:
(1)增大spark的容错次数,报错后重试次数https://blog.csdn.net/lsr40/article/details/106931464/
(2)增大executor-memory
(3)设置不让同一个host上运行一个executor,且一个executor上运行4个task,可以利用3的(executor-core / spark.task.cpu)控制每台机器的task任务数
(4)堆内内存和堆外内存同时使用
spark.yarn.executor.memoryOverhead

2、 job、stage、task、executor的对应的关系
一个action对应一个job,一个job多个stage,划分stage的边界是不同节点取数据,到shuffle结束,一个stage对应多个task,task由dirver发送到executor,task运行在executor中,exector运行在worker node上,exector由dirver在worker node上申请资源创建,application包括driver program和executors。
在这里插入图片描述

3、为了防止一个host上有一个executor,然后一个exector中有多个task并行,从下面的截图中可以看出hdp-82166上有一个Executor ID为9的执行了两个task任务,
在这里插入图片描述

可以通过spark的sumbit参数控制
在这里插入图片描述

机器环境是16台机器、32G,16core,从上面配置可以看出,相当于一台机器分配一个executor,然后一个executor是10G内存,一个executor分配8 个core CPU,一个task分配4个core CPU,这样保证一个executor上最多有个2个task任务在运行(8 / 4),换算一下,相当于一台机器上分配一个executor,可能会存在2个Task在运行

(4)分割文件个数的

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的执行时间都会变短了

(5)指定并行的task数量
spark.default.parallelism
*
参数说明:该参数用于设置每个stage的默认task数量。这个参数极为重要,如果不设置可能会直接影响你的Spark作业性能。
*
参数调优建议:Spark作业的默认task数量为500~1000个较为合适。很多同学常犯的一个错误就是不去设置这个参数,那么此时就会导致Spark自己根据底层HDFS的block数量来设置task的数量,默认是一个HDFS block对应一个task。通常来说,Spark默认设置的数量是偏少的(比如就几十个task),如果task数量偏少的话,就会导致你前面设置好的Executor的参数都前功尽弃。试想一下,无论你的Executor进程有多少个,内存和CPU有多大,但是task只有1个或者10个,那么90%的Executor进程可能根本就没有task执行,也就是白白浪费了资源!因此Spark官网建议的设置原则是,设置该参数为num-executors * executor-cores的2~3倍较为合适,比如Executor的总CPU core数量为300个,那么设置1000个task是可以的,此时可以充分地利用Spark集群的资源。

在这里插入图片描述

还是上面这个参数,比如说你不指定spark-task.cpus参数,一共有16台机器,平均每台分配1个executor,一个executor是8个核,相当于一个executor可以并行8个task,然后乘以 num-executor 16,8*16

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值