从零开始学习Hadoop--第2章 第一个MapReduce程序

1.Hadoop从头说

1.1 Google是一家做搜索的公司

做搜索是技术难度很高的活。首先要存储很多的数据,要把全球的大部分网页都抓下来,可想而知存储量有多大。然后,要能快速检索网页,用户输入几个关键词找资料,越快越好,最好在一秒之内出结果。如果全球每秒有上亿个用户在检索,只有一两秒的检索时间,要在全球的网页里找到最合适的检索结果,难度很大。如果你准备了解大数据开发或是正在学习大数据开发,欢迎加入我们的大数据学习q群378144993,群里365天每天与大家分享免费的学习教程以及开发工具,你与大咖就差这个圈.

Google用三个最重要的核心技术解决上述问题,它们分别是GFS,MapReduce和BigTable。Google发表了它们的设计论文,但没有将它们开源,核心竞争力不可能开源的。论文在这里,有兴趣的同学可以去看看:GFS,http://labs.google.com/papers/gfs-sosp2003.pdf;MapReduce,http://labs.google.com/papers/mapreduce-osdi04.pdf

;Bigtable,http://labs.google.com/papers/bigtable-osdi06.pdf。

Google的论文发表之后,DougCutting等人根据论文的思想,在开源项目Nutch的基础上实现了Hadoop。后来,DougCutting去了Yahoo,继续做Hadoop。后来,Hadoop的开发和应用开始爆发了。

在对应关系上看,HadoopMapReduce对应MapReduce,HadoopDistributed File System(HDFS)对应GFS,HBase对应BigTable。一般我们所说的Hadoop其实是指Hadoop体系,它包括HadoopMapReduce,HDFS,HBase,还有其他更多的技术。

1.2MapReduce和HDFS是如何工作的

先用一种有助于理解的方式描述MapReduce和HDFS是如何工作的。假如有1000G的多个文本文件,内容是英文网页,需要统计词频,也就是哪些单词出现过,各出现过多少次,有1000台计算机可供使用,要求速度越快越好。最直接的想法是,把1000G的文件分成1000份,每台机器处理1G数据。处理完之后,其他999台机器将处理结果发送到一台固定的机器上,由这台机器进行合并然后输出结果。

Hadoop将这个过程进行自动化的处理。首先看如何存储这1000G的文本文件。HDFS在这1000台机器上创建分布式文件系统,将1000G的文件切分成若干个固定大小的文件块,每个块一般是64M大小,分散存储在这1000台机器上。这么多机器,在运行的时候难免会出现有几台突然死机或者挂掉的情况,这导致上面存储的文件块丢失,会导致计算出错。为避免这种情况,HDFS对每个文件块都做复制,复制成3~5个相同的块,放到不同的机器上,这样死机的文件块在其他机器上仍然可以找得到,不影响计算。

MapReduce其实是两部分,先是Map过程,然后是Reduce过程。从词频计算来说,假设某个文件块里的一行文字是”Thisis a small cat. That is a smalldog.”,那么,Map过程会对这一行进行处理,将每个单词从句子解析出来,依次生成形如<“this”,1>, <”is”, 1>, <”a”, 1>, <”small”, 1>,<”cat”, 1>, <”that”, 1>, <”is”, 1>,<”a”, 1>, <”small”, 1>, <”dog”,1>的键值对,<”this”,1>表示“this”这个单词出现了1次,在每个键值对里,单词出现的次数都是1次,允许有相同的键值对多次出现,比如<”is”,1>这个键值对出现了2次。Reduce过程就是合并同类项,将上述产生的相同的键值对合并起来,将这些单词出现的次数累加起来,计算结果就是<“this”,1>, <”is”, 2>, <”a”, 2>, <”small”, 2>,<”cat”, 1>, <”that”, 1>, <”dog”,1>。这种方式很简洁,并且可以进行多种形式的优化。比如说,在一个机器上,对本地存储的1G的文件块先Map,然后再Reduce,那么就得到了这1G的词频统计结果,然后再将这个结果传送到远程机器,跟其他999台机器的统计结果再次进行Reduce,就得到1000G文件的全部词频统计结果。如果文件没有那么大,只有三四个G,就不需要在本地进行Reduce了,每次Map之后直接将结果传送到远程机器做Reduce。

具体地,如果用Hadoop来做词频统计,流程是这样的:

1)先用HDFS的命令行工具,将1000G的文件复制到HDFS上;

2)用Java写MapReduce代码,写完后调试编译,然后打包成Jar包;

3)执行Hadoop命令,用这个Jar包在Hadoop集群上处理1000G的文件,然后将结果文件存放到指定的目录。

4)用HDFS的命令行工具查看处理结果文件。

1.3 API参考

开发过程需要的API全部在JavaAPI和Hadoop API,在下面两个地方找:

Hadoop1.2.1的API文档:http://hadoop.apache.org/docs/r1.2.1/api/index.html

JavaJDK1.7的API文档:http://docs.oracle.com/javase/7/docs/api/

2. 词频统计

在这里,我们开始实现WordCount的MapReduce。这里的WordCount程序是从Hadoop的例子代码改编来的。

3.标准形式的MapReduce程序

所谓标准形式的MapReduce,就说需要写MapReduce的时候,脑海里立刻跳出的就是这个形式,一个Map的Java文件,一个Reduce的Java文件,一个负责调用的主程序Java文件。这个标准形式已经是最简了,没有多余的东东可以删除,没有肥肉,是干货。写MapReduce和主程序的时候,分别引用哪些包哪些类,每个包每个类是什么作用,这些要很清晰。如果记不住的话,将这些代码写几遍,编译调试运行,然后不看代码,自己从头写出来,编译调试运行,重复多次应该可以记住了。

3.1 目录和文件结构

首先创建一个目录wordcount_01存放源代码、编译和打包结果,比如将这个目录放在/home/brian/wordcount_01。

wordcount_01目录下,有两个子目录,分别是src目录和classes目录。src目录存放Java的源代码,classes目录存放编译结果。在src目录下,创建三个文件,分别是IntSumReducer.java,TokenizerMapper.java,WordCount.java。从MapReduce的角度看,TokenizerMapper.java文件是做Map的代码&#

  • 3
    点赞
  • 14
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值