返回介绍

11.4 使用 Spring for Apache Hadoop 的 Hello World

发布于 2025-04-22 19:57:21 字数 4453 浏览 0 评论 0 收藏 0

如果一直阅读本章到现在,你或许会感到疑惑,Spring 可以对这些应用程序做些什么呢?在本节将开始介绍 Spring for Apache Hadoop 所提供的功能来帮助你构造、配置以及运行 Hadoop 应用程序。首先要介绍的功能是使用 Spring 来配置并运行 Hadoop Job,可以将应用程序参数 外部化 (externalize)到不同的配置文件中。这能够让应用程序很容易地适应不同的运行环境 - 如开发、QA 以及生产环境 - 而不需要改变任何程序代码。

使用 Spring 来配置与运行 Hadoop job 时,可以借助 Spring 丰富的配置功能,就和使用 Spring 配置和运行的其他应用程序一样,例如属性占位符。对于像 wordcount 这样简单的应用程序,或许不必花功夫设置 Spring 应用程序上下文,但实际上构建如此简单的应用程序并不常见。应用程序通常会有几个 HDFS 操作和 MapReduce job(或等效的 Pig 和 Hive 脚本)连接在一起。同样正如 11.1 小节中“Hadoop 开发面临的挑战”所提到的,在构建完整的数据管道解决方案时,必须考虑许多其他的开发活动。以 Spring for Apache Hadoop 为基础开发的 Hadoop 应用程序为我们奠定了一个基础,可通过重用组件来应对越来越复杂的应用程序。

下面将上一节所开发的 WordCount 版本移到 Spring 容器内运行。使用 Hadoop XML 命名空间来定义 namenode 的位置并使用最少的信息来定义 org.apache.hadoop.mapreduce. Job 实例,如示例 11-14 所示。

示例 11-14 使用 Spring 的 Hadoop 命名空间定义 Hadoop job

P184a

这个配置将创建一个由 Spring 容器管理的单例 org.apache.hadoop.mapreduce.Job。在之前的一些示例中以编程的方法在 job 类中设置的属性可以从 Mapper 和 Reducer 类签名中推导出来。Spring 可以判断出 outputKeyClass 的类型是 org.apache.hadoop.io.Text 并且 outputValueClass 的类型是 org.apache.hadoop.io.IntWritable,因此不需要显式地设置这两个属性。还有许多其他类似于 Hadoop 命令行可选项的 job 属性可以进行设置(例如,Combiner、输入格式、输出格式以及通用的 job 键/值属性)。可以在 Eclipse 或者其他编辑器中使用 XML 模式的自动完成功能来查看各种可用的选项,也可以参阅 Spring for Apache Hadoop 参考文档来获取更多信息。目前 namenode 的位置、输入和输入路径都是硬编码的方式确定的,稍后会将它们提取到外部的属性文件中。

如同使用 Hadoop 命令行来运行 job,不需要在指定输入、输出路径时指明 URL 模式以及 namenode 的主机和端口。因为<configuration/>元素定义了的 URL 模式和 namenode 信息。如果想要使用 webhdfs 协议的话,可将 fs.default.name 设置成 webhdfs://localhost。也可以指定其他 Hadoop 配置项的值,如 dfs.permissions、hadoop.job.ugi,mapred.job.tracker 与 dfs.datanode.address。

要在创建 Spring 应用上下文时运行 MapReduce job,需使用工具类 JobRunner 来引用一个或者多个被 Spring 管理的 Job 对象并且将 run-atstartup 属性设置为 true。示例 11-15 是取代 org.apache.hadoop.examples.ExampleDriver 的主应用程序类。在默认情况下,这个应用程序会根据已知的目录来查找 XML 配置文件,当然,也可以提供一个引用其他配置文件位置的命令行参数来重写它。

示例 11-15 Spring 所管理的 wordcount 应用程序的主类

P185a

应用程序的示例代码位于 ./hadoop/wordcount-spring-basic 。可以像前面章节那样构建并运行这个应用程序,如示例 11-16 所示。请确保在 HDFS 中已经删除了输出文件,因为运行上一小节的 wordcount 时已经建立了输出文件。

示例 11-16 构建并运行基于 Spring 的 wordcount 应用程序

P185b

现在 Hadoop job 是由 Spring 管理的对象,它可以被注入到任意 Spring 管理的其他对象中。例如,如果要让 wordcount job 运行在 Web 应用程序中,那么可以将它注入到 Spring MVC 控制器中,如示例 11-17 所示。

示例 11-17 将 Hadoop job 注入到 WebMVC 控制器中

P185c

为了启动应用并将程序的配置参数外部化,可以使用 Spring 的属性占位符功能并且将键参数移至配置文件中,如示例 11-18 所示。

示例 11-18 使用 Spring 的 Hadoop 命名空间声明参数化的 Hadoop job

P186a

变量名称 hd.fs、wordcount.input.path 以及 wordcount.output.path 都在 hadoop-default. properties 配置文件中指定,如示例 11-19 所示。

示例 11-19 hadoop-default.properties 属性文件,为默认的开发环境设置 Hadoop 应用程序参数

P186b

这个文件位于 src/main/resources 目录下,因此构建脚本时可以在类路径中找到它。我们也创建了另外一个名为 hadoop-qa.properties 的配置文件,它定义了 QA 环境下 namenode 的位置。为了在同一台机器上运行样例,只改变输出路径的名称即可。在真实的 QA 环境中,HDFS 集群的位置以及 HDFS 输入输出路径可能会有所不同。

示例 11-20 hadoop-qa.properties 属性文件,为 QA 环境设置 Hadoop 应用程序参数

P186c

为了充分利用 Spring 对环境支持的功能,能够在不同的配置文件中实现轻松地切换,我们更改属性占位符的定义,将变量${ENV}设置为要加载的属性文件名称。在默认情况下,Spring 首先会搜索 JVM 系统属性,之后再搜索环境变量来解析变量名称。使用语法${ENV:<Default Value>}对变量指定默认值。在示例 11-21 中,如果没有设置 shell 的环境变量 ENV,那么${ENV}将使用默认值并且加载 hadoop-default.properties 属性文件。

示例 11-21 根据不同的运行环境来引用不同的配置文件

P187a

要在 QA 环境中通过命令行运行应用程序,可以执行如示例 11-22 所示的命令。注意 shell 的环境变量(ENV)是如何被设置为 QA 的。

示例 11-22 在 QA 环境中构建并运行基于 Spring 的 wordcount 应用程序

P187b

如之前的示例一样,要重新执行 Hadoop 应用程序时,一定要将结果写到一个空目录中,否则 Hadoop job 将会失败。在开发期,使用 IDE 时,如果每次启动应用程序时都要记得做这件事会让人觉得非常乏味。有一个方法可以将输出引导到新的目录,这个目录的名称以时间戳(例如 /user/gutenberg/output/2012/6/30/14/30 )来取代静态的目录名称。现在来看一下如何使用 Spring 的 HDFS 脚本特性协助我们完成这个通用的任务。

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。
列表为空,暂无数据
    我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。