关于 spark-optimization
这是一个提供 Apache Spark 作业调优与故障排查实践的 skill,面向需要处理性能、内存、分区、shuffle 和数据倾斜的从业者。
主要功能
- 01分区大小策略
- 02内存与 executor 调优
- 03降低 shuffle 和数据倾斜
- 04Spark 执行模型概览
- 05references/details.md 中的实践示例
适用场景
- 01诊断运行缓慢的 Spark 作业
- 02调整 executor 内存与配置
- 03扩展大型数据集处理流水线
- 04减少 shuffle 与数据倾斜
安装
复制下面的命令,在终端中运行。
$
npx skills add https:/ / github.com/ full-stack-skills/ devops-skills --skill spark-optimization安装后在 Claude Code 中输入/spark-optimization确认已加载。
包含的文件
除 SKILL.md 外,安装时一起下载的参考资料和脚本。
LICENSE.txtagents/openai.yamlexamples/advanced-usage.mdbasic-usage.mdintegration.mdreferences/details.md详细介绍
来源声明:本技能内容源自 wshobson/agents (MIT License,Copyright (c) 2024 Seth Hobson;完整许可文本见同目录
LICENSE.txt)。 使用、修改与再分发须遵守该 MIT 许可条款并保留版权声明。
Apache Spark 优化
优化 Apache Spark 作业的生产实践,包括分区策略、内存管理、Shuffle 优化和性能调优。
何时使用此技能
- 优化运行缓慢的 Spark 作业
- 调优内存和执行器配置
- 实现高效的分区策略
- 调试 Spark 性能问题
- 扩展 Spark 流水线以处理大型数据集
- 减少 Shuffle 和数据倾斜
核心概念
1. Spark 执行模型
Driver Program
↓
Job (triggered by action)
↓
Stages (separated by shuffles)
↓
Tasks (one per partition)
2. 关键性能因素
| 因素 | 影响 | 解决方案 |
|---|---|---|
| Shuffle | 网络 I/O、磁盘 I/O | 尽量减少宽转换 |
| 数据倾斜 | 任务耗时不均 | 加盐、广播连接 |
| 序列化 | CPU 开销 | 使用 Kryo、列式格式 |
| 内存 | GC 压力、溢写 | 调优执行器内存 |
| 分区 | 并行度 | 合理设置分区大小 |
快速入门
from pyspark.sql import SparkSession
from pyspark.sql import functions as F
# Create optimized Spark session
spark = (SparkSession.builder
.appName("OptimizedJob")
.config("spark.sql.adaptive.enabled", "true")
.config("spark.sql.adaptive.coalescePartitions.enabled", "true")
.config("spark.sql.adaptive.skewJoin.enabled", "true")
.config("spark.serializer", "org.apache.spark.serializer.KryoSerializer")
.config("spark.sql.shuffle.partitions", "200")
.getOrCreate())
# Read with optimized settings
df = (spark.read
.format("parquet")
.option("mergeSchema", "false")
.load("s3://bucket/data/"))
# Efficient transformations
result = (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 - 自适应查询执行可以处理许多问题
- 使用 Parquet/Delta - 采用带压缩的列式格式
- 广播小表 - 避免小型连接中的 Shuffle
- 监控 Spark UI - 检查数据倾斜、溢写和 GC
- 合理设置分区大小 - 每个分区 128MB - 256MB
不应该做
- 不要收集大量数据 - 保持数据分布式处理
- 不要不必要地使用 UDF - 使用内置函数
- 不要过度缓存 - 内存有限
- 不要忽略数据倾斜 - 它会占用作业的大部分时间
- 不要用
.count()判断是否存在 - 使用.take(1)或.isEmpty()
评论
支持 Markdown