GaussDB(DWS)-JavaUDF最佳实践

举报
yd_283975606 发表于 2025/09/11 20:59:42 2025/09/11
【摘要】 javaUDF函数一旦运行,便会调用jvm执行用户编写的实际的函数。jvm执行过程中一旦出现异常报错,会将报错信息返回给GaussDB,并展示报错结果。本文展示了当前javaUDF运行中遇到的常见报错与定位解决方法

1. PL/Java语言函数

GaussDB(DWS)数据库支持用户使用自己喜欢的Java IDE编写Java方法,并将包含这些方法的jar文件安装到GaussDB(DWS)数据库中,然后使用该方法。

1.1 - javaUDF使用示例

  • 编写java源文件Example.java
    本例子中实现子字符串大写转换的方法,本例中类名为Example,方法名为upperString,内容如下:
    public class Example 
    {
        public static String upperString (String text, int beginIndex, int endIndex) 
        {
            return text.substring(beginIndex, endIndex).toUpperCase();
        }
    }
  • 创建manifest.txt清单文件,文件内容如下:
    Manifest-Version: 1.0
    Main-Class: Example
    Specification-Title: “Example”
    Specification-Version: “1.0”
    Created-By: 1.6.0_35-b10-428-11M3811
    Build-Date: 08/14/2018 10:09 AM
    其中,Manifest-Version定义了manifest文件的版本,Main-Class定义了jar文件的入口类,Specification-Title和Specification-Version属于包的扩展属性,Specification-Title定义了扩展规范的标题,Specification-Version定义了扩展规范的版本,Created-By声明了该文件的生成者,Build-Date声明了该文件构建日期。

  • 最后,编译java文件并打包得到javaudf-example.jar
    javac Example.java
    jar cfm javaudf-example.jar manifest.txt Example.class

  • 部署jar包
    Jar包的部署需要omm用户在命令行中调用gs_om工具完成。以操作系统用户omm登录CN所在主机,执行source ${BIGDATA_HOME}/mppdb/.mppdbgs_profile命令启动环境变量。

    chmod 644 javaudf-example.jar
    gs_om -t javaUDF -m addjar -s javaudf-example.jar

    云上用户可以使用OBS部署,Jar包首先需要放置到OBS服务器中,放置方法具体请参见《对象存储服务控制台指南》的上传文件章节。接着创建访问密钥AK/SK,获取访问密钥的具体步骤,请参见创建访问密钥(AK和SK)章节。登录数据库,使用具有管理员权限用户运行gs_extend_library函数,将文件导入到DWS中:

    SELECT gs_extend_library(‘addjar’, ‘obs://bucket/path/javaudf-example.jar accesskey=access_key_value_to_be_replaced secretkey=secret_access_key_value_to_be_replaced region=region_name libraryname=example’);
    函数中的AK/SK值,请用户根据实际获取值替换。region_name请用户根据实际所在的区域名称替换。bucket为OBS服务器上的桶名称。

  • 使用PL/Java函数
    CREATE FUNCTION java_upperstring(VARCHAR, INTEGER, INTEGER)
    RETURNS VARCHAR
    AS ‘Example.upperString’
    LANGUAGE JAVA;

  • 执行java_upperstring函数
    SELECT java_upperstring(‘test’, 0, 1);


T
(1 row)

1.2 - javaUDF使用常见问题

javaUDF函数一旦运行,便会调用jvm执行用户编写的实际的函数。jvm执行过程中一旦出现异常报错,会将报错信息返回给GaussDB,并展示报错结果,下面列出常见的报错结果:

  1. 报错UDF Error:Unable to find static method Example.xxxx with signature()
    常见情形如下:
  • 方法名、类名或者包名有误
    例如本例中存在另外的jar包,其源码为另一版本的upperString,常见于用户不同版本java函数的开发。此时我们所加载的类可能产生随机行为,导致javaUDF实际加载到了upperString1方法,产生上述报错
    public class Example 
    {
        // 声明另一版本函数upperString1
        public String upperString1 (String text, int beginIndex, int endIndex) 
        {
            return text.substring(beginIndex, endIndex).toUpperCase();
        }
    }

解决办法:
重新确认类名和方法名是否与代码一致。例如,使用jar tf Example.jar查看当前jar的类名是否为预期

  • java源码方法不是static的
    public class Example 
    {
        // 函数upperString前少了static关键字
        public String upperString (String text, int beginIndex, int endIndex) 
        {
            return text.substring(beginIndex, endIndex).toUpperCase();
        }
    }
  • 方法被重载
    目标方法有多个重载(比如 xxx(int),xxx(String)),入参类型不清晰导致jar包与方法无法一一对应
    public class Example 
    {
        // 函数upperString重载
        public String upperString (String text, long beginIndex, long endIndex) 
        {
            return text.substring(beginIndex, endIndex).toUpperCase();
        }
    }

当upperString中beginIndex与endIndex的入参没有明确为int或long类型,将会产生预期外的代码路径。

  1. 报错UDF Error:OutOfMemoryError: java heap space
    常见情形如下:
  • 用户的业务语句中内存占用较高,超出了jvm所能使用的最大内存
    解决方法:
    1.查看当前jvm内存pljava_vmoptions参数。是否明确设置了JVM 堆大小,例如Xmx64(最大堆为 64MB)。堆设置过小,程序内存需求大时很容易报错
    2.udf_memory_limit设置不合理,udf_memory_limit默认为max(200MB, 0.05 * max_process_memory),因此常会出现用户并发执行UDF作业时产生内存不足
    3.通过监控 JVM 的内存使用曲线,定位内存峰值操作(如日志时间点、接口调用等)。
    可以在pljava_vmoptions参数加上 -XX:+HeapDumpOnOutOfMemoryError -XX:HeapDumpPath=/tmp,发生OOM时自动生成堆dump,并联系后台工程师帮助查看日志。
【声明】本内容来自华为云开发者社区博主,不代表华为云及华为云开发者社区的观点和立场。转载时必须标注文章的来源(华为云社区)、文章链接、文章作者等基本信息,否则作者和本社区有权追究责任。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。