原文:Building Spring YARN Projects with Gradle

译者:UniKrau

校对:dyc87112

本指南主要探讨Gradle构建一个简单的Spring YARN工程

本指南集中在构建项目和模型上,不需要一个完全可用的YARN程序

你会学到什么

会创建和用Gradle编译一个YARN应用程序

准备工作

  • 大约15分钟
  • 文本编辑器或者是IDE
  • 需要JDK1.6以上版本

如何完成指南

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

如果从基础开始参考配置工程

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

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

如果不了解Gradle或者尚未安装Gradle,请参考用Gradle构建Java工程

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

建立一个Java工程,然后用Gradle编译,这个工程尽可能的简单,其目的是学会怎么使用Gradle,

创建工程目录结构

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

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

举个例子,在unix或者Linux系统下使用mkdir -p命令分别创建以下文件夹

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

第一步创建ContainerApplication类

文件路径

gs-gradle-yarn-container/src/main/java/hello/container/ContainerApplication.java

package hello.container;

import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.EnableAutoConfiguration;

@EnableAutoConfiguration
public class ContainerApplication {

    public static void main(String[] args) {
        SpringApplication.run(ContainerApplication.class, args);
    }

}

第二步创建AppmasterApplication类

文件路径

gs-gradle-yarn-appmaster/src/main/java/hello/appmaster/AppmasterApplication.java

package hello.appmaster;

import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.EnableAutoConfiguration;

@EnableAutoConfiguration
public class AppmasterApplication {

    public static void main(String[] args) {
        SpringApplication.run(AppmasterApplication.class, args);
    }

}

第三步创建ClientApplication类

文件路径

gs-gradle-yarn-client/src/main/java/hello/client/ClientApplication.java

package hello.client;

import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.EnableAutoConfiguration;

@EnableAutoConfiguration
public class ClientApplication {

    public static void main(String[] args) {
        SpringApplication.run(ClientApplication.class, args);
    }

}

在相应的目录下创建一个application.yml配置文件

gs-gradle-yarn-container/src/main/resources/application.yml
gs-gradle-yarn-appmaster/src/main/resources/application.yml 
gs-gradle-yarn-client/src/main/resources/application.yml
spring:
    yarn:
        appName: gs-yarn-gradle

<h3 id=”gradle_inital”>理解Gradle使用规则</h3>

创建build.gradle文件,在这个文件里定义好编译所需的内容

使用Spring Boot Gradle plugin,因此在build script里定义仓库和依赖

buildscript {
    repositories {
        maven { url "http://repo.spring.io/libs-release" }
    }
    dependencies {
        classpath("org.springframework.boot:spring-boot-gradle-plugin:1.3.3.RELEASE")
    }
}

gradle为整个工程提供base插件,技术上讲base插件只为整个工程编译过程进行排序,比如clean任务。但是base插件不是必须的

allprojects {
    apply plugin: 'base'
}

以下部分内容是,项目版本号为 0.1.0,而apply plugins定义了以下内容javaeclipseidea。并且repositories选项通过Maven repositories 解决所有的第三方jar的依赖问题。接下来为所有的子项目添加spring-boot plugin插件和spring-yarn-boot maven依赖属性,最后一步,创建一个copyJars 任务将生成的jar包从子项目的目录拷贝到发布工程目录gs-yarn-testing-dist,这样就更加方便简单地测试和运行程序。

subprojects { subproject ->
    apply plugin: 'java'
    apply plugin: 'eclipse'
    apply plugin: 'idea'
    version =  '0.1.0'
    repositories {
        mavenCentral()
        maven { url "http://repo.spring.io/libs-release" }
    }
    dependencies {
        compile("org.springframework.data:spring-yarn-boot:2.4.0.RELEASE")
    }
    task copyJars(type: Copy) {
        from "$buildDir/libs"
        into "$rootDir/gs-gradle-yarn-dist/target/gs-gradle-yarn-dist/"
        include "**/*.jar"
    }
    assemble.doLast {copyJars.execute()}
}

创建一个工程的时候,每一个子项目所需要依赖模块都可以在configure section进行配置,而且Gradle pluginSpring Boot自动创建一个能从新打包main jar file的任务。

project('gs-gradle-yarn-client') {
    apply plugin: 'spring-boot'
}

project('gs-gradle-yarn-appmaster') {
    apply plugin: 'spring-boot'
}

project('gs-gradle-yarn-container') {
    apply plugin: 'spring-boot'
}

