1. EventTimeLine 的颜色代表
- 红色 Task Deserialization Time 任务反序列化时间Task Deserialization Time,一般来说它不应该这占用如此大的比例
- 绿色 Executor Computing Time 的比例,就是executor真正执行工作所花的时间
- 蓝色 Scheduler Delay 等待的时间
2. Scheduling Mode
Spark中的调度模式主要有两种:FIFO和FAIR
哪种调度器由参数spark.scheduler.mode来设置,可选的参数有FAIR和FIFO,默认是FIFO 源码中根据用户配置的 SchedulingMode 决定是生成FIFOSchedulableBuilder 还是生成 FairSchedulableBuilder 类型的 schedulableBuilder 对象 在生成 schedulableBuilder 后,调用其buildPools方法生成 调度池 如果不加设置,jobs会提交到 default 调度池 中。由于 调度池 的使用是Thread级别的, wight 调度池的权重 poolname 调度池名 如果有必要,可以去了解FairScheduler是如何在各个Pool之间分配资源,以及每个Pool如何在Job之间分配资源的
3. Spark为什么有些job显示是skiped
Stage对应的TaskSet中所有任务成功执行后,会将Stage对应的StageInfo反馈到JobProgressListener.stageIdToInfo,这样这些任务就不会显示为skipped了
任务出现skipped是正常的,之所以出现skipped是因为要计算的数据已经缓存到了内存,没有必要再重复计算。出现skipped对结果没有影响。
4. Spark异步接口task失败任务不会重启
同步任务会在最大重试次数之后停止,异步不会,所以需要针对task级别的任务进行监控,不然任务会一直出错,你却不知道造成业务损失,自定义listener
5. 参数调优
spark.shuffle.memoryFraction
参数说明:该参数用于设置shuffle过程中一个task拉取到上个stage的task的输出后,进行聚合操作时能够使用的Executor内存的比例,默认是0.2。也就是说,Executor默认只有20%的内存用来进行该操作。shuffle操作在进行聚合时,如果发现使用的内存超出了这个20%的限制,那么多余的数据就会溢写到磁盘文件中去,此时就会极大地降低性能。
参数调优建议:如果Spark作业中的RDD持久化操作较少,shuffle操作较多时,建议降低持久化操作的内存占比,提高shuffle操作的内存占比比例,避免shuffle过程中数据过多时内存不够用,必须溢写到磁盘上,降低了性能。此外,如果发现作业由于频繁的gc导致运行缓慢,意味着task执行用户代码的内存不够用,那么同样建议调低这个参数的值
当然网上调优文章一大堆,可自行查找
