高性能 Spark UDF 开发手册

一、 架构设计篇:做减法

在写代码之前,先问自己:这个逻辑必须在 UDF 里做吗?

  • 过滤先行 :在调用 UDF 之前,先用 SQL 过滤掉 NULL、空字符串或明显异常的超长数据。
  • 并行度治理 :如果数据总量不大但 Task 极多(如你的 9 万个 Task),在 UDF 执行前调用 .coalesce(适当分区数)。减少 Task 切换和广播变量重复初始化的开销。
  • 拆分"大数组" :如果单行数据包含巨大数组(如 applicants 过长),考虑先在 SQL 层 explode 炸开,处理完后再聚合,避免单行数据卡死单个 Executor。

二、 初始化篇:利用 initBroadCast

initBroadCast 是"一次性"的准备工作,要在这里完成所有昂贵的操作。

  • 广播变量 (Broadcast):用于加载几百 MB 以内的只读映射表。它能避免几万个 Task 重复下载数据。

  • 工具类单例化 :类似 AddressParseUtils 这种工具类,在 initBroadCast 中初始化一次,作为类成员变量供 call 复用。

  • 预编译正则禁止 在循环内使用 str.replaceAll("regex", "")。必须在类成员位置预编译:

    private static final Pattern MY_PATTERN = Pattern.compile("...");


三、 执行篇:内存与 CPU 的"极致压榨"

call() 方法每秒可能被调用数万次,这里的代码必须"滴水不漏"。

  • 对象复用 (Zero-Allocation)
    • 不要 在循环内 new Entity()new ArrayList()new Map()
    • 做法 :在类成员定义一个 reuseEntity,每次循环调用 set 方法重置它的值。
  • 告别语法糖
    • 禁用 Java 8 Stream API (.stream().filter().findFirst())。
    • 做法 :回归最原始的 for 循环。流操作产生的中间对象是海量 GC 的罪魁祸首。
  • 字符串调优
    • 字符串是不可变的,连续的 replace()toUpperCase() 会产生大量垃圾对象。
    • 大量拼接时使用 StringBuilder 且手动 setLength(0) 复用。

四、 性能诊断篇:通过 Spark UI 看穿本质

当任务变慢时,盯着这几个指标:

  • GC Time:如果 GC 时间超过 Task Duration 的 10%,说明你的 UDF 产生了太多临时对象,或者广播变量太大。
  • Duration (Max vs Median):如果 Max 远大于 Median,说明存在数据倾斜。检查是否某些行的数据量(如数组长度)异常大。
  • Input Size / Records :查看每个 Task 处理的数据分布,如果每个 Task 只有几 KB,说明分区太多,需要 coalesce

五、 避坑口诀(开发 Checklist)

一禁: 禁用循环内 new 对象。

二禁: 禁用循环内 Stream 流。

三禁: 禁用循环内正则编译。

一复: 复用成员变量与工具类。

二复: 复用静态常量与映射 Map。

相关推荐
木辰風4 小时前
PLSQL自定义自动替换(AutoReplace)
java·数据库·sql
Juicedata4 小时前
JuiceFS 企业版 5.3 特性详解:单文件系统支持超 5,000 亿文件,首次引入 RDMA
大数据·人工智能·机器学习·性能优化·开源
heartbeat..4 小时前
Redis 中的锁:核心实现、类型与最佳实践
java·数据库·redis·缓存·并发
蚁巡信息巡查系统4 小时前
网站信息发布再巡查机制怎么建立?
大数据·人工智能·数据挖掘·内容运营
4 小时前
java关于内部类
java·开发语言
好好沉淀4 小时前
Java 项目中的 .idea 与 target 文件夹
java·开发语言·intellij-idea
gusijin4 小时前
解决idea启动报错java: OutOfMemoryError: insufficient memory
java·ide·intellij-idea
To Be Clean Coder4 小时前
【Spring源码】createBean如何寻找构造器(二)——单参数构造器的场景
java·后端·spring
云边云科技_云网融合4 小时前
AIoT智能物联网平台:架构解析与边缘应用新图景
大数据·网络·人工智能·安全
吨~吨~吨~4 小时前
解决 IntelliJ IDEA 运行时“命令行过长”问题:使用 JAR
java·ide·intellij-idea