Hulb's Homepage

Spark 性能优化参考

2017-04-12

Spark 性能优化参考

一、资源优化

spark官方的:

/bin/spark-submit
--class org.apache.spark.examples.SparkPi \
--master yarn \
--deploy-mode cluster \  # can be client for client mode
--driver-memory 1G \ # 配置driver的内存
--executor-cores 4 \ # 配置每个executor的cpu core数量
--executor-memory 4G \ # 配置每个executor的内存大小
--num-executors 4 \ # 配置executor的数量
/path/to/examples.jar \
1000

1.deploy-mode 怎么设置?

  • cluster 模式 : 生产环境提交任务
  • client 模式 :测试用 client模式 运行在提交任务的机器上,可以直接看运行日志

备注:yarn-client模式可能会导致的网卡流量激增问题(任务task过多,频繁通信)。导致网络问题连锁反应。

2.executor-memory 怎么设置?

2.1 cache。[存储内存]

如果需要对RDD进行cache,那么更多的内存,就可以缓存更多的数据,将更少的数据写入磁盘,甚至不写入磁盘。

2.2 Shuffle。[执行内存]

对于shuffle操作,reduce端,会需要内存来存放拉去的数据,并进行聚合,如果内存不够,也会写入磁盘。executor有更多内存,就可以少写入磁盘,减少磁盘IO。

2.3 GC

对于task的执行,可能会创建很多对象。 如果内存比较小,可能会频繁导致JVM堆内存满,导致GC,minor GC和full GC。(速度很慢) 内存加大以后,带来更少的GC,避免了速度变慢,速度变快了!

3.num-executors 怎么设置?

增加executor 提高并行计算能力。

3个executor ,每个executor有2个core 那么同时能够并行执行的task就是6个.6个执行完以后,再换下一批6个task。 现在增加到10个executor,可同时并行20个task

4.executor-cores

增加executor 的core 提高并行计算能力

20个executor,2个core/e 能够并行执行 40个task 每个executor 增加到5个。能够并行执行100个task。 提升2.5倍

二、并行度优化

WHAT:

spark作业中,各个stage的task的数量

WHY:

资源浪费:资源分配充足的情况下,并行度没有与资源相匹配,导致资源浪费。

50个executor 每个executor 3个Core 的情况下。 总共150个cpu core 可以并行运行。 但是,这个stage 只有100个task(并行度)。有50个core就被浪费了。

官方推荐: task数目(并行度) 设置为core 数目的 2 ~ 3倍。因为: 有些task可能运行快一点,这几个运行完就空闲了,导致浪费。 2~3 倍 ,task 运行完,其他task 马上补过来。尽量让cpu core 不空闲。提升效率。

HOW:

SparkSession.builder().config("spark.defalut.parallelism","500")

df.repartition(500) 

二、RDD/DataSet 优化

HOW:

  1. 复用RDD/DataSet 供后面的RDD计算反复使用cache/persist
  2. 公共的RDD 一定要持久化
  3. 持久化的时候 进行序列化
  4. 选择合理的持久化级别,资源充足的情况下,双副本机制(why:task可以从另外一个副本恢复计算)

TODO

算子优化

算子优化

  1. filter过后使用coalesce减少分区数量
  2. MapPartitions代替map提升Map类操作性能
  3. 使用foreachPartition优化写数据库性能
  4. 使用repartition解决Spark SQL低并行度的性能问题
  5. 选用reduceByKey先本地聚合

累加器、广播

Shuffle 优化

配置优化


Similar Posts

Comments