和前面的步骤一样,gs-gradle-yarn-dist为其子工程提供解决编译依赖的问题。后面的指南里,在创建单元测试的时候需要这个编译步骤。

project('gs-gradle-yarn-dist') {
    dependencies {
        compile project(":gs-gradle-yarn-client")
        compile project(":gs-gradle-yarn-appmaster")
        compile project(":gs-gradle-yarn-container")
        testCompile("org.springframework.data:spring-yarn-boot-test:2.4.0.RELEASE")
        testCompile("org.hamcrest:hamcrest-core:1.2.1")
        testCompile("org.hamcrest:hamcrest-library:1.2.1")
    }
    test.dependsOn(':gs-gradle-yarn-client:assemble')
    test.dependsOn(':gs-gradle-yarn-appmaster:assemble')
    test.dependsOn(':gs-gradle-yarn-container:assemble')
    clean.doLast {ant.delete(dir: "target")}
    jar.enabled = false
}

针对以上gs-gradle-yarn-dist的部分内容,有必要再检查一遍

  • 最后将其他的artifacts一起纳入这个工程当中,然后构建一些测试,这就为什么将依赖的模块添加到其他工程当中
  • 运行测试之前Spring Boot的插件会重新打包。其前提要为其他工程的assembly任务添加test.dependsOn选项
  • clean task会包装target目录,虽说有点像maven centric的风格,但是就这个样例而言,maven和gradle都可以使用相同的工程结构,由于Hadoop测试类的限制,在target目录里要创建一些文件比较难。
  • 启用disabled jar,简化这个工程,如果只存在测试类,禁用这个jar选项将为空,当然也没必要使用disabled jar

最后再添加一个简单gradle wrapper任务,其实也不是必须的,但是有一点好处就是使用它可以不必安装gradle二进制包。

task wrapper(type: Wrapper) {
    gradleVersion = '1.11'
}

为根目录创建settings.gradle文件,将子工程名写入其中

include 'gs-gradle-yarn-client'
include 'gs-gradle-yarn-appmaster'
include 'gs-gradle-yarn-container'
include 'gs-gradle-yarn-dist'

解决Hadoop依赖

通过Maven POM项目形式Spring可以很好解决Apache Hadoop的依赖问题。默认使用的是Apache Hadoop 2.6.x但是也可以使用其他发行商的Hadoop比如 Pivotal HD, Hortonworks Data Platform or Cloudera CDH。指定好版本,Maven会自动找到正确的Hadoop发行版本的依赖关系。例如以下案例

Apache Hadoop 2.6.x

dependencies {
    compile("org.springframework.data:spring-yarn-boot:2.1.0.RELEASE")
}

Pivotal HD 2.1

dependencies {
    compile("org.springframework.data:spring-yarn-boot:2.1.0.RELEASE-phd21")
}

Hortonworks Data Platform 2.2

dependencies {
    compile("org.springframework.data:spring-yarn-boot:2.1.0.RELEASE-hdp22")
}

Cloudera CDH 5.x

dependencies {
    compile("org.springframework.data:spring-yarn-boot:2.1.0.RELEASE-cdh5")
}

Apache Hadoop 2.4.x

dependencies {
    compile("org.springframework.data:spring-yarn-boot:2.1.0.RELEASE-hadoop24")
}

Apache Hadoop 2.5.x

dependencies {
    compile("org.springframework.data:spring-yarn-boot:2.1.0.RELEASE-hadoop25")
}

编译打包应用程序

运行编译命令

gradle clean build

将会编译成三个jar文件

gs-gradle-yarn-dist/target/gs-gradle-yarn-dist/gs-gradle-yarn-client-0.1.0.jar
gs-gradle-yarn-dist/target/gs-gradle-yarn-dist/gs-gradle-yarn-container-0.1.0.jar
gs-gradle-yarn-dist/target/gs-gradle-yarn-dist/gs-gradle-yarn-appmaster-0.1.0.jar

运行这个工程

java -jar gs-gradle-yarn-dist/target/dist/gs-gradle-yarn-client-0.1.0.jar

当然还添加提交YARN框架上的代码,但是可以浏览输出的日子信息,可以通过其他的Spring YARN指南了解怎么创建可以提交到YARN上运行的完整应用程序

总结

恭喜了,现在可以通过高效的Maven构建一个简单Spring YARN工程了

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

评论 抢沙发

请登录后发表评论

    暂无评论内容