apache-hive / 3.1.1 / reference / PluginDeveloperKit.html

Hive 插件开发人员套件

本页说明 Apache Hive 的插件开发套件或 PDK。这使开发人员无需构建 Hive 源代码构建即可构建和测试 Hive 插件。只需要一个 Hive 二进制发行版。

计划将 PDK 包含在 Hive 0.8.0 版本中。直到可用为止,请从Jenkins下载最新的快照版本;确保它包含HIVE-2244

当前,PDK 仅针对用户定义的功能(包括 UDAF 和 UDTF),尽管可以将其用于构建其他类型的插件,例如 Serdes,Importing/输出格式,存储处理程序和索引处理程序。 PDK 的测试框架当前仅支持 UDF 的自动化测试。

Example Plugin

为了演示 PDK 的运行情况,Hive 发行版包含一个examples/test-plugin目录。您可以通过转到该目录并运行来构建测试插件

ant -Dhive.install.dir=../..

这将创建一个包含已编译插件pdk-test-udf-0.1.jarbuild子目录。还有一个build/metadata目录,其中包含add-jar.sql(演示用于加载插件 jar 的命令)和class-registration.sql(演示用于从插件加载 UDF 的命令)。可以通过 Hive CLI 的-i命令行参数传递.sql 文件,以便作为初始化脚本运行。

您可以通过运行与插件关联的测试

ant -Dhive.install.dir=../.. test

如果一切顺利,您应该会看到类似以下的输出

Buildfile: /hive-0.8.0-SNAPSHOT/examples/test-plugin/build.xml

get-class-list:

test:
    [junit] Running org.apache.hive.pdk.PluginTest
    [junit] Tests run: 2, Failures: 0, Errors: 0, Time elapsed: 38.955 sec

BUILD SUCCESSFUL

该示例插件还作为主 Hive 构建的一部分进行了构建和测试,以验证 PDK 是否按预期运行。

您自己的插件

要创建自己的插件,您可以按照示例插件中的模式进行操作。让我们仔细看看。首先,build.xml

<project name="pdktest" default="package">
  <property name="plugin.libname" value="pdk-test-udf"/>
  <property name="plugin.title" value="Hive PDK Test UDF Library"/>
  <property name="plugin.version" value="0.1"/>
  <property name="plugin.vendor" value="Apache Software Foundation"/>
  <property name="function.sql.prefix" value="tp_"/>
  <import file="${hive.install.dir}/scripts/pdk/build-plugin.xml"/>
</project>

这个构建文件所做的全部工作就是定义一些变量设置,然后从 PDK 导入一个构建脚本,其余的工作(包括定义用于构建和测试插件的包和测试目标)。因此,对于您自己的插件,请相应地更改变量设置,然后将 hive.install.dir 设置为您安装 Hive 发行版的位置。

导入的 PDK 构建文件假设有关插件源结构的一些信息:

  • your-plugin-root

  • build.xml

    • src
  • Java 源文件

    • test
  • setup.sql

    • cleanup.sql

    • 测试所需的任何数据文件

对于示例插件,数据文件 onerow.txt 包含一行数据; setup.sql 创建一个名为 onerow 的表并加载数据文件,而 cleanup.sql 删除 onerow 表。 onerow 表可方便地测试 UDF。

Annotations

现在,让我们看一下 UDF 的源代码。

package org.apache.hive.pdktest;

import org.apache.hive.pdk.HivePdkUnitTest;
import org.apache.hive.pdk.HivePdkUnitTests;

import org.apache.hadoop.hive.ql.exec.Description;
import org.apache.hadoop.hive.ql.exec.UDF;
import org.apache.hadoop.io.Text;

/**
 * Example UDF for rot13 transformation.
 */
@Description(name = "rot13",
  value = "_FUNC_(str) - Returns str with all characters transposed via rot13",
  extended = "Example:\n"
  + "  > SELECT _FUNC_('Facebook') FROM src LIMIT 1;\n" + "  'Snprobbx'")
@HivePdkUnitTests(
    setup = "create table rot13_data(s string); "
    + "insert overwrite table rot13_data select 'Facebook' from onerow;",
    cleanup = "drop table if exists rot13_data;",
    cases = {
      @HivePdkUnitTest(
        query = "SELECT tp_rot13('Mixed Up!') FROM onerow;",
        result = "Zvkrq Hc!"),
      @HivePdkUnitTest(
        query = "SELECT tp_rot13(s) FROM rot13_data;",
        result = "Snprobbx")
    }
  )
public class Rot13 extends UDF {
  private Text t = new Text();

  public Rot13() {
  }

  public Text evaluate(Text s) {
    StringBuilder out = new StringBuilder(s.getLength());
    char[] ca = s.toString().toCharArray();
    for (char c : ca) {
      if (c >= 'a' && c <= 'm') {
        c += 13;
      } else if (c >= 'n' && c <= 'z') {
        c -= 13;
      } else if (c >= 'A' && c <= 'M') {
        c += 13;
      } else if (c >= 'N' && c <= 'Z') {
        c -= 13;
      }
      out.append(c);
    }
    t.set(out.toString());
    return t;
  }
}

PDK 将 Comments 解释如下:

  • @Description:向 Hive 提供有关 UDF 语法和用法的元数据。在生成的 class-registration.sql 中仅包含带有此注解的类

  • @HivePdkUnitTests:枚举一个或多个测试用例,并指定在测试用例之前和之后运行的可选设置和清除命令。

  • @HivePdkUnitTest:指定一个测试用例,包括要运行的查询和预期结果

注解允许代码和测试保持紧密联系。这对小型测试很有用。如果测试非常复杂,则可能需要围绕 Hive CLI 设置自己的脚本。

Test Execution

PDK 执行以下测试:

  • 运行顶层 cleanup.sql(以防先前的测试在中间失败)

  • 运行顶级 setup.sql

  • 对于每个带有@HivePdkUnitTests 注解的类

  • 运行类清理(如果有)

    • 运行类设置(如果有)

    • 对于每个@HivePdkUnitTest 注解,运行查询并验证实际结果是否与预期结果匹配

    • 运行类清理(如果有)

  • 运行顶级 cleanup.sql

如果在测试执行过程中遇到问题,请查看文件TEST-org.apache.hive.pdk.PluginTest.txt以获取详细信息。

Futures

  • 支持其他插件类型的 Comments

  • 添加更多 Comments 以在运行时自动验证功能参数(而不是要求开发人员为此编写命令式 Java 代码)

  • 添加 Eclipse 支持

  • 移动 Hive 内置程序以使用 PDK 进行更方便的测试(HIVE-2523)

  • 用于调用单个测试用例的命令行选项