原文:Testing YARN Application,译者:UniKrau,校对:dyc87112
写一个YARN应用程序的单元测试
本指南告诉你测试一个简单的YARN应用程序
你将学会什么
使用已经开发好的application样例,写单元测试进行验证。
你要准备什么
- 大约15分钟
- 文本编辑器或者是IDE
- JDK 1.6以上
- Gradle 2.3+或者Maven 3.0+
- 你也可以直接将代码导入到本地开发工具中:
- Spring Tool Suite (STS)
- IntelliJ IDEA
- 使用本地单实例模式,需要Hadoop 2.2.0以上的版本
测试样例程序没有必要在Hadoop实例上运行.
怎样完成这个指南
像大多数Spring 入门文章一样,你可以逐渐的完成每一步,也可以跳过一些你熟悉的步骤。不管怎样,最后你都将得到一份可执行的代码。
你可以往下查看配置工程
如果已经熟悉跳过一些基本步骤你可以这样做
- 下载并解压本指南的代码库, 或者使用Git克隆:
git clone
https://github.com/spring-guides/gs-yarn-testing.git - 使用以下命令跳转到目录
$ cd gs-yarn-testing/initial
- 直接跳转到创建一个Junit单元测试类。
完成上述步骤,你可以根据代码检查结果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开启一个有HDFS
和YARN
组件的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
单元测试。
其他类似内容
以下有用的相关链接:
- Simple YARN Application
- Simple Single Project YARN Application
- Batch YARN Application
- Restartable Batch YARN Application
- Building Spring YARN Projects with Maven
- Building Spring YARN Projects with Gradle
本文由spring4all.com翻译小分队创作,采用知识共享-署名-非商业性使用-相同方式共享 4.0 国际 许可 协议进行许可。
暂无评论内容