学习Hadoop(1)mapreduce

来源:互联网 发布:淘宝客服绩效考核软件 编辑:程序博客网 时间:2024/05/16 16:02

最近在研究Hadoop,所以在这里和大家分享一下,共同学习。


先说点废话,首先,环境配置,我在这里就不无视各位看官智商了,大家用百度google一下,很多,很全。可能有的人才刚刚听说这个,不过hadoop已经发展很久很久了~不过,不用灰心啦,毕竟一种成熟的技术需要时间和事件去检验其生存能力和稳定性,这样,虽然我们没有走在技术的最前沿,但至少,我们不会走弯路。当技术有一定量的普及之后,会有很多牛给我们提供很多现成的技术支持,比起go语言之类的,我们或许会幸福一些吧?


首先,学习Hadoop,首先要明白这个map reduce理念,可能有的公司的分布式没有应用hadoop,但多少在文件分布式或者数据分布式上,或多或少会有一些借鉴,毕竟google的牛们,还在地上跑的很欢实。


首先,大家先看一眼下图:

给你30s,看懂了什么?没看懂就继续往下看吧。

该图从左到右,是数据的流向,从海量字码到我们整理出的数据。

按照数据框,我们也分6部分介绍:

1 分布式获取的数据;

2 数据框内collection的数据类型(我们可以理解成set、map之类),左侧的是地址偏移量,右侧的是数据;

3 整理的map 左侧是key 右侧是value;

4 将map数据合并成collection,也就是一个key,多个value,即values;

5 通过筛选,得到我们要的一组set,每个key,对应唯一的value(此处为充分不必要事件,数学不好的自己补补);

6 通过整理,得到我们需要的数据;


是不是很简单呢?

第一个图到第二个图不用我们考虑;

第二个框图开始,就是我们需要做的了。


这里我们会需要构建一个mapper 继承MapReduceBase并实现Mapper接口:

MapReduceBase:

继承这个类,主要是实现jobconfigurable接口的Configure方法,这个会在其后用到;其中还有一个close接口,这个在2.6就不推荐使用了。

Mapper:

实现这个接口,主要实现其map(k,v,o,r)方法,这个函数是其最主要的部分。

输入部分:

k:key值,这里类型为LongWritable,该类型是hadoop自己封装的流数据类型,我们可以理解成java里的long;

v:value值,这里是Text类型,也是hadoop里自己封装的类,类似于String;

输出部分:

o:输出的结果,OutputCollector<k,v>,这里,是一个可添加的类似与map的结构,源码里只有一句话,可以添加值,你懂的;

r:reporter,这个类型为返回值类型。


虽然有些源码没有看,如果你学过C#或者C/C++,这里的o我们可以理解为&o,如果你没有学过,我们可以理解成通过调用反射,具体可能会用到jdk代理吧?反正,怎样,你就理解成,这个Out的值,是返回值就OK了。


然后,就是Reducer了,其继承了MapReduceBase这个类,实现了Reducer这个接口:

这里我们就只讲一下Reducer:

这里主要实现reduce(k,v,o,r):

输入部分:

k:mapper部分传递过来的key,与之类型匹配;

v:mapper部分传递过来的values,类型为Iterator<k>,与之类型匹配;

输出部分:

o:输出值,类型为OutputCollector<k,v>;

r:输出类型。


这样,最基本的mapreduce结构,我们就可以通过代码来实现了.


当我们调用的时候,你就应该想起来MapReduceBase这个父类了吧?

通过JobConf调用主进程,由于Hadoop分布式特性,在使用资源之前,会被压缩成jar,这里我们只要调用其class,Hadoop就会为我们自动调用了;

FileInputformat和FileOutputformat用于控制数据的输入和输出。其会对分布式磁盘进行搜索,对资源进行调用及输出(PS:这里需要注意的是,输出文件不要存在,否则会拒绝进程执行);

这里注入的时候,根据输入值、输出值,我们调用的注入函数可能不一样,这里需要根据具体情况,查阅相关文档即可;当然,如果合适的话,用默认的也是ok的。


完成这些,我们就可以将代码跑起来了。



接下来的一些问题和要点,如果没有懒死的话,会随之更新的^^.






0 0
原创粉丝点击