Hadoop入门概述-概念及WordCount实例详解

我希望尽可能的以最白话的方式来介绍Hadoop,让你能快速入门Hadoop.本文主要从两个方面从整体上来把握Hadoop,分别是:1)MapReduce分布式计算框架和HDFS文件系统;2)Hadoop WordCount实例源码解析。


1)MapReduce分布式计算框架和HDFS文件系统

hadoop最主要的两个部分就是MapReduce分布式并行计算框架和HDFS分布式文件系统.下面分别来解释下这两个概念。

a)什么是MapReduce?

MapReduce可以简单理解为分而治之,意思就是将一个比较大的计算任务分割成多个小的任务,这些小的任务在多台计算机上并行的运行,这个过程就是Map阶段,然后把这些小的任务(Map阶段)的结果通过网络发送到另外一台计算机(节点),这台计算机(节点)负责把这些结果合并然后计算出最终的结果(初始那个大的任务想要计算的结果),这个过程就是reduce阶段,合起来就是Hadoop的MapReduce。Hadoop提供了一些jar包来实现MapReduce过程,而对于程序员来说,就只需要实现Hadoop提供的两个接口:Map阶段的接口,和reduce阶段的接口,然后把你写的代码打jar包,用Hadoop的一些命令来执行就可以了。一图抵万字:


图片来自《Hadoop权威指南》

b)什么是HDFS分布式文件系统?

在回答什么是HDFS之前,先来看下什么是文件系统:计算机能在多种不同的介质上(如果硬盘、磁带、光盘等)存储信息,为了方便管理这些设备(如硬盘),于是有了文件系统,文件系统使用文件树形目录的抽象逻辑概念代替了硬盘和光盘等物理设备使用数据块的概念,用户使用文件系统来保存数据不必关心数据实际保存在硬盘(或者光盘)的地址为多少的数据块上,只需要记住这个文件的所属目录和文件名。在写入新数据之前,用户不必关心硬盘上的那个块地址没有被使用,硬盘上的存储空间管理(分配和释放)功能由文件系统自动完成,用户只需要记住数据被写入到了哪个文件中(摘自维基百科)。说的白话点就是:文件系统用来管理硬盘等存储设备,然后文件系统提供操作接口;比如创建文件和目录就是文件系统的接口,然后文件系统在把数据写到硬盘,并且它帮你维护这个目录和文件数据,这样你就不用去直接操作硬盘了,而是用文件系统来管理硬盘。说到这里,相信你大概也知道了HDFS分布式文件系统了,它就是Hadoop实现的一种文件系统,它的特点就是:分布式;意思就是这个HDFS文件系统管理着多台计算机的硬盘,而不只是一台计算机上的一个硬盘而已。假如你把数据存储在HDFS文件系统上,那么一份完整的数据就会被分割成多个块,然后这些块分布在多台计算机的硬盘上。和上面介绍的MapReduce结合起来看,我们就可以发现,map阶段的输入就可以是这些数据块,一个大的任务不就分成了许多小的任务了吗?


以上对于MapReduce和HDFS的介绍都是“鸟瞰”式的,都只是从整体上把握,而没有去关注细节,因为这有利于Hadoop的快速入门、理解。


2)MapReduce的实例WordCount程序详解

当你下载Hadoop包的时候,里面会有个example的jar包,这里面有很多例子,其中一个就是WordCount,比如我用的是Hadoop-2.4.0,那么这个jar包的解压以后的位置是:hadoop-2.4.0\share\hadoop\mapreduce,名称是:hadoop-mapreduce-examples-2.4.0.jar;在hadoop-2.4.0\share\hadoop\mapreduce\sources目录下有个hadoop-mapreduce-examples-2.4.0-sources.jar,这个就是源码。现在就以WordCount为例具体说下程序员如何自己编写一个MapReduce程序。WordCount程序是一个统计单词在文本中出现次的计算,我们假设被统计的就是一个简单的纯文本,比如像windows下的txt文本,并且这些单词被一行一行保存,就像:


为了节省篇幅,只截取部分数据。

第一部分map阶段:


解释下:继承Mapper,重写map方法,map方法的三个参数:key是一行数据在文本中的偏移量,就类似于一行数据的行号(注意是类似),value参数就是一行一行数据:比如上面文本中的第一行数据Single Node Setup;第三个参数context叫做上下文,具体用法是(看上图中)context.write(word,one),意思就是每个单词的个数作为map输出。这里我们来看下map阶段的输入和输出:

首先输入是:

(0,Single Node Setup)

(45,Single Node Setup)

(60,Purpose)

......

key是一行数据在文本中的偏移量,比如上面的0,45,60,value是每一行数据,比如:Single Node Setup,经map方法处理后,输出为:

(Single,1)

(Single,1)

(Node,1)

(Node,1)

(Setup,1)

(Setup,1)

(Purpose,1)

......

就是每个单词出现的次数,需要特别注意的是:这个不是reduce的输入。map函数的输出再经过MapReduce框架处理后,最后发送到reduce的输入是:

(Sigle,[1,1])

(Node,[1,1])

(Setup,[1,1])

(Purpose,[1])

......


第二部分reduce阶段:


这里继承Reducer,重写reduce方法,reduce方法的参数相信也不用我解释了,这里就把每个单词出现的次数累加,统计出最终结果,reduce的输出就是:

(Single,2)

(Node,2)

(Setup,2)

(Purpose,1)

......


第三部分就是运行MapReduce了


job用来控制整个作业的运行,setMapperClass(),setReducerClass()用来指定map和reduce类型,FileInputFormat.addInputPath()用来指定输入数据的路径,可以是文件或者目录,FileOutputFormat.setOutputPath()用来指定最终结果的保存路径。


最后是运行测试

首先将你写的工程打包成jar文件,然后在linux中,进入hadoop的bin目录,然后执行


至此,MapReduce编程过程已经全部完成。


希望通过这篇文章能让你快速入门Hadoop。




评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值