更新时间:2024-07-24 GMT+08:00

开发和部署HetuEngine UDF

用户可以自定义一些函数,用于扩展SQL以满足个性化的需求,这类函数称为UDF。

本章节主要介绍开发和应用HetuEngine UDF。

MRS 3.2.1及以后版本,需要基于JDK17.0.4及以上版本开发。本章节以MRS 3.3.0版本为例。

开发HetuEngine UDF项目

本样例实现一个HetuEngine UDF,说明见下表。

表1 HetuEngine UDF说明

名称

说明

AddTwo

对输入的数字加2后返回

  1. 创建Maven项目,“groupId”配置“com.test.udf”,“artifactId”配置“udf-test”。这个两个值可根据实际情况自定义。
  2. 修改“pom.xml”文件如下:

    <project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
           <modelVersion>4.0.0</modelVersion>
           <groupId>com.test.udf</groupId>
           <artifactId>udf-test</artifactId>
           <version>0.0.1-SNAPSHOT</version>
    
           <build>
             <plugins>
                <plugin>
                    <artifactId>maven-shade-plugin</artifactId>
                    <executions>
                        <execution>
                            <phase>package</phase>
                            <goals>
                                <goal>shade</goal>
                            </goals>
                        </execution>
                    </executions>
                </plugin>
                <plugin>
                    <artifactId>maven-resources-plugin</artifactId>
                    <executions>
                        <execution>
                            <id>copy-resources</id>
                            <phase>package</phase>
                            <goals>
                                <goal>copy-resources</goal>
                            </goals>
                            <configuration>
                                <outputDirectory>${project.build.directory}/</outputDirectory>
                                <resources>
                                    <resource>
                                        <directory>src/main/resources/</directory>
                                        <filtering>false</filtering>
                                    </resource>
                                </resources>
                            </configuration>
                        </execution>
                    </executions>
                </plugin>
             </plugins>
           </build>
    </project>

  3. 创建HetuEngine UDF实现类。

    package com.xxxbigdata..hetuengine.functions;
    
    public class AddTwo {
        public Integer evaluate(Integer num) {
            return num + 2;
        }
    }

  4. 打包Maven项目,target目录下的“udf-test-0.0.1-SNAPSHOT.jar”文件即为HetuEngine UDF函数包。

    • 一个普通HetuEngine UDF必须至少实现一个evaluate()方法,evaluate方法支持重载。
    • 当前只支持入参数量小于或等于5个的HetuEngine UDF,大于5个入参的HetuEngine UDF将无法被注册。
    • 需要将所有依赖文件都打包到jar包里。
    • (可选)若用户存在HetuEngine UDF依赖的配置文件,建议将其作为资源文件放在resources目录下,即可打包到HetuEngine UDF函数包中。

部署HetuEngine UDF

要在HetuEngine中使用HetuEngine UDF,需要用户将相应的UDF函数包上传到指定HDFS路径,例如“/udf/hetuserver”。这个路径可根据实际情况自定义。

创建“/udf/hetuserver”文件夹,将UDF函数包放在“/udf /hetuserver”
  • 使用HDFS的页面上传。
    1. 使用HetuEngine用户登录FusionInsight Manager,选择“集群 > 服务 > HDFS”,进入HDFS服务页面。
    2. 在概览页签下的“基本信息”区域,单击“NameNode WebUI”后的链接,进入NameNode WebUI界面。
    3. 选择Utilities > Browse the file system,单击创建“/udf/hetuserver”
    4. 进入“/udf/hetuserver”,单击上传UDF函数包。
  • 使用HDFS命令行上传。
    1. 登录HDFS服务客户端所在节点,切换到客户端安装目录,例如“/opt/client”。

      cd /opt/client

    2. 执行以下命令配置环境变量。

      source bigdata_env

    3. 如果集群为安全模式,执行以下命令进行用户认证。普通模式集群无需执行用户认证。

      kinitHetuEngine用户

      根据回显提示输入密码。

    4. 执行如下命令创建目录,并将已准备好相应的UDF函数包上传到目录路径。

      hdfs dfs -mkdir -p /udf/hetuserver

      hdfs dfs -put ./UDF函数包 /udf/hetuserver

    5. 修改UDF函数包权限。

      hdfs dfs -chmod 644 /udf/hetuserver/UDF函数包

  • 将UDF JAR文件上传到HDFS上自定义的目录存放,要确保用户对JAR文件具有读权限,建议权限设置“chmod 644”。若希望HetuEngine服务在卸载时一并删除UDF JAR文件,那么可以将自定义的目录创建在“/user/hetuserver/”路径中。
  • 当前HetuEngine仅支持UDF JAR文件存放在“hdfs://资源URI”的HDFS中。
  • 因修改函数或增加函数而导致的重新上传JAR文件,HetuEngine会默认缓存5分钟,不会即时生效,5分钟后才会进行JAR文件的更新和重新加载。

使用HetuEngine UDF

使用客户端访问:

  1. 进入HetuEngine客户端。
  2. 执行如下命令创建HetuEngine UDF:
    CREATE FUNCTION example.namespace01.add_two (
     num integer
    )
    RETURNS integer
    LANGUAGE JAVA
    DETERMINISTIC
    SYMBOL "com.xxx.bigdata.hetuengine.functions.AddTwo"
    URI "hdfs://hacluster/udf/hetuserver/udf-test-0.0.1-SNAPSHOT.jar";
  3. 执行如下命令使用HetuEngine UDF:
    select example.namespace01.add_two(2);
    _col0
    -------
         4
    (1 row)
  • 函数实现类中通过重载方法来区分同名的不同函数,在创建HetuEngine UDF时要指定不同的函数名称。