配置项可以分为三大类:硬件资源类、Shuffle类和Spark SQL类。
一 硬件资源类
| 配置项分类 | 子类细分 |配置项|含义| |–|--| |硬件资源类 |CPU|spark.cores.max|集群范围内满配CPU核数| |硬件资源类 |CPU|spark.executor.cores|单个Executor的内CPU核数| |硬件资源类 |CPU|spark.task.cpus|单个任务消耗的CPU核数| |硬件资源类 |CPU|spark.default.parallelism|未指定分区数时的默认并行度| |硬件资源类 |CPU|spark.sql.shuffle.partitions|数据关联、聚合操作中Reducer的并行度| |硬件资源类 |内存|spark.executor.memory|单个Executor堆内存总大小| |硬件资源类 |内存|spark.memory.offHeap.enabled|是否启用堆外内存,默认未False| |硬件资源类 |内存|spark.memory.offHeap.size|单个Executor堆外内存总大小| |硬件资源类 |内存|spark.memory.fraction|堆内内存中,用于缓存RDD和执行计算的内存比例,默认0.6| |硬件资源类 |内存|spark.memory.storageFraction|用户缓存RDD的内存占比,执行内存占比为1-spark.memory.storageFraction| |硬件资源类 |内存|spark.rdd.compress|RDD缓存是否压缩,默认不压缩| |硬件资源类 |磁盘|spark.local.dir|用户缓存RDD和Shuffle中间文件的磁盘目录|
1.1 cpu相关配置
主要是配置 并行度 和 并行计算任务。
1.1.1 并行度
并行度,是从数据触达,明确数据划分的粒度,确定分布式数据集被划分为多少份。
1.1.2 并行计算任务
并行计算任务,是从计算任务、CPU出发,指的是任一时刻整个集群能够同时计算的任务数量。
1.2 内存相关配置
1.2.1 堆内存储与堆外存储的平衡
堆外内存的传递门:**** 总之,与JVM堆内内存相比,堆外内存的优势是:可以更精确的统计内存占用、不需要垃圾回收机制、不需要序列化与反序列化。但其劣势是:紧凑的二进制格式,会使用到指针和偏移地址,当指针和偏移地址变多后,访问效率会大打折扣,并且内存泄漏的风险也会变大。 因此,对于需要处理的数据集,如果数据模式比较扁平,而且字段多是定长数据类型,便可更多的使用堆外内存;相反,如果数据模式比较复杂,嵌套结构或者变长字段很多,便可更多的使用JVM堆内内存。
1.2.2 User Memory与Spark可用内存的分配
当在JVM内平衡User Memory与Spark可用的内存时,可以考虑下应用中自定义的数据结构多不多、占比大不大?如果占比很小,可以将spark.memory.fraction配置项调高,让Spark可以享用更多的内存空间,用于分布计算和缓存分布式数据集。
1.2.3 Execution Memory 与Storage Memory的平衡
在统一内存管理模式下,spark.memory.storageFraction的设置显得没那么重要,因为无论这个参数设置多大,执行任务还是有机会抢占缓存内存,而且一旦完成抢占,就必须等到任务执行结束才会释放。
但仍然需要特别注意RDD缓存与执行效率之间的平衡,因为缓存会引入垃圾回收(GC)。
堆内内存会分为年轻代和老年代: 年轻代存储生命周期短、引用次数低的对象。 老年代则存储生命周期长,引用次数高的对象。像RDD cache这种一直缓存在内存中的数据,一定会被JVM安排到老年代。
年轻代的垃圾回收称为Young GC,老年代的垃圾回收称为Full GC。 当老年代可用内存不足时,就会出发JVM执行Full GC,在Full GC阶段,JVM会抢占应用程序执行线程,强行征用计算节点中的所有CPU线程,也就是“集中力量办大事”。当所有CPU线程都被拿去做垃圾回收工作的时候,应用程序的执行只能暂时搁置,只有等Full GC完事之后,把CPU线程释放出来,应用程序才能继续执行。
因此,在打算把大面积的内存空间用于RDD cache之前,需要衡量这么做可能会对执行效率产生影响。 如果一定要这么做,可以放弃对象值的缓存(默认是这种),该用序列化的缓存方式,序列化会把多个对象转换成一个字节数组。另外可以通过调节spark.rdd.compress这个参数,压缩RDD缓存。
1.3 磁盘相关配置
通过spark.local.dir这个配置项,允许开发者设置磁盘目录。
二 Shuffle类
三 Spark SQL类
|