
# 开发和部署HetuEngine UDF
#### 操作场景
HetuEngine是一个高性能实时分析数据库，支持用户自定义一些函数，用于扩展SQL以满足个性化的需求，这类函数称为UDF。
本章节主要介绍开发和应用HetuEngine UDF。
#### 约束与限制
- 本章节仅适用于MRS 3.6.0-LTS之前的版本。
- MRS 3.2.1及以后版本，需要基于JDK17.0.4及以上版本开发。本章节以MRS 3.3.0版本为例。
 
#### 开发HetuEngine UDF项目
本样例实现一个HetuEngine UDF，说明见下表。
表1HetuEngine 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* *用户*登录Manager，选择"集群 \> 服务 \> HDFS"，进入HDFS服务页面。
  
  2. 在概览页签下的"基本信息"区域，单击"NameNode WebUI"后的链接，进入NameNode WebUI界面。
  
  3. 选择"Utilities \> Browse the file system"，单击![](https://support.huaweicloud.com/cmpntguide-lts-mrs/zh-cn_image_0000001944035629.png)创建"/udf/hetuserver"。
  
  4. 进入"/udf/hetuserver"，单击![](https://support.huaweicloud.com/cmpntguide-lts-mrs/zh-cn_image_0000001910156432.png)上传UDF函数包。
   

- 使用HDFS命令行上传。
  1. 登录HDFS服务客户端所在节点，切换到客户端安装目录，例如"/opt/client"。
     ```
     cd /opt/client
     ```
     
  
  2. 执行以下命令配置环境变量。
     ```
     source bigdata_env
     ```
     
  
  3. 如果集群为安全模式，执行以下命令进行用户认证。普通模式集群无需执行用户认证。
     ```
     kinit HetuEngine用户
     ```
     根据回显提示输入密码。
     
  
  4. 执行如下命令创建目录。
     ```
     hdfs dfs -mkdir -p /udf/hetuserver
     ```
     将已准备好相应的UDF函数包上传到目录路径。
     ```
     hdfs dfs -put ./UDF函数包 /udf/hetuserver
     ```
     
  
  5. 修改UDF函数包权限。
     ```
     hdfs dfs -chmod 644 /udf/hetuserver/UDF函数包
     ```
     
   
 
![](https://support.huaweicloud.com/cmpntguide-lts-mrs/public_sys-resources/note_3.0-zh-cn.png)
- 将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)
   ```
   
![](https://support.huaweicloud.com/cmpntguide-lts-mrs/public_sys-resources/note_3.0-zh-cn.png)
- 函数实现类中通过重载方法来区分同名的不同函数，在创建HetuEngine UDF时要指定不同的函数名称。
 
