返回介绍

11.3 揭秘 Hello World

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

如果需要自行开发和运行 MapReduce 应用程序,而不是只使用“开箱即用”的程序,那么必须先了解幕后所发生的一些重要的事情。为了了解示例应用程序是如何工作的,我们应该首先查看 hadoop-examples.jar 的 META-INF/manifest.mf 文件。这个清单文件列出 Java 运行的主体类 org.apache.hadoop.examples.ExampleDriver。ExampleDriver 负责将命令行的第一个参数 wordcount 与 Java 类 org.apache.hadoop. examples.Wordcount 关联,并且使用 ProgramDriver 辅助类执行 Wordcount 的 main 方法。示例 11-8 为 ExampleDriver 的简化版本。

示例 11-8 wordcount 应用程序的主程序

P179b

P180a

WordCount 类也有 main 方法,在启动的时候它不会直接被 JVM 调用,而是在 ProgramDriver 的 driver 方法被调用的时候执行。WordCount 类如示例 11-9 所示。

示例 11-9 ProgramDriver 所调用的 wordcount main 方法

P180b

现在要介绍的是配置和执行 MapReduce 应用程序的核心代码。必要的步骤为:创建一个新的 Hadoop Configuration 对象、创建一个 Job 对象、设置 job 的一些属性,然后使用方法 waitforCompletion(…) 运行 job。当创建自己的应用程序时,Mapper 和 Reducer 类组成了你要编写的核心代码逻辑。

虽然名字显得非常通用,但 TokenizerMapper 和 IntSumReducer 是 WordCount 类的静态内部类,它们将负责计算单词数并汇总最终结果,如示例 11-10 所示。

示例 11-10 内置的 wordcount 应用程序所对应的 Mapper 与 Reducer

在 Hadoop 发布版中有许多内置的示例,ProgramDriver 工具类会根据第一个命令行参数来指定要运行的 Hadoop Job。也可以不使用 ProgramDriver 工具类,而使用标准的 Java 主应用程序来运行 WordCount,只需要对处理命令行参数的部分稍微做一些修改即可。修改后的 WordCount 如示例 11-1 所示。

示例 11-11 独立的 wordCount 主应用程序

P181b

P182a

本章的示例应用程序位于目录./hadoop/wordcount,同时还有一个 WordCount 应用程序的 Maven 构建文件。这可以让你将 WordCount 当成常规的 Java 应用程序来执行而不必使用 Hadoop 的命令行工具。使用 Maven 来构建应用程序并执行标准的 Java 主程序是按照常规 Java 应用方式开发和部署 Hadoop 的第一步,另外,还需要一个不依赖于 Hadoop 命令行的工具。Maven 构建能够使用 Appassembler( http://mojo. codehaus.org/appassembler/appassembler-maven-plugin/ )插件来产生 UNIX 和 Windows 的启动脚本,并且将所需要的依赖关系收集到本地的 lib 目录下,这个目录会作为生成脚本的类路径。

如果要使用相同的输出路径重新执行之前的 WordCount 示例,则必须首先删除已经存在的文件和目录,因为 Hadoop 不允许在已经存在的目录执行写操作。HDFS Shell 的 rmr 命令可以实现这一目标,如示例 11-12 所示。

示例 11-12 删除 HDFS 中的目录和内容

P182b

为了构建这个应用程序,需要执行 Appassembler 的 assemble target 并运行生成 wordcount shell 脚本,如示例 11-13 所示。

示例 11-13 构建、运行和查看独立的 wordcount 应用程序的输出

P182c

P166

与使用 Hadoop 命令行不同的地方是需要在 HDFS 目录前加上 URL 模式的 dfs://前缀以及主机名称和 namenode 的端口。需要这么做的原因是,在使用 Hadoop 命令行时,会设置 Hadoop Configuration 类可识别的环境变量,并且它会在命令行参数传入的路径前面加上相关信息。请注意还有其他可用于 Hadoop 的 URL 模式。webhdfs 模式非常实用,因为它提供了一个基于 HTTP 的通讯协议来与 HDFS 进行通信,而不要求客户端(也就是我们的应用程序)以及 HDFS 服务器使用版本完全相同(要精确到发行版本的小版本号)的 HDFS 类库。

发布评论

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