- 内容提要
- 序
- 前言
- 第一部分 背景知识
- 第 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.2 Hello World
wordcount 示例是介绍 Hadoop MapReduce 编程的经典案例。这个应用程序用来统计文本文件中单词出现的频率。虽然使用 UNIX 命令行,如 sed、awd、或 wc( http://en.wikipedia.org/wiki/Wc_%28Unix%29 )看上去也可以轻松完成这个任务,但使用 Hadoop 来实现的原因是可以将它扩大规模以符合 Hadoop 的分布式特性。UNIX 命令行程序可以将数据扩展到 MB 甚至 GB 的级别。然而,它们运行在单一的进程中并且受到单台机器的磁盘传输速率的限制,大约只能达到 100MB/s。读取 1TB 的数据将会花费大约两个半小时的时间。使用 Hadoop,可以将数据分布到 HDFS 集群中,可把数据增长到数百 GB、TB 甚至 PB 级别。将 1TB 的数据集分布到 100 台机器可以将读取时间缩短到两分钟之内。HDFS 会将文件分成多个部分,分别存储在 Hadoop 集群的节点中。执行数据逻辑的 MapReduce 代码会被传送到数据驻留的节点之中,在接近数据的地方执行以增加 I/O 带宽并减少全部 job 的延迟时间,这个阶段就是 MapReduce 的“Map”阶段。为了汇总每一个节点所产生的结果,在集群中有一个节点被用来将各个部分的结果“Reduce”成最终的数据集。在字数统计的示例中,各机器所累加的单词计数会汇总为最终的单词频率清单。
在执行 wordcount 时最有趣的地方是选择要输入的示例文本。Gutenberg 项目提供了从公共领域书籍中下载大量文本的便捷方法,尽管这肯定不是原作者的意图。Gutenberg 项目的目的是将公共领域书籍全面数字化,目前已有超过 39 000 本书籍可供使用。可以浏览这个项目的网站并且使用 wget 下载一些经典文献。在示例 11-1 中,我们在/tmp/gutenberg/download 目录下执行该命令。
示例 11-1 使用 wget 下载 wordcount 所需的文本
现在需要使用 HDFS Shell 命令将这些数据放入 HDFS 中。
在运行 Shell 命令前,需要安装 Hadoop( http://hadoop.apache.org/docs/r1.0.3/file_system_shell.html ),有一个很棒的 Michael Noll 在线教程能够引导你在单一机器上设置自己的 Hadoop 集群( http://www.michael-noll.com/tutorials/running-hadoop-on-ubuntu-linux-single-node-cluster )。
调用位于 Hadoop 发布版 bin 目录下的 hadoop 命令即可执行 HDFS Shell 命令。可以使用 Hadoop 命令行参数 dfs 来使用 HDFS,接在它后面的是传统的文件命令和参数,如 cat 或者 chmod。将文件从本地文件系统复制到 HDFS 的命令是 copyFromLocal,如示例 11-2 所示。
示例 11-2 复制本地文件到 HDFS
检查文件是否已经存储在 HDFS 里,使用 ls 命令,如示例 11-3 所示。
示例 11-3 浏览 HDFS 文件
我们使用 Hadoop 发布版中的示例 jar 文件来执行 wordcount 应用程序。这个应用程序的参数是要执行的应用程序的名称 - 在例子中也就是 wordcount - 之后加上 HDFS 的输入目录和输出目录,如示例 11-4 所示。
示例 11-4 使用 Hadoop 命令行工具运行 wordcount
在发送命令后,Hadoop 会执行一段时间,最后的结果放在目录/user/gutenberg/output 下。可以使用示例 11-5 的命令在 HDFS 中查看输出结果。
示例 11-5 在 HDFS 查看 wordcount 输出结果
输出文件可能会多于一个,这取决于有多少输入文件。在默认情况下,输出文件名会符合示例 11-5 所示的模式,最后一组递增数字用来表示增加到输出中的每一个文件。若要将结果从 HDFS 复制到本地系统文件中,可使用示例 11-6 的命令。
示例 11-6 将结果从 HDFS 复制到本地系统文件中
如果在 HDFS 中有多个输出文件,从 HDFS 复制数据到本地文系统文件的时候,可使用 getmerge 选项将它们合并成一个单独的文件。查看该文件的内容,会看到按字母顺序排序的单词和它们在文件中出现的次数。那些看起来有点多余的引号是 MapReduce 程序标记单词的工具。示例 11-7 为 wordcount 应用程序示例的输出。
示例 11-7 wordcount 输出文件的部分内容
在下一个章节会介绍 Hadoop 发布版中的示例应用程序是如何提交 job 给 Hadoop 的。这有助于了解开发和运行自己的应用程序时需要关注的内容。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论