通过前面的讲解,我们搭建了属于自己的Hadoop分布式计算环境。但目前所使用的是Hadoop自带的程序包,这些程序都是通过Hadoop的MapReduce框架编写的示例程序,下面利用MapReduce框架编写一个程序。
MapReduce框架主要对<key,value>(键值对)进行操作,即该框架将输入参数视为一个由<key,value>组成的集合,并且输出结果也是由<key,value>组成的集合。
在Hadoop中键值与键值所对应的数据值都需要被序列化后才可以使用,Hadoop提供多种序列化键值对的方法,默认的序列化方法需要用户实现Writable接口。另外,键值一般要可排序,这就需要实现WritableComparable接口。
一个典型的MapReduce工作输入和输出如下所示:
(输入)<k1,v1>→map→<k2,v2>→combine→<k2,v2>→reduce→<k3,v3>(输出)
1)Mapper通过HDFS得到需要处理的文件。
2)对文件的每一行进行map处理。
3)Combiner(组合)对map的结果进行预处理(可选)。
4)Mapper的最终结果将以文件形式放到本地文件系统,等待Reducer获取。
5)Reducer根据具体应用逻辑向JobTracker查询所需的文件在哪个计算节点上,通过Http方式获取所需的数据。
6)Reducer根据Key值处理Mapper的输出结果。
7)Reducer将最终结果以文件形式输出到HDFS上。
现在以WordCount为例介绍MapReduce编程接口。WordCount程序的目的是统计文件中关键字出现的次数,它可以被用在搜索引擎中,针对关键字所涉及的项目进行统计。该程序的代码如代码清单3-6所示。
【代码清单3-6】
可以使用命令编译并打包程序,如下所示。
创建wordcount_classes文件夹。(www.xing528.com)
编译程序。
打包程序。
这里使用/user/skater/wordcount/input作为输入文件夹,Mapper会遍历该文件夹下所有的文件。/user/skater/wordcount/output作为Reducer输出文件夹,输入文件夹内容如代码清单3-7所示:
【代码清单3-7】
执行应用,如代码清单3-8所示。
【代码清单3-8】
输出结果:
我们也可以通过Eclipse集成环境执行应用。单击RunAs→RunOnHadoop,如图3-9所示选择Hadoop集群。
图3-9 使用Eclipse开发环境执行WordCount程序
本节我们学习了Hadoop自带的例子,对Hadoop的使用有了初步了解。Hadoop通过支持MapReduce框架为应用程序提供了易于理解的并行编程模型。同时,Hadoop拥有比较好的社区论坛,并且代码开源,这为我们学习使用Hadoop带来了一定的便捷。
在早期使用Hadoop时没有正式的商业厂商支持,当遇到问题时,很难快速得到技术支持。笔者在使用Hadoop的过程中碰到过一些问题,其中有的问题通过它的日志文件没法立刻解决,最终通过求助于Hadoop社区、搜索、读源代码等方式解决了问题,但花费时间较长。从2011年起,Cloudera、PlatformComputing等众多公司都提供了相应的商业支持版本。但作为学习,笔者仍然推荐Hadoop,商业版本有更好的性能以及安全性,开源版本更有利于我们通过阅读源代码学习Hadoop的工作原理。
免责声明:以上内容源自网络,版权归原作者所有,如有侵犯您的原创版权请告知,我们将尽快删除相关内容。