| 在标准函数无法满足业务场景时,UDF 是常见的扩展手段。本文基于客户版实践,整理了从开发到部署的关键步骤,并附常见问题与风险提示,方便团队快速落地。 一、先理解原理:为什么能在观远里用 UDF? 观远 Galaxy 基于 Spark 构建,而 Spark 支持集成 Hive UDF/UDAF/UDTF。 因此,客户可将自定义 Jar 注册为 Spark SQL 函数,再在 ETL/数据集/卡片计算字段中调用。 核心注册方式类似: ```sql CREATE TEMPORARY FUNCTION <函数名> AS '<类全名>'; ``` 二、开发阶段(客户侧) 1)依赖引入 建议引入: - `org.apache.hive:hive-exec:2.3.9` - `scope=provided` 示例: ```xml <dependency> <groupId>org.apache.hive</groupId> <artifactId>hive-exec</artifactId> <version>2.3.9</version> <scope>provided</scope> </dependency> ``` 2)编写 UDF 类 继承 Hive `UDF`,在 `evaluate` 中实现业务逻辑。例如手机号脱敏: ```java package com.guandata.udf; import org.apache.hadoop.hive.ql.exec.UDF; public class HiveUDFExample extends UDF { public String evaluate(String mobile) { if (mobile != null && mobile.length() == 11) { return mobile.replaceAll("(\\w{3})\\w*(\\w{4})", "$1*****$2"); } return mobile; } } ``` 3)打包与自检 - 推荐 Java 11 打包(至少 Java 8)。 - 执行 `mvn clean package`。 - 发布前建议检查: - `target/classes` 是否含目标 class。 - `jar tf` / `jar xvf` 是否能看到目标 class。 三、部署阶段(运维侧) 1)准备配置文件 准备 `udfConfig.json`: ```json [ { "className": "com.guandata.udf.HiveUDFExample", "functionName": "encrypt_mobile", "udfType": "HIVE" } ] ``` 2)上传文件 将以下文件上传到 Job Engine: - UDF Jar - `udfConfig.json` 目录建议:`/guandata-store/udf/` 3)修改 Job Engine 配置 在 `spark-job-engine-configmap.yaml` 的 `spark-submit` 中加入 Jar: ```bash /opt/spark/bin/spark-submit \ --jars "/app/*.jar,/guandata-store/udf/*.jar" \ ... ``` CDH Cluster 模式下还需: - `--file /guandata-store/udf/udfConfig.json` - `--driver-java-options "...-Dguandata.udf.config=udfConfig.json..."` 配置完成后重启 Job Engine。 四、上线后可用位置 重启生效后,UDF 可用于: - ETL SQL 算子 - ETL 计算字段 - Guan-Index 数据集计算字段 - 基于 Guan-Index 的卡片计算字段 五、常见问题 1. 是否支持 UDF/UDAF/UDTF? 支持,但 UDAF/UDTF 对代码能力要求更高,应额外评估性能与稳定性。 2. 加密和解密能否同类注册两个函数? 通常不建议。若需要两个函数名,建议拆成两个类分别注册。 3. 上传后函数报错怎么办? 优先排查:UDF 继承规范、Java 版本、Jar 内容、json 配置、提交参数、服务重启。 4. hive-exec 冲突怎么处理? 这是依赖治理问题,需在客户侧解决,并确保与运行环境版本匹配。 六、风险提示(请务必确认) UDF 确实拓展了在产品上的自由度,但因为 UDF 会把客户自己代码引入到观远产品中,这部分逻辑完全依赖于客户自己的代码水平,所以它会给整个系统在性能与安全引入一些风险,这部分风险是需要客户自己去评估和把握。 一般情况,我们并不建议 Hive 开发经验较少客户使用这个 feature。请谨慎使用。 七、服务边界说明 Spark UDF 功能不属于观远 Galaxy 标准合同能力,默认不在常规运维服务支持范围内(特殊约定除外)。通常仅提供 Jar 安装部署支持。 |