spark的job运行速度慢回答
分析过程:
第一个、分析时应该分析数据量小的时候还是数据量大的时候
如果是数据量小的时候,可能会出现任务卡住了,任务卡住可能有两种原因第一是调度器有问题(yarn有问题,可能是nodemanager挂掉了,他就没办法安排任务了,nodemanager的队列塞满了)还有一种可能就是spark引擎自身的问题,可能会发生内存泄露问题,泄露到hadoop底层环境,hadoop底层是java,你要去看java的gc(垃圾回收机制),可能是java的gc线程阻塞没办法启动gc,导致内存泄露
如果是数据量大的时候,可能会出现非平衡问题,就是数据倾斜问题
第二个、还有什么原因会导致呢,你的yarn调度的时候跟mapreduce是一样的,会经过map、suffle、reduce过程,出问题大概率在suffle过程,怎么解决?通过查看spark日志文件(进到sparkweb页面查看正在进行的work,看看有没有任务在partition或suffle里面,如果卡住了就要做suffle调优,可以通过spark.env里面把spark改成true,这就是所谓的推测式执行task)
第三个、操作很多个RDD步骤时,如果含有很多个空任务或小任务的情况下,会导致spark集群的性能下降
总结:
①spark的吞吐量,单一节点的吞吐量
②每一个步骤的RDD操作的空任务和小任务
③数据倾斜
④spark的序列化的时间较长
⑤suffle小文件多或分片数量过大
⑥suffle本身io时间偏长,因为gc进程进入了阻塞状态。
⑦map太多,reduce不够
⑧spark里面有个connect,如果你不断的往里面输入大量的结果,他也是会变慢的。
⑨单条记录它的开销大,也是导致spark变慢的原因
改进:
①如果有相同的RDD,使用同一个RDD(RDD持久化)
②做suffle的时候可以做一个预聚合
③改广播变量
④优化序列化的问题
⑤写程序的时候可以减少拆箱和装箱的过程
⑥做资源调优,修改spark的yarn,yarn有很多策略,最基本的filein和fileout这种先来先服务的队列结构,如果要修改的话,减可以用一种公平的借用原则去做(公司部门借人的例子)
⑦大规模的改suffle过程,在execute里面去改
⑧调整数据倾斜,尽量少用这种比较倾斜的分片来做