我们再来看一个示例,它使用相同的 JAR,但是目的不同(在这里要试验并行的 grep)。对于这个测试,仍然使用现有的输入文件,但是要删除 output 子目录以便在测试时重新创建它:
# hadoop-0.20 fs -rmr output Deleted hdfs://localhost/user/root/output |
接下来,请求用于执行 grep 的 MapReduce 作业。在这种情况下,并行执行 grep(映射),然后组合 grep 的结果(缩减)。清单 9 给出这个使用模型的输出(为了简短,这里删除了一些输出)。注意,这里的命令请求是一个 grep,它从 input 子目录获取输入,把结果放在 output 子目录中。最后一个参数是要搜索的字符串(在这里是 'kernel')。
清单 9. 执行单词搜索计数的 MapReduce 作业 (grep)
# hadoop-0.20 jar /usr/lib/hadoop/ hadoop-0.20.2+228-examples.jar grep input output 'kernel' 10/04/30 09:22:29 INFO mapred.FileInputFormat: Total input paths to process : 2 10/04/30 09:22:30 INFO mapred.JobClient: Running job: job_201004291628_0010 10/04/30 09:22:31 INFO mapred.JobClient: map 0% reduce 0% 10/04/30 09:22:42 INFO mapred.JobClient: map 66% reduce 0% 10/04/30 09:22:45 INFO mapred.JobClient: map 100% reduce 0% 10/04/30 09:22:54 INFO mapred.JobClient: map 100% reduce 100% 10/04/30 09:22:56 INFO mapred.JobClient: Job complete: job_201004291628_0010 10/04/30 09:22:56 INFO mapred.JobClient: Counters: 18 10/04/30 09:22:56 INFO mapred.JobClient: Job Counters 10/04/30 09:22:56 INFO mapred.JobClient: Launched reduce tasks=1 10/04/30 09:22:56 INFO mapred.JobClient: Launched map tasks=3 10/04/30 09:22:56 INFO mapred.JobClient: Data-local map tasks=3 10/04/30 09:22:56 INFO mapred.JobClient: FileSystemCounters 10/04/30 09:22:56 INFO mapred.JobClient: FILE_BYTES_READ=57 10/04/30 09:22:56 INFO mapred.JobClient: HDFS_BYTES_READ=113144 10/04/30 09:22:56 INFO mapred.JobClient: FILE_BYTES_WRITTEN=222 10/04/30 09:22:56 INFO mapred.JobClient: HDFS_BYTES_WRITTEN=109 ... 10/04/30 09:23:14 INFO mapred.JobClient: Map output bytes=15 10/04/30 09:23:14 INFO mapred.JobClient: Map input bytes=23 10/04/30 09:23:14 INFO mapred.JobClient: Combine input records=0 10/04/30 09:23:14 INFO mapred.JobClient: Map output records=1 10/04/30 09:23:14 INFO mapred.JobClient: Reduce input records=1 # |
作业完成之后,检查 output 目录,找到结果文件,然后通过执行文件系统 cat 操作查看其内容(见清单 10)。
清单 10. 检查 MapReduce 作业的输出
# hadoop-0.20 fs -ls output Found 2 items drwxr-xr-x - root supergroup 0 2010-04-30 09:22 /user/root/output/_logs -rw-r--r-- 1 root supergroup 10 2010-04-30 09:23 /user/root/output/part-00000 # hadoop-0.20 fs -cat output/part-00000 17 kernel # |
基于 Web 的界面
您已经知道如何检查 HDFS 了,但是如果要寻找 Hadoop 的操作的相关信息,会发现 Web 界面很有用。位于 Hadoop 集群最上层的是 namenode,它管理 HDFS。可以通过 http://localhost:50070 查看文件系统的高层信息(比如可用空间、已用空间和可用的 datanode)以及正在运行的作业。可以通过 http://localhost:50030 深入检查 jobtracker(作业状态)。注意,在这两种情况下都引用 localhost,因为所有守护进程都在同一个主机上运行。
更进一步
本文讨论了一个简单的(伪分布式)Hadoop 集群的安装和初始配置。在这里,我选用 Cloudera 的 Hadoop 发行版是因为它简化了 Hadoop 的安装和初始配置。可以在 apache.org 找到许多 Hadoop 发行版(包括源代码)。更多信息见 参考资料。
但是,如果缺少硬件资源,无法扩展 Hadoop 集群以满足自己的需要,那么应该怎么办?由于 Hadoop 非常流行,可以很方便地在云计算基础设施中使用预构建的 Hadoop VM 和租用的服务器运行它。Amazon 在 Amazon Elastic Compute Cloud (Amazon EC2) 中提供 Amazon Machine Image (AMI) 和计算资源。另外,Microsoft 最近宣布将在它的 Windows® Azure Services Platform 中支持 Hadoop。