Spark基础:参数配置与内存模型

Spark基础:参数配置与内存模型

Spark参数配置的几种方式

在Spark中有多种配置属性的方式,如在代码中配置、在启动脚本spark-submit中配置、在配置文件spark-defaults.conf中配置等,优先级从高到低。在Spark中主要分为两种属性:部署相关,这类属性根据不同的集群和部署方式效果可能不一样,因此推荐放在启动脚本上;另一种是运行相关的参数,这些参数一般不随着环境的改变而改变,因此可以考虑放在配置文件中。所有的参数都可以通过 Spark UI 在环境变量页面中看到,因此如果怀疑代码环境变量有问题,可以好好检查这部分。

1 代码配置

Spark可以通过SparkConf对象或者set()方法在代码中进行参数配置。

# 使用SparkConf
val conf = new SparkConf()
.setMaster("local[2]")
.setAppName("CountingSheep")
val sc = new SparkContext(conf)
# 使用SparkSession配置
val spark = SparkSession.builder()
.config("xx","vv")
.getOrCreate()

2 启动脚本配置

在 spark-submit 和 spark-shell 启动脚本上也可以直接添加参数,如:

./bin/spark-submit
--name "My app"
--master local[4] 
--conf spark.eventLog.enabled=false
--conf "spark.executor.extraJavaOptions=-XX:+PrintGCDetails -XX:+PrintGCTimeStamps" myApp.jar

3 配置文件spark-defaults.conf

Spark应用提交时会自动读取该文件中的配置,因此可以把一些全局统一的配置放在这个配置文件中,如:

spark.master                     spark://master:7077
spark.eventLog.enabled           true
spark.eventLog.dir               hdfs://namenode:8021/directory
spark.serializer                 org.apache.spark.serializer.KryoSerializer
spark.driver.memory              5g
spark.executor.extraJavaOptions  -XX:+PrintGCDetails -Dkey=value -Dnumbers="one two three"

4 环境变量配置

有一些参数也可以通过环境变量传入,此时可以把对应的环境变量放在 conf/spark-env.sh 中,如:

HADOOP_CONF_DIR=""
YARN_CONF_DIR=""

参数格式

Spark参数支持一些标准的格式,比如时间属性和大小属性。

# 常见的时间属性:
25ms (milliseconds)
5s (seconds)
10m or 10min (minutes)
3h (hours)
5d (days)
1y (years)
# 常见的大小属性配置:
1b (bytes)
1k or 1kb (kibibytes = 1024 bytes)
1m or 1mb (mebibytes = 1024 kibibytes)
1g or 1gb (gibibytes = 1024 mebibytes)
1t or 1tb (tebibytes = 1024 gibibytes)
1p or 1pb (pebibytes = 1024 tebibytes)

6 内存管理



在Spark2.x中对内存模型进行了调整,首先针对JVM内存预留了300M左右的空间,剩余部分的内存默认60%用于存储和执行,40%用于内部元数据存储、超大记录的存储以防止OOM。存储和执行部分,50%用于持久化和广播(也叫做存储内存),50%用于shuffle、join、排序、聚合等(也叫做执行内存)。

spark.memory.fraction
默认值,0.6
用于存储和执行的内存
spark.memory.storageFraction
默认值,0.5
用于存储的内存比例。
spark.memory.offHeap.enabled
默认值,false
如果配置为true,针对某些操作spark会尝试使用堆外内存。如果开启这个参数,必须配置 spark.memory.offHeap.size
spark.memory.offHeap.size
默认值,0
堆外内存的大小。这个参数不会影响堆内存。所以如果exeuctor的总内存有固定限制,那么需要额外考虑堆外内存的部分。
spark.memory.useLegacyMode
默认值,false
是否使用老的内存管理方式。老的内存管理方式把内存固定划分成几个区域:
spark.shuffle.memoryFraction shuffle内存,默认0.2,超过的部分会刷写到磁盘。
spark.storage.memoryFraction 存储缓存数据的大小,默认0.6
spark.storage.unrollFraction 当没有足够空间时使用的这部分内存,默认0.2
spark.storage.replication.proactive
默认值,false
为RDD的block开启备份。
spark.cleaner.periodicGC.interval
默认值,30min
触发垃圾回收的频率
spark.cleaner.referenceTracking
默认值,true
开启或禁用上下文清理
spark.cleaner.referenceTracking.blocking
默认值,true
控制是否清理task