Loading
0

干货|在JVM上测试Apache Kudu应用程序

尽管Kudu服务器是用C ++编写的,用于提高性能和效率,但开发人员可以用C ++,Java或Python编写客户端应用程序。为了让Java开发人员更容易创建可靠的客户端应用程序,我们在Kudu 1.9.0中添加了新的实用程序,可以轻松使用Kudu集群编写测试,不需要自己构建Kudu,不需要任何C ++知识,也不需要每次测试开始和停止Kudu集群的复杂协调。本文主要描述新的测试实用程序如何工作以及如何在应用程序测试中使用它们。

Apache Kudu

如果您对此测试有疑问,欢迎联系慧都大数据在线客服,慧都大数据提供数据采集-处理-建模-可视化分析的全方位解决方案,实现企业决策智能化!

话不多说,开始我们今天的主题。

要求

要使用新的测试实用程序,必须满足以下要求:

  • OS

    macOS El Capitan (10.11) 或以上

    CentOS 6.6+, Ubuntu 14.04+, 或其它Kudu支持的最新Linux发行版

  • JVM

    Java 8+

    注:Java 7+已弃用,但仍支持

  • 构建工具

    Maven 3.1或以上,要求支持os-maven-plugin

    Gradle 2.1或以上,要求支持osdetector-gradle-plugin

    任何其他可以从Maven下载正确jar的构建工具

构建配置

要使用Kudu测试实用程序,请在类路径中添加两个依赖项:

  • kudu-test-utils依赖
  • kudu二进制依赖

kudu-test-utils依赖项具有用于测试使用Kudu应用的实用程序。 首先,它提供了KuduTestHarness类来管理每个测试的Kudu集群的生命周期。 KuduTestHarness是一个JUnit TestRule,它不仅可以为每个测试启动和停止Kudu集群,还有方法来管理集群并获取预先配置的KuduClient实例,以便在测试时使用。

kudu-binary依赖项包含指定操作系统的原生Kudu(服务器和命令行工具)二进制文件。 为了正在运行的操作系统下载正确的工件,最简单的方法是使用插件(例如os-maven-plugin或osdetector-gradle-plugin)来检测当前的运行时环境。 KuduTestHarness将自动在类路径中查找并使用kudu-binary jar。

警告:kudu-binary模块应仅用于运行Kudu进行集成测试。它永远不应该用于在生产或开发中运行实际的Kudu服务,因为kudu-binary模块包含已从构建系统复制的本机安全相关依赖项,当运行时主机上的操作系统打补丁时并不会被修补。

Maven配置

如果您使用Maven构建项目,请将以下条目添加到项目的pom.xml文件中:

​
<build>

  <extensions>

    <!-- Used to find the right kudu-binary artifact with the Maven property ${os.detected.classifier} -->

    <extension>

      <groupId>kr.motd.maven</groupId>

      <artifactId>os-maven-plugin</artifactId>

      <version>1.6.2</version>

    </extension>

  </extensions>

</build>

 

<dependencies>

  <dependency>

    <groupId>org.apache.kudu</groupId>

    <artifactId>kudu-test-utils</artifactId>

    <version>1.9.0</version>

    <scope>test</scope>

  </dependency>

  <dependency>

    <groupId>org.apache.kudu</groupId>

    <artifactId>kudu-binary</artifactId>

    <version>1.9.0</version>

    <classifier>${os.detected.classifier}</classifier>

    <scope>test</scope>

  </dependency>

</dependencies>

Gradle配置

如果您使用Gradle构建项目,请将以下条目添加到项目的build.gradle文件中:

plugins {

  // Used to find the right kudu-binary artifact with the Gradle

  // property ${osdetector.classifier}

  id "com.google.osdetector" version "1.6.2"

}

 

dependencies {

   testCompile "org.apache.kudu:kudu-test-utils:1.9.0"

   testCompile "org.apache.kudu:kudu-binary:1.9.0:${osdetector.classifier}"

}

测试设置

正确配置项目后,可以使用kudu-test-utils和kudu-binary工件开始编写测试。 这一行代码将确保每个测试自动启动和停止真正的Kudu群集,并通过slf4j输出群集日志记录:

@Rule public KuduTestHarness harness = new KuduTestHarness();

KuduTestHarness具有获取预配置客户端,启动和停止服务器等的方法。下面是一个示例测试,展示了一些功能:

import org.apache.kudu.*;

import org.apache.kudu.client.*;

import org.apache.kudu.test.KuduTestHarness;

import org.junit.*;

 

import java.util.Arrays;

import java.util.Collections;

 

public class MyKuduTest {

  

    @Rule

    public KuduTestHarness harness = new KuduTestHarness();

 

    @Test

    public void test() throws Exception {

        // Get a KuduClient configured to talk to the running mini cluster.

        KuduClient client = harness.getClient();

 

        // Some of the other most common KuduTestHarness methods include:

        AsyncKuduClient asyncClient = harness.getAsyncClient();

        String masterAddresses= harness.getMasterAddressesAsString();

        List<HostAndPort> masterServers = harness.getMasterServers();

        List<HostAndPort> tabletServers = harness.getTabletServers();

        harness.killLeaderMasterServer();

        harness.killAllMasterServers();

        harness.startAllMasterServers();

        harness.killAllTabletServers();

        harness.startAllTabletServers();

 

        // Create a new Kudu table.

        String tableName = "myTable";

        Schema schema = new Schema(Arrays.asList(

            new ColumnSchema.ColumnSchemaBuilder("key", Type.INT32).key(true).build(),

            new ColumnSchema.ColumnSchemaBuilder("value", Type.STRING).key(true).build()

        ));

        CreateTableOptions opts = new CreateTableOptions()

            .setRangePartitionColumns(Collections.singletonList("key"));

        client.createTable(tableName, schema, opts);

        KuduTable table = client.openTable(tableName);

 

        // Write a few rows to the table

        KuduSession session = client.newSession();

        for(int i = 0; i < 10; i++) {

            Insert insert = table.newInsert();

            PartialRow row = insert.getRow();

            row.addInt("key", i);

            row.addString("value", String.valueOf(i));

            session.apply(insert);

        }

        session.close();

 

        // ... Continue the test. Read and validate the rows, alter the table, etc.

    }

有关使用KuduTestHarness的项目的完整示例,请参阅Kudu源代码存储库中的java-example项目。Kudu项目本身使用KuduTestHarness进行所有自己的集成测试。对于更复杂的示例,您可以在Kudu源代码库中探索各种Kudu集成测试。

反馈

Kudu 1.9.0是第一个提供这些测试实用程序的版本。 虽然这些实用程序简化了Kudu应用程序的测试,但总有改进的余地。

欢迎拨打慧都热线023-68661681或咨询慧都在线客服,我们将帮您转接大数据专业团队,并发送相关资料给您!