原文:Testing YARN Application,译者:UniKrau,校对:dyc87112

写一个YARN应用程序的单元测试

本指南告诉你测试一个简单的YARN应用程序

你将学会什么

使用已经开发好的application样例,写单元测试进行验证。

你要准备什么

测试样例程序没有必要在Hadoop实例上运行.

怎样完成这个指南

像大多数Spring 入门文章一样,你可以逐渐的完成每一步,也可以跳过一些你熟悉的步骤。不管怎样,最后你都将得到一份可执行的代码。

你可以往下查看配置工程

如果已经熟悉跳过一些基本步骤你可以这样做

$ cd gs-yarn-testing/initial 

完成上述步骤,你可以根据代码检查结果gs-yarn-testing/complete

如果不了解Gradle,请参考Building Java Projects with Gradle

<h2 id=”set_up”> 配置工程 </h2>

本指南重点在用JUnit测试样例程序。这个gradle工程以及所有的程序文件都是基于这个样例YARN Basic Sample,剩下的事情只需创建一个JUnit测试类 。

首先配置脚本,可以使用Gradle或者Maven工具构建Spring app. 如果不熟悉请参考Building Java Projects with Gradle或者Building Java Projects with Maven

另外还有关于构建Spring YARN工程的指南说明。如果不熟悉,请阅读Building Spring YARN Projects with Gradle or Building Spring YARN Projects with Maven.

创建工程目录结构

在你选择的项目目录中,创建以下子目录结构

├── gs-yarn-testing-appmaster
│   └── src
│       └── main
│           ├── resources
│           └── java
│               └── hello
│                   └── appmaster
├── gs-yarn-testing-container
│   └── src
│       └── main
│           ├── resources
│           └── java
│               └── hello
│                   └── container
├── gs-yarn-testing-client
│   └── src
│       └── main
│           ├── resources
│           └── java
│               └── hello
│                   └── client
└── gs-yarn-testing-dist
    └── src
        └── test
            └── java
                └── hello

例如在Unix或者Linux系统下

mkdir -p gs-yarn-testing-appmaster/src/main/resources
mkdir -p gs-yarn-testing-appmaster/src/main/java/hello/appmaster
mkdir -p gs-yarn-testing-container/src/main/resources
mkdir -p gs-yarn-testing-container/src/main/java/hello/container
mkdir -p gs-yarn-testing-client/src/main/resources
mkdir -p gs-yarn-testing-client/src/main/java/hello/client
mkdir -p gs-yarn-testing-dist/src/test/java/hello

创建一个gradle编译文件

可以参考这个initial Gradle build file.

<h3 id=”junit_class”>创建一个JUnit单元测试类</h3>

gs-yarn-testing-dist/src/test/java/hello/AppIT.java

package hello;

import static org.hamcrest.CoreMatchers.containsString;
import static org.hamcrest.CoreMatchers.is;
import static org.hamcrest.CoreMatchers.notNullValue;
import static org.hamcrest.MatcherAssert.assertThat;
import static org.hamcrest.Matchers.greaterThan;
import hello.client.ClientApplication;

import java.io.File;
import java.util.List;
import java.util.concurrent.TimeUnit;

import org.apache.hadoop.yarn.api.records.YarnApplicationState;
import org.junit.Test;
import org.springframework.core.io.Resource;
import org.springframework.yarn.boot.test.junit.AbstractBootYarnClusterTests;
import org.springframework.yarn.test.context.MiniYarnClusterTest;
import org.springframework.yarn.test.junit.ApplicationInfo;
import org.springframework.yarn.test.support.ContainerLogUtils;

@MiniYarnClusterTest
public class AppIT extends AbstractBootYarnClusterTests {

