本节书摘来自华章出版社《R与Hadoop大数据分析实战》一书中的第2章,第2.4节,作者 (印)Vignesh Prajapati,更多章节内容可以访问云栖社区“华章计算机”公众号查看
2.4 编写Hadoop MapReduce示例程序
现在要通过一个很简单且普通的单词统计(word count)来学习MapReduce。该例子的目标是统计每个单词在文章中出现的次数。这些文章作为MapReduce的输入文件。
在该例中,已经准备了一些文本文件,我们希望计算所有单词在这些文件中出现的频率。我们通过Hadoop MapReduce来进行设计。
本节中,将使用旧版API接口学习Hadoop MapReduce编程。假设读者已经配置了Hadoop的环境变量(请参考第1章的内容)。同时,我们不使用R语言统计单词,而是只使用Hadoop技术。
基本上,Hadoop MapReduce有3个主要对象:Mapper、Reducer和Driver。他们通过Java的3个类来实现开发,分别是:Map类,Reduce类以及Driver类。其中Map类完成Map阶段操作,Reduce类完成Reduce阶段操作,Driver类通过main方法完成MapReduce的初始化工作。
在前面讲解Hadoop MapReduce原理的内容中,我们已经讨论了什么是Mapper、Reducer和Driver对象。现在将要学习如何定义它们,并在Java中编程。在后续的内容中,我们将会学习如何把R语言同Hadoop技术结合起来。
这里有很多语言和框架可以建立MapReduce,但是它们之间有着不同的特性。多种经过修改的因素可导致MapReduce提供商延迟。详细请参考Cloudera中第10章的内容:http://blog.cloudera.com/blog/2009/05/10-MapReduce-tips/。
为了使MapReduce的开发更简单,我们可以在Eclipse中配置Maven,Maven支持了MapReduce的旧版API接口。
2.4.1 MapReduce job运行的步骤
MapReduce job的运行步骤:
- 在执行初始化步骤的Java类中,需要开发Hadoop MapReduce程序来定义每一个商业问题。在本例中,要考虑单词统计问题。所以我们要为MapReduce程序设计3个Java类,他们分别是Map.java、Reduce.java以及WordCount.java,用于计算文本文件中单词的出现频率。
Map.java:单词统计中的Map类
Reduce.java:单词统计中的Reduce类
WordCount.java:单词统计中Driver任务的Driver主文件
- 编译java类
- 从编译好的java类中创建.jar文件
- 启动Hadoop进程
- 检查所有的进程
- 创建HDFS系统目录:/wordcount/input/
- 提取用于单词统计示例的输入数据集。我们需要文本文件用于单词统计示例,把Hadoop提供的文本文件(CHANGES.txt、LICENSE.txt、NOTICE.txt以及README.txt)复制到Hadoop目录中,我们将使用这些文件。在这个MapReduce算法中我们也可以使用其他来源于互联网输入的数据集而不是使用现成的文本文件。我们也可以处理从互联网提取的数据,但是这里使用现成的输入文件。
- 复制所有的文本文件到HDFS文件系统中
- 使用如下命令运行Hadoop MapReduce job
- 查看最终的输出数据
在运行MapReduce期间,你需要监控job和所有节点的状态。下面是MapReduce
jobs在web浏览器中的监控器:
localhost:50070: NameNode Web interface (for HDFS)。
localhost:50030: JobTracker Web interface (for MapReduce layer)。
localhost:50060: TaskTracker Web interface (for MapReduce layer)。
学习如何监控和调试Hadoop MapReduce job
本节我们将会学习在不使用任何命令时,如何监控和调试Hadoop MapReduce job。
使用Hadoop MapReduce后台界面是解决该问题的最简单方式。我们可以在浏览器中键入URL:http://localhost:50030来进入JobTracker进程管理后台。登陆后将会显示Hadoop MapReduce jobs的相关信息,下面是截图:
这里我们可以检查运行中的job的信息和状态,每个job中Map和Reduce任务的状态,以及已经完成的job、运行失败的job、运行失败的Map和Reduce任务。此外,我们可以点击失败的job(以及Map和reduce任务)链接来调试job。点击后会在标准输出设备上显示该job在运行过程中产生的错误提示信息。
浏览HDFS数据
本节中,我们会学习到如何在不使用批处理命令时完成HDFS目录的浏览。NameNode进程管理后台提供了该功能,我们只需要在浏览器中键入:http://localhost:50070。
这个UI界面可以告诉我们集群的整体情况(包括内存状态)、NameNode日志,以及集群中活跃和死亡节点的信息。同时也运行我们浏览Hadoop目录下的数据,该数据主要是MapReduce jobs所使用的输入和输出数据。
2.4.2 MapReduce可解决的商业问题
到目前为止,我们已经学习了什么是MapReduce以及如何编程。现在,我们要学习在商业分析时MapReduce常出现的一些问题。每一个了解Hadoop MapReduce的读者都可以通过修改单词统计的例子来更容易的编程并解决商业问题。主要的改变就是数据的分解和背后的数据处理逻辑。主要的工作是数据收集、数据清洗以及数据的存储。
服务器网络日志处理(server web log processing):通过MapReduce的这一定义,我们可以执行网页日志分析。网页服务器日志提供关于网页请求的信息,例如请求页面的统一资源定位符、日期、时间以及协议。通过这些信息我们能够从网页服务器日志中确定我们网站的高峰负载,以及根据网站通信量测量网页服务器的配置。所以,晚间确定无通信量时将会通过缩小服务器比例帮助我们节省资金。一些商业案例也可以通过网页日志服务器分析来解决。
带有网站统计的网页分析法(web analytics with website statistics):网站统计可以提供更多关于访问者元数据的详细信息,例如来源、活动、访问者类型、访问者位置、搜索关键词、请求页面的统一资源定位符、浏览器以及花费在页面上的总时间。Google分析学是众多受欢迎的免费网站服务供应商中的一个。通过分析所有信息,我们可以理解访问者访问一个网站的行为方式。通过这些描述性分析,我们能确定网页的重要性或者是其他依据访问者成瘾确定的网页属性的重要性。对于一个电子商务网站来说,我们可以根据访问总数、页面浏览数、每位访问者在其页面上花费时间来确定受欢迎的商品。预测分析也能在网页数据上实施从而来预测商业发展趋势。
搜索引擎(search engine):假设我们拥有大量文档并且需要在文档中搜寻一个特定的关键词,带有HadoopMapReduce的倒排索引将会帮助我们找到关键词,所以我们能够建立一个大数据的搜索引擎。
股票市场分析(stock market analysis):例如,我们已经搜集了很长一段时间的股票市场数据(大数据),现在我们想要确定并预测下一阶段的模式。这要求对所有历史数据集实训。然后我们就可以利用几种带有HadoopMapReduce机器学习函数库来计算上述时期内股票市场变化的频率。
当然MapReduce还可以在很多重要的商业活动中得到应用。