大数据组件调优

Spark性能优化

2018-01-17  本文已影响51人  这个该叫什么呢

参考:
how-to-tune-your-apache-spark-jobs-part-1
how-to-tune-your-apache-spark-jobs-part-2
tuning_spark_streaming
Spark Streaming性能调优详解

Spark性能优化:shuffle调优
Spark性能优化:数据倾斜调优

Spark性能优化:开发调优篇
top-5-mistakes-when-writing-spark-applications 强力推荐

一 基础说明

二 Tuning Resource Allocation

Spark应用的GC调优 -->重点讲解了G1垃圾回收器的调优工作
Spark性能优化:资源调优篇
Every Spark executor in an application has the same fixed number of cores and same fixed heap size.

--executor-cores/ spark.executor.cores 提交时通过该参数设置每个executor的core数量,决定了Task的并行度
--executor-memory/spark.executor.memory 设置executor的JVM memory
--num-executors/spark.executor.instances 设置executor的数量
spark.dynamicAllocation.enabled 设置动态申请资源(value设为true),此时不要设置num-executors
spark.yarn.executor.memoryOverhead 设置堆外的memory大小

spark.dynamicAllocation.enabled

executor空闲超时后,会被移除
对于Spark Streaming,数据按时间段到达,为了防止executor频繁出现添加移除现象,应该禁用该功能。

内存格局

spark-memory.png

说明:

注意事项:

保留内存和core给hadoop ,yarn等系统运行

Slimming Down Your Data Structures

定制序列化方法,减少序列化后的存储占用
spark.serializer=org.apache.spark.serializer.KryoSerializer

三 Tuning Parallelism

分区过少时,Task数量有限,无法充分利用机器资源。
方法:

3.1 参数spark.default.parallelism

参数说明:该参数用于设置每个stage的默认task数量。这个参数极为重要,如果不设置可能会直接影响你的Spark作业性能。

参数调优建议:Spark作业的默认task数量为500~1000个较为合适。很多同学常犯的一个错误就是不去设置这个参数,那么此时就会导致Spark自己根据底层HDFS的block数量来设置task的数量,默认是一个HDFS block对应一个task。通常来说,Spark默认设置的数量是偏少的(比如就几十个task),如果task数量偏少的话,就会导致你前面设置好的Executor的参数都前功尽弃。

减少shuffle以及shuffle的数据量

以下函数应该优先于 groupByKey :

  1. combineByKey组合数据,但是组合之后的数据类型与输入时值的类型不一样。
  2. foldByKey 合并每一个 key 的所有值,在级联函数和“零值”中使用。
rdd.map(kv => (kv._1, new Set[String]() + kv._2))
    .reduceByKey(_ ++ _)

This code results in tons of unnecessary object creation because a new set must be allocated for each record. It’s better to use aggregateByKey, which performs the map-side aggregation more efficiently:

val zero = new collection.mutable.Set[String]()
rdd.aggregateByKey(zero)(
    (set, v) => set += v,
    (set1, set2) => set1 ++= set2)

四 shuffle不发生的情况

When More Shuffles are Better

当数据partition较少,数据量较大时,进行shuffle可以提高partition数量,提高并行度,从而达到提高效率的目的。

五 RDD

Spark性能优化:开发调优篇

5.1 不要将大型RDD中所有元素发送到Driver端

慎重使用collect countByKey countByValue collectAsMap等函数,使用take或者takeSample来限制数据大小的上限

六 其他

6.1 Spark优化:禁止应用程序将依赖的Jar包传到HDFS

Spark优化:禁止应用程序将依赖的Jar包传到HDFS
编辑spark-default.conf文件,添加以下内容:
spark.yarn.jar=hdfs://my/home/iteblog/spark_lib/spark-assembly-1.1.0-hadoop2.2.0.jar
也就是使得spark.yarn.jar指向我们HDFS上的Spark lib库。

上一篇 下一篇

猜你喜欢

热点阅读