    @Test
    public void testApp() throws Exception {
        String[] args = new String[] {
            "--spring.yarn.client.files[0]=file:target/gs-yarn-testing-dist/gs-yarn-testing-container-0.1.0.jar",
            "--spring.yarn.client.files[1]=file:target/gs-yarn-testing-dist/gs-yarn-testing-appmaster-0.1.0.jar" };
        ApplicationInfo info = submitApplicationAndWait(ClientApplication.class, args, 120, TimeUnit.SECONDS);
        assertThat(info.getYarnApplicationState(), is(YarnApplicationState.FINISHED));

        List<Resource> resources = ContainerLogUtils.queryContainerLogs(
                getYarnCluster(), info.getApplicationId());
        assertThat(resources, notNullValue());
        assertThat(resources.size(), is(4));

        for (Resource res : resources) {
            File file = res.getFile();
            String content = ContainerLogUtils.getFileContent(file);
            if (file.getName().endsWith("stdout")) {
                assertThat(file.length(), greaterThan(0l));
                if (file.getName().equals("Container.stdout")) {
                    assertThat(content, containsString("Hello from HelloPojo"));
                }
            } else if (file.getName().endsWith("stderr")) {
                assertThat("stderr with content: " + content, file.length(), is(0l));
            }
        }
    }

}

接下来一步一步分解JUnit类。不过之前提到过不需要Hadoop实例,是因为Spring YARN的测试框架很方便地开启一个独立地mini cluster测试环境

  • 命名一个AppIT类,运行编译tests的时候,它能兼容gradle和maven。编译的时候。如果Tests添加了artifacts标识,那么只能用jar的形式运行并且通过`Spring Boot的repackage插件完成这件事情。
  • 由于test运行的是一个gs-yarn-testing-dist 工程,所以要用spring.yarn.client.files覆盖application.yml的配置
  • @MiniYarnClusterTest是一个composed注解,它能使Spring开启一个有HDFSYARN组件的Hadoop mini Cluster,Hadoop的配置文件能从mini cluster 自动的注入测试上下文
  • AbstractBootYarnClusterTests这个类包含类许多test需要的基本功能。

发布程序到miniCluster上

  • submitApplicationAndWait()方法调用了ClientApplication并且它具有发布程序的功能。默认等待60秒然后返回当前的状态
  • 程序的各个运行状态无误

在miniCluster上,可以通过ContainerLogUtils找到container的日志文件

  • assert日志文件的行数
  • 日志文件记录了相关内容
  • stderr是个空文件

运行测试

使用gradle命令:

./gradlew clean build

使用maven命令:

mvn clean package

可以通过日志目录的YARN container的输出日志,检查测试是否执行成功:

$ find gs-yarn-testing-dist/target/|grep std
target/yarn--1502101888/yarn--1502101888-logDir-nm-0_0/application_1392395851515_0001/container_1392395851515_0001_01_000002/Container.stdout
target/yarn--1502101888/yarn--1502101888-logDir-nm-0_0/application_1392395851515_0001/container_1392395851515_0001_01_000002/Container.stderr
target/yarn--1502101888/yarn--1502101888-logDir-nm-0_0/application_1392395851515_0001/container_1392395851515_0001_01_000001/Appmaster.stdout
target/yarn--1502101888/yarn--1502101888-logDir-nm-0_0/application_1392395851515_0001/container_1392395851515_0001_01_000001/Appmaster.stderr
$ grep Hello gs-yarn-testing-dist/target/yarn--1502101888/yarn--1502101888-logDir-nm-0_0/application_1392395851515_0001/container_1392395851515_0001_01_000002/Container.stdout
[2014-02-14 16:37:54.278] boot - 18453  INFO [main] --- HelloPojo: Hello from HelloPojo
[2014-02-14 16:37:54.278] boot - 18453  INFO [main] --- HelloPojo: About to list from hdfs root content
[2014-02-14 16:37:55.157] boot - 18453  INFO [main] --- HelloPojo: FileStatus{path=hdfs://localhost:33626/; isDirectory=true; modification_time=1392395854968; access_time=0; owner=jvalkealahti; group=supergroup; permission=rwxr-xr-x; isSymlink=false}
[2014-02-14 16:37:55.157] boot - 18453  INFO [main] --- HelloPojo: FileStatus{path=hdfs://localhost:33626/app; isDirectory=true; modification_time=1392395854968; access_time=0; owner=jvalkealahti; group=supergroup; permission=rwxr-xr-x; isSymlink=false}

总结

恭喜!现在已经能写Spring YARN工程的JUnit单元测试。

其他类似内容

以下有用的相关链接:

本文由spring4all.com翻译小分队创作,采用知识共享-署名-非商业性使用-相同方式共享 4.0 国际 许可 协议进行许可。

评论 抢沙发

请登录后发表评论

    暂无评论内容