领先一步
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、资源管理和作业调度/监控的功能拆分为单独的守护进程。其理念是拥有一个全局的资源管理器 (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 提供三个不同的组件,YarnClient、YarnAppmaster 和 YarnContainer,它们一起可以称为 Spring YARN 应用程序。我们为所有组件提供了默认实现,同时仍然允许最终用户根据需要进行自定义。让我们快速浏览一下在 Hadoop 集群中运行某些自定义代码的非常简单的 Spring YARN 应用程序。
YarnClient 用于与 YARN 的资源管理器通信。这提供了管理操作,例如提交新的应用程序实例、列出应用程序和终止正在运行的应用程序。从 YarnClient 提交应用程序时,主要关注点与应用程序管理器的配置和启动方式相关。YarnAppmaster 和 YarnContainer 都共享相同的通用启动上下文配置逻辑,因此您将在 YarnClient 和 YarnAppmaster 配置中看到很多相似之处。类似于 YarnClient 将如何为 YarnAppmaster 定义启动上下文,YarnAppmaster 为 YarnContainer 定义启动上下文。启动上下文定义了启动容器的命令、本地化文件、命令行参数、环境变量和资源限制(内存、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,而是为所有三个组件(YarnClient、YarnAppmaster 和 YarnContainer)配置了 Spring 应用程序上下文。
我们只是触及了我们可以使用 Spring YARN 做的事情的表面。在我们准备更多博文的同时,请继续查看 GitHub 中现有的示例。基本上,要反映我们在本文中描述的概念,请参阅我们示例存储库中的 多上下文 示例。
未来的博文将涵盖诸如 单元测试 和更高级的 YARN 应用程序开发等主题。