数据输入输出
- 上游文件合并:
set spark.merge.files.enabled=true;
set spark.merge.files.number=500; - 合并小文件,拆大文件:
set spark.sql.files.maxPartitionBytes=1073741824;
set spark.sql.files.openCostInBytes=16777216; - 合理的压缩格式(zstd vs gzip)
- 尽量不读区冗余列
数据倾斜
- 倾斜总揽
数据倾斜首先应该从业务上入手优化,其次通过技术手段优化,例如:Spark Adaptive Execution来处理。 - GROUP BY 倾斜
GroupByKey -》ReduceByKey -》 AggregateByKey
Count(Distinct) -》Count(Group BY)
Map端文件合并 - JOIN 倾斜
过滤掉无用的倾斜Key(Null值)
倾斜Key用随机数替换(Null值)
热点Key过滤分部分Join后Union All
热点Key加随机数前缀做两阶段Join
Reduce端Join改为Map端Join
做小表扩容 - 窗口 倾斜
减少做窗口的字段子表,做完窗口再连接其他字段,让单个task数据量减少