介绍用于开发 Apache Hadoop YARN 应用程序的 Spring YARN 框架

发布 | Janne Valkealahti | 2013 年 9 月 10 日 | ...

我们非常高兴地宣布,作为 Spring for Apache Hadoop 2.0 M1 版本 的一部分,我们发布了对编写基于 YARN 的应用程序的支持。在这篇博文中,我将向您介绍 YARN,它能做什么,以及 Spring 如何简化基于 YARN 的应用程序的开发。

如果您在过去一两年一直在关注 Hadoop 社区,您可能已经看到很多关于 YARN 和 Hadoop MapReduce 下一个版本 MapReduce v2 的讨论。YARN(Yet Another Resource Negotiator,另一种资源协商者)是 MapReduce 项目的一个组件,旨在克服 Hadoop 原始设计中的一些性能问题。MapReduce v2 的基本思想是将 JobTracker 的功能,即资源管理和作业调度/监控,分解成独立的守护进程。其思想是拥有一个全局的 Resource Manager (RM) 和一个每个应用程序的 Application Master (AM)。YARN 组件依赖关系的通用图表可以在 YARN 架构中找到。

MapReduce Version 2 是一个运行在 YARN 之上的应用程序。也可以开发类似的自定义基于 YARN 的应用程序,它们与 MapReduce 没有关系,它只是运行 YARN 应用程序。然而,编写一个自定义的基于 YARN 的应用程序是困难的。YARN API 是低级基础设施 API,而不是开发者 API。要了解开发 YARN 应用程序涉及的内容,请查看 文档

从 2.0 版本开始,Spring for Apache Hadoop 引入了 Spring YARN 子项目,以提供构建基于 Spring 的 YARN 应用程序的支持。这项对 YARN 的支持旨在让开发更容易。“Spring 处理基础设施,以便您可以专注于您的 应用程序” 这句话不仅适用于编写其他类型的 Java 应用程序,也适用于编写 Hadoop 应用程序。Spring 的 YARN 支持也使得测试您的 YARN 应用程序变得更容易。

借助 Spring 的 YARN 支持,您将使用 Spring Framework 本身所有熟悉的概念,包括配置,以及更广泛地讲,您在应用程序中可以做什么。从高层次上看,Spring YARN 提供了三个不同的组件:YarnClientYarnAppmasterYarnContainer,它们合起来可以称为 Spring YARN 应用程序。我们为所有组件提供了默认实现,同时仍给最终用户按需定制的选项。让我们快速看看一个非常简单的 Spring YARN 应用程序,它在 Hadoop 集群中运行一些自定义代码。

YarnClient 用于与 YARN 的 Resource Manager 通信。它提供管理操作,如提交新的应用程序实例、列出应用程序和终止正在运行的应用程序。从 YarnClient 提交应用程序时,主要关注的是 Application Master 如何配置和启动。YarnAppmasterYarnContainer 都共享相同的通用启动上下文配置逻辑,因此您会在 YarnClient 和 YarnAppmaster 配置中看到很多相似之处。就像 YarnClient 定义 YarnAppmaster 的启动上下文一样,YarnAppmaster 定义 YarnContainer 的启动上下文。启动上下文定义了启动容器的命令、本地化文件、命令行参数、环境变量和资源限制(内存、CPU)。

YarnContainer 是一个工作者,负责完成 YARN 应用程序实际执行的繁重工作。YarnAppmaster 与 YARN Resource Manager 通信,并相应地启动和停止 YarnContainer。

您可以使用 YARN XML 命名空间定义 Spring Application Context,从而创建启动 ApplicationMaster 的 Spring 应用程序。YarnClient 的上下文配置定义了 YarnAppmaster 的启动上下文。这包括 YarnAppmaster 及其环境设置所需的资源和库。示例如下所示。

<yarn:configuration />

<yarn:localresources>
  <yarn:hdfs path="/path/to/my/libs/*.jar"/>
</yarn:localresources>

<yarn:environment>
  <yarn:classpath/>
</yarn:environment>

<yarn:client app-name="my-yarn-app">
  <yarn:master-runner />
</yarn:client>

注意:未来的版本将提供基于 Java 的配置 API,类似于 Spring Security 3.2 中所做的工作

YarnAppmaster 的目的是控制正在运行的应用程序的实例。YarnAppmaster 负责控制其所有 YarnContainer 的生命周期、应用程序提交后整个运行的应用程序,以及其自身的生命周期。

<yarn:configuration />

<yarn:localresources>
  <yarn:hdfs path="/path/to/my/libs/*.jar"/>
</yarn:localresources>

<yarn:environment>
  <yarn:classpath/>
</yarn:environment>

<yarn:master>
  <yarn:container-allocator/>
  <yarn:container-runner/>
</yarn:master>

上面的示例定义了 YarnAppmaster 的上下文配置。与我们在 YarnClient 配置中看到的类似,我们为 YarnContainer 定义了本地资源及其环境。classpath 设置会从默认位置加载 hadoop jar 包以及您自己的应用程序 jar 包,如果您想使用非默认目录,请更改该设置。此外,在 YarnAppmaster 中,我们定义了处理容器分配和引导的组件。Allocator 组件与 YARN 资源管理器交互,处理资源调度。Runner 组件负责已分配容器的引导。

<yarn:container container-class="org.example.MyCustomYarnContainer"/>

上面的示例定义了一个简单的 YarnContainer 上下文配置。

要实现容器的功能,您需要实现 YarnContainer 接口。YarnContainer 接口类似于 Java 的 Runnable 接口,它有一个 run() 方法,以及两个额外的与获取环境和命令行信息相关的方法。

下面是一个简单的 hello world 应用程序,它将在 YARN 容器内运行

public class MyCustomYarnContainer implements YarnContainer {

  private static final Log log = LogFactory.getLog(MyCustomYarnContainer.class);

  @Override
  public void run() {
    log.info("Hello from MyCustomYarnContainer");
  }

  @Override
  public void setEnvironment(Map<String, String> environment) {}

  @Override
  public void setParameters(Properties parameters) {}

}

我们刚刚展示了 Spring YARN 应用程序的配置和核心应用程序逻辑,那么剩下的就是如何引导应用程序在 Hadoop 集群中运行。CommandLineClientRunner 实用类提供了此功能。

您可以通过命令行手动使用 CommandLineClientRunner,也可以在自己的代码中使用它。

# java -cp <mile long classpath> org.springframework.yarn.client.CommandLineClientRunner application-context.xml yarnClient -submit

Spring YARN 应用程序被打包成一个 jar 文件,然后可以与其余的依赖项一起传输到 HDFS 中。YarnClient 可以在应用程序提交过程中将所有需要的库传输到 HDFS,但一般来说,建议手动完成此操作,以避免不必要的网络 I/O。您的应用程序在创建新版本之前不会更改,因此可以在第一次应用程序提交之前将其复制到 HDFS 中。例如,您可以使用 Hadoop 的 hdfs dfs -copyFromLocal 命令。

下面您可以看到一个典型的项目设置示例。

src/main/java/org/example/MyCustomYarnContainer.java
src/main/resources/application-context.xml
src/main/resources/appmaster-context.xml
src/main/resources/container-context.xml

大胆猜测一下,我们敢打赌您现在已经明白您实际上不是在配置 YARN,而是在为所有三个组件:YarnClientYarnAppmasterYarnContainer 配置 Spring Application Context。

我们刚刚触及了 Spring YARN 的皮毛。在我们准备更多博文的同时,您可以去 GitHub 查看现有示例。基本上,为了体现我们在本博文中描述的概念,请查看我们示例仓库中的 multi-context 示例。

未来的博文将涵盖诸如 单元测试 以及更高级的 YARN 应用程序开发等主题。

获取 Spring 新闻简报

订阅 Spring 新闻简报保持联系

订阅

抢占先机

VMware 提供培训和认证,助您突飞猛进。

了解更多

获取支持

Tanzu Spring 在一个简单的订阅中提供对 OpenJDK™、Spring 和 Apache Tomcat® 的支持和二进制文件。

了解更多

即将举行的活动

查看 Spring 社区中所有即将举行的活动。

查看全部