Spark性能调优

1.系统资源使用

核心调优参数如下:
          (1)num-executors :该参数一定会被设置, Yarn 会按照Driver 的申请最终为当前的Application 生产指定个数的Executors。实际生产环境下分配80 个左右的Executors比较合适。
          (2)executor-memory: 与JVM OOM 紧密相关,很多时候甚至决定了Spark 运行的性能。实际生产环境下建议8GB 左右,很多时候Spark 是运行在Yarn 的,内存占用量不超过Yarn 的内存资源的50% 。
          (3)executor-cores : 决定了在Executor 中能够并行执行的Task 的个数。实际生产环境建议4 个左右, 一般情况下不要超过Yarn队列中Cores 总数的50% 。
          (4)driver-memory :作为驱动, 默认是1GB , 在生产环境下可设置为4G B 。
          (5)spark.default.parallelism : 建议至少设置为100 个, 最好是700 个左右。
          (6)spark.storage.memoryFraction(已过时): 默认占用60% ,用于RDD 的持久化(例如, Cache 数据到内存)。如果计算比较依赖于历史数据,则可以适当调高该参数, 但是如果计算严重依赖于Shuffle ,则需要降低该比例。
          (7)spark.shuffle.memoryFraction(已过时) : 默认占用20% ,Shuffle 拉取数据和进行聚合操作。如果计算严重依赖于Shuffle , 则需要提高该比例。
         (8)supervise :配置这个参数, 当Driver 运行在Cluster 集群,如果出问题了,可自动重新启动。仅在standalone或Mesos集群部署模式下有效

注:是否启用Spark 1.5及之前的版本中使用的旧式内存管理模式,传统模式将堆空间严格划分为固定大小的区域,如果未调整应用程序,可能会导致过多的溢出。在1.5之后的版本中加入了一个参数spark.memory.useLegacyMode,默认为false,只有在设置为true的时候,上面的spark.storage.memoryFractionspark.shuffle.memoryFraction才会生效。

2.Shuffle调优

Shuffle 的性能消耗包括:磁盘消耗、内存消耗、网络消耗,以及分发数据过程中产生的数据倾斜。围绕Shuffle 和数据倾斜有很多调优点:
          (1)spark.shuffle.file.buffer:默认是32KB。Mapper 端的Buffer设置为多大? Buffer 设置得大,可提升性能,减少磁盘I/O ,但是对内存有要求,对GC有压力; Buffer 设置得小,可能不占用那么多内存, 但是可能频繁的磁盘I/O 、频繁的网络I/O 。
         (2)spark.reducer.maxSizeInFlight:默认情况是48MB。Reducer 端的Buffer 设置为多大? Buffer 设置得小,限制了每次拉取多少数据过来,默认一次最大可以拉取48MB 数据,如把数据变成1GB ,那拉取数据的次数变少了,拉取的效率变高了。假如变成48KB,原来10 次就够了,现在需要1 万次。
         (3)在数据传输的过程中是否有压缩,以及使用什么方式压缩,默认使用snappy的压缩方式。使用snappy方式的好处是压缩速度快,但占用空间,可以根据业务需求使用配置其他的压缩方式。
        (4)spark.shuffle.io.maxRetries:网络传输失败重试的次数,默认为3次。网络传输有很大的风险,可能出故障。一般需要重试,那重试多少次,每次重试之间间隔多少时间也是非常重要的调优参数。例如,默认是重试3 次,如果抓取3 次还没有弄好,
就宣告失败。在数据本来有,但重试3 次抓不到数据的情况下, 是上游可能在进行GC ,不响应请求。我们一般考虑将3 次变成3 0 次、50 次,或者变成100 次。至少应将参数spark.shuffle.io.maxRetries =30 次。
       (5)spark.shuffle.io.retryWait:每次重试之间的时间间隔默认是5S,为了减少重试次数,可以调大等待的时间。建议将时间间隔设置为60s 。
       (6)spark.shuffle.sort.bypassMergeThreshold:默认为200。现在Spark 是SortShuffle ,那作为业务,是否需要排序呢?不一定。SortShuffle的弊端是浪费时间, SortShuffle 排序用的是全量的数据。因此有一个参数开关spark. shuffle. sort. bypassMerge Threshold 可以使用bypass机制,即不排序, 当 shuffle reduce task的数量小于spark.shuffle.sort.bypassMergeThreshold的参数值时,会触发。

参考:

     (1) http://spark.apache.org/docs/latest/configuration.html

     (2)Spark大数据商业实战三部曲_内核解密_商业案例_性能调优

posted @ 2019-03-08 12:12  大数据技术与数仓  阅读(167)  评论(0编辑  收藏  举报