- 内容提要
- 序
- 前言
- 第一部分 背景知识
- 第 1 章 Spring Data 项目
- 第 2 章 Repository:便利的数据访问层
- 第 3 章 使用 Querydsl 实现类型安全的查询
- 第二部分 关系型数据库
- 第 4 章 JPA Repository
- 第 5 章 借助 Querydsl SQL 实现类型安全的 JDBC 编程
- 第三部分 NoSQL
- 第 6 章 MongoDB: 文档存储
- 第 7 章 Neo4j:图数据库
- 第 8 章 Redis:键/值存储
- 第四部分 快速应用开发
- 第 9 章 使用 Spring Roo 实现持久层
- 第 10 章 REST Repository 导出器
- 第五部分 大数据
- 第 11 章 Spring for Apache Hadoop
- 第 12 章 使用 Hadoop 分析数据
- 第 13 章 使用 Spring Batch 和 Spring Integration 创建大数据管道
- 第六部分 数据网格
- 第 14 章 分布式数据网格:GemFire
- 关于封面
11.3 揭秘 Hello World
如果需要自行开发和运行 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 应用程序的主程序
WordCount 类也有 main 方法,在启动的时候它不会直接被 JVM 调用,而是在 ProgramDriver 的 driver 方法被调用的时候执行。WordCount 类如示例 11-9 所示。
示例 11-9 ProgramDriver 所调用的 wordcount main 方法
现在要介绍的是配置和执行 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 主应用程序
本章的示例应用程序位于目录./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 中的目录和内容
为了构建这个应用程序,需要执行 Appassembler 的 assemble target 并运行生成 wordcount shell 脚本,如示例 11-13 所示。
示例 11-13 构建、运行和查看独立的 wordcount 应用程序的输出
与使用 Hadoop 命令行不同的地方是需要在 HDFS 目录前加上 URL 模式的 dfs://前缀以及主机名称和 namenode 的端口。需要这么做的原因是,在使用 Hadoop 命令行时,会设置 Hadoop Configuration 类可识别的环境变量,并且它会在命令行参数传入的路径前面加上相关信息。请注意还有其他可用于 Hadoop 的 URL 模式。webhdfs 模式非常实用,因为它提供了一个基于 HTTP 的通讯协议来与 HDFS 进行通信,而不要求客户端(也就是我们的应用程序)以及 HDFS 服务器使用版本完全相同(要精确到发行版本的小版本号)的 HDFS 类库。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论