Spark Engineer 是一个面向 Apache Spark 开发的技能,定位为资深 Apache Spark 工程师,专注于高性能分布式数据处理、优化大规模 ETL 管道以及构建生产级 Spark 应用。它适用于编写 Spark 作业、调试性能问题,或为 Apache Spark 应用配置集群设置的场景。
用途 该技能用于辅助完成 Spark 相关的工程任务,包括编写 Spark 作业、排查性能问题、配置集群设置,以及处理分布式数据。其核心目标是帮助构建高性能、生产级的 Spark 应用与大规模 ETL 管道。
主要能力 该技能围绕一套核心工作流组织:
- 分析需求:理解数据量、转换逻辑、延迟要求和集群资源。
- 设计管道:选择 DataFrame 还是 RDD,规划分区策略,识别广播机会。
- 实现:编写 Spark 代码,使用优化的转换、适当的缓存和正确的错误处理。
- 优化:分析 Spark UI,调整 shuffle 分区,消除数据倾斜,优化 join 和聚合。
- 验证:在继续之前检查 Spark UI 中的 shuffle spill;用 df.rdd.getNumPartitions() 验证分区数;如果检测到 spill 或倾斜,返回第 4 步;用生产规模数据测试,监控资源使用,验证性能目标。
该技能还提供按上下文加载的参考指南,主题包括:Spark SQL 与 DataFrame(DataFrame API、Spark SQL、schema、join、聚合)、RDD 操作(转换、动作、pair RDD、自定义分区器)、分区与缓存(数据分区、持久化级别、广播变量)、性能调优(配置、内存调优、shuffle 优化、倾斜处理)、流处理模式(Structured Streaming、watermark、有状态操作、sink)。
使用方式 该技能以工作流和参考文档的形式提供指导,并附带代码示例。示例包括:
- PySpark 快速入门迷你管道:创建 SparkSession,配置 spark.sql.shuffle.partitions 和 spark.sql.adaptive.enabled,定义显式 schema,读取 parquet,过滤、分组聚合,写入前打印分区数,最后写出结果。
- 广播 join:对小于 200 MB 的小维度表使用 broadcast 提示。
- 加盐处理数据倾斜:对倾斜键添加 salt 并在两侧构造 salted_key 后 join。
- 正确的缓存模式:仅在 DataFrame 被多次复用时缓存,立即物化并检查 Spark UI,使用完毕后 unpersist。
该技能还给出输出模板建议:实现 Spark 方案时提供完整的 Spark 代码(PySpark 或 Scala,带类型提示/类型)、配置建议(executor、内存、shuffle 分区)、分区策略说明、性能分析(预期 shuffle 大小、内存使用)以及监控建议(需要关注的关键 Spark UI 指标)。
适用场景 适用于编写 Spark 作业、调试性能问题、配置集群设置、构建大规模 ETL 管道、进行分布式数据处理,以及需要优化 join、聚合、分区、缓存和流处理的 Spark 工程任务。
限制与约束 该技能列出了必须遵守和禁止的操作。 必须做:对结构化数据处理优先使用 DataFrame API 而非 RDD;为生产管道定义显式 schema;适当分区(每个 executor 核心 200-1000 个分区);仅在多次复用时缓存中间结果;对小维度表(小于 200MB)使用广播 join;用加盐或自定义分区处理数据倾斜;监控 Spark UI 的 shuffle、spill 和 GC 指标;用生产规模数据量测试。 禁止做:对大数据集使用 collect()(会导致 OOM);在生产中跳过 schema 定义而依赖推断;不衡量收益就缓存每个 DataFrame;忽略 shuffle 分区调优(默认 200 常常不合适);在有内置函数可用时使用 UDF(慢 10-100 倍);不合并就处理小文件(小文件问题);不理解惰性求值就运行转换;忽略 Spark UI 中的数据倾斜警告。
关于收费、价格、平台支持范围等具体信息,资料中暂未提供。