Spark常用的优化有些?

Spark结合业务调优 spark优化 面试_缓存

优化的目标:

优化的目标是促成CPU、内存、IO(磁盘和网络)的平衡,通过调整任务并行度,充分利用CPU的并发能力,任务过多会导致任务阻塞和任务调度开支增大,任务过少导致CPU利用率第,数据分片大,出现内存溢出。尽量避免shuffle,shffle一定会导致磁盘IO和网络IO,IO会大幅降低应用性能,如果无法避免shuffle,则要在shuffle的时机和方式上慎重选择。

出发点是平衡而充分的利用硬件资源,从任务开始时合理的并行度、计算过程中的内存充分利用、Shuffle相关优化三个方向思考优化措施,而具体实施又都落实到配置和代码两个方面。

具体的思路:

  • 任务开始时的并发度
    根据数据集的大小+partitioner计算分片数量,根据分片数量和分片大小确定要申请的资源。
    在计算的过程中,如果filter之后出现了数据的大幅减小,可以通过repatition重分区,避免对CPU和内存的浪费。
  • 任务计算过程中的内存充分利用
    根据任务的特点调整内存各部分使用比例,预估UserMemory、Execution Memory、Storage Memory大小,根据比例调整各部分内存占用比例。
    缓存计算代价大且会被重复使用的RDD,避免从头到尾的重复计算。缓存使用kryo序列化,SparkConf.set("spark.serializer", "org.apache.spark.serializer.KryoSerializer").registerKryoClasses(xxxx)
    使用广播变量让同一个Executor下的Task共享用户数据,降低UserMemory的使用大小。
    增大任务本地化等待时间:spark.locality.wait,该值默认3秒,可适当扩大。
    考虑RDD的存储压缩 spark.rdd.compress
  • Shuffle相关优化
    使用广播变量避免shuffle
    将shuffle的时机尽量延后,尽量降低shuffle过程中全网传输的数量
    用key by替换group by
    增大map端数据输出缓存大小,spark.shuffle.file.buffer,默认32k,可设置为64k,该值越大,落盘次数越少,速度越快
    增大reduce拉取数据时网络缓存的大小,spark.reducer.maxSizeInFlight,默认为48M,可设为96M,该值越大,每次从网络拉取的数据越多,所需要的拉取次数越小。

附:

Spark结合业务调优 spark优化 面试_缓存_02