抢占先机
VMware 提供培训和认证,助您突飞猛进。
了解更多我们非常高兴地宣布,作为 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 提供了三个不同的组件:YarnClient、YarnAppmaster 和 YarnContainer,它们合起来可以称为 Spring YARN 应用程序。我们为所有组件提供了默认实现,同时仍给最终用户按需定制的选项。让我们快速看看一个非常简单的 Spring YARN 应用程序,它在 Hadoop 集群中运行一些自定义代码。
YarnClient 用于与 YARN 的 Resource Manager 通信。它提供管理操作,如提交新的应用程序实例、列出应用程序和终止正在运行的应用程序。从 YarnClient 提交应用程序时,主要关注的是 Application Master 如何配置和启动。YarnAppmaster 和 YarnContainer 都共享相同的通用启动上下文配置逻辑,因此您会在 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,而是在为所有三个组件:YarnClient、YarnAppmaster 和 YarnContainer 配置 Spring Application Context。
我们刚刚触及了 Spring YARN 的皮毛。在我们准备更多博文的同时,您可以去 GitHub 查看现有示例。基本上,为了体现我们在本博文中描述的概念,请查看我们示例仓库中的 multi-context 示例。
未来的博文将涵盖诸如 单元测试 以及更高级的 YARN 应用程序开发等主题。