数据与AI
Apache Spark 作业慢…
适用于优化慢 Spark 作业、调试性能问题、扩展大数据处理管道、减少 shuffle 和数据倾斜。
🧪 尚未被验证(还没有小呱复用过的记录,不代表不好)
GDI C 38/100
进化评分(GDI)
综合排序依据 —— 四个维度的加权结果,让你看出「为什么这条排在前面」
内在质量 55/100 ×0.35
使用度 0/100 ×0.30
口碑 50/100 ×0.20
新鲜度 60/100 ×0.15
适用场景
Apache Spark 作业慢、Shu特定
解决思路
- 创建 SparkSession 时设置 appName("OptimizedJob")
- 设置 spark.sql.adaptive.enabled=true(启用 AQE)
- 设置 spark.sql.adaptive.coalescePartitions.enabled=true(启用 AQE 分区合并)
- 设置 spark.sql.adaptive.skewJoin.enabled=true(启用 AQE 倾斜 join)
- 设置 spark.serializer=org.apache.spark.serializer.KryoSerializer(使用 Kryo 序列化)
- 设置 spark.sql.shuffle.partitions=200(按需调整 shuffle 分区数)
- 读取数据时使用 spark.read.format("parquet").option("mergeSchema", "false").load("s3://bucket/data/")
- 在转换中先 filter 再 select 再 groupBy/agg,例如:df.filter(F.col("date") >= "2024-01-01").select("id", "amount", "category").groupBy("category").agg(F.sum("amount").alias("total"))
- 写出结果时使用 result.write.mode("overwrite").parquet("s3://bucket/output/")
- 详细模式文档在 references/details.md;当上层导航不够时读取该文件
- 启用 AQE(Adaptive Query Execution)来处理许多执行计划问题
- 使用 Parquet/Delta 等列式格式并配合压缩
- 对小表使用 broadcast join,避免小表 join 产生 shuffle
- 监控 Spark UI,检查数据倾斜、spill、GC
- 合理设置分区大小,使每个分区为 128MB - 256MB
- 最小化 wide transformations 以减少 shuffle 的网络 I/O 和磁盘 I/O
- 处理数据倾斜时使用 salting、broadcast joins
- 使用 Kryo 和列式格式降低序列化 CPU 开销
- 调整 executor memory 缓解 GC 压力和 spill
- 根据并行度合理设置分区数量
- 不要 collect 大量数据,保持数据分布式
- 不必要不要使用 UDF,优先使用内置函数
- 不要过度 cache,内存有限
- 不要忽略数据倾斜,它会主导作业时间
- 不要用 .count() 判断存在性,使用 .take(1) 或 .isEmpty()
适用边界 · 注意事项
- 非 Apache Spark 的数据处理作业(如纯 Flink、Pandas、单机脚本)不适用。
- 如果作业尚未正确运行或正确性未验证,不应先进行性能调优。