介绍用于开发 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、资源管理和作业调度/监控的功能拆分为单独的守护进程。其理念是拥有一个全局的资源管理器 (RM) 和一个每个应用程序的应用程序管理器 (AM)。可以在 YARN 架构 中找到 YARN 组件依赖关系的通用图表。

MapReduce 版本 2 是在 YARN 之上运行的应用程序。也可以创建类似的自定义基于 YARN 的应用程序,这些应用程序与 MapReduce 无关,它只是运行 YARN 应用程序。但是,编写自定义基于 YARN 的应用程序很困难。YARN API 是底层基础设施 API,而不是开发者 API。请查看 文档,了解编写 YARN 应用程序涉及的内容。

从 2.0 版本开始,Spring for Apache Hadoop 引入了 Spring YARN 子项目,以提供对构建基于 Spring 的 YARN 应用程序的支持。对 YARN 的这种支持通过尝试简化开发来实现。“Spring 处理基础设施,以便您可以专注于您的 应用程序”适用于编写 Hadoop 应用程序以及其他类型的 Java 应用程序。Spring 的 YARN 支持还可以更轻松地测试您的 YARN 应用程序。

使用 Spring 的 YARN 支持,您将使用 Spring 框架本身的所有熟悉概念,包括配置,以及一般而言您可以在应用程序中执行的操作。在高级别上,Spring YARN 提供三个不同的组件,YarnClientYarnAppmasterYarnContainer,它们一起可以称为 Spring YARN 应用程序。我们为所有组件提供了默认实现,同时仍然允许最终用户根据需要进行自定义。让我们快速浏览一下在 Hadoop 集群中运行某些自定义代码的非常简单的 Spring YARN 应用程序。

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

YarnContainer 是一个执行 YARN 应用程序实际操作的繁重工作的工人。YarnAppmaster 与 YARN 资源管理器通信,并相应地启动和停止 YarnContainer。

您可以创建一个 Spring 应用程序,该应用程序通过使用 YARN XML 命名空间来定义 Spring 应用程序上下文来启动 ApplicationMaster。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 及其环境定义了本地资源。类路径设置会从默认位置获取 hadoop jar 以及您自己的应用程序 jar,如果您想使用非默认目录,请更改设置。此外,在 YarnAppmaster 中,我们定义了处理容器分配和引导的组件。分配器组件与 YARN 资源管理器交互,处理资源调度。运行器组件负责分配容器的引导。

<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 应用程序上下文。

我们只是触及了我们可以使用 Spring YARN 做的事情的表面。在我们准备更多博文的同时,请继续查看 GitHub 中现有的示例。基本上,要反映我们在本文中描述的概念,请参阅我们示例存储库中的 多上下文 示例。

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

获取 Spring 新闻通讯

与 Spring 新闻通讯保持联系

订阅

领先一步

VMware 提供培训和认证,以加速您的进步。

了解更多

获得支持

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

了解更多

即将举行的活动

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

查看全部