源自个人博客:kelvin-qzy.top/ 欢迎访问
背景
- 基于TPCDS的100G,500G数据进行了99SQL综合调优测试
- 测试机为物理机5台,1台为管理节点,4台为计算节点
- 可用内存约1T,核心数(vCore)200大概
基于实践,在较大数据量下至少提速了一倍。TPCDS是一个复杂的任务集合,涵盖了统计分析,数据挖掘,迭代计算等各种类型的99个SQL任务,本文是针对总体的综合调优。
重要参数
一般不用调driver的参数,部分参数是核心缩写,使用时注意全称。
执行器个数
--num-executors
推荐物理机数的2~6倍,太大呢会增加通信和Shuffle等成本
内存分配
spark.executor.memory
也不是越大越好,大概是数据量2倍,如果是内存不足,多多益善
虚拟核心数
spark.executor.cores
推荐2的整数倍,本例单个Executor给10核
默认分区数
shuffle.partitions
或 spark.default.parallelism
这个对不同SQL影响各异,一般取线程数的2~3倍最好
SQL自动分区
auto.repartition=true
开启就行
开启堆外内存
spark.memory.offHeap.enabled
& spark.memory.offHeap.size=30g
开,同时要指定大小,酌情指定
内存比例
spark.memory.fraction
默认0.6,上下调一点,大概有5%的效果提升空间
存储内存比例
spark.memory.storageFraction
默认0.5,上下调节,大概有3%的效果,也可能是误差
开启推测执行
spark.speculation=true
开启,大概有5%的提升
autoBroadcastJoinThreshold
spark.sql.autoBroadcastJoinThreshold=20m
调大,对某些任务类型有较大收益
其他(系统)参数
预读分区数
Blockdev=2048
这是Linux系统参数,调大,大概5%效果
使用zstd压缩
spark.io.compression.codec=zstd
和spark.io.compression.zstd.level=2
以空间换时间,效果不明,或有副作用
sql.codegen
spark.sql.codegen=true
效果不明显,建议开启
Shuffle缓冲大小
spark.shuffle.file.buffer=512k
没啥效果,调一下试试,万一有用
spark调度模式
spark.scheduler.mode=FAIR
默认是FIFO,凑数,有文章说有神效,提升10倍神马的
以上反复测试了挺长时间,可以调节的参数差不多就这些,其余你可以去优化一下代码,调优一下SQL,执行速度上还有改善空间。就说这么多,gg.
咸鱼今天也要努力鸭!