Map和Reduce两个处理阶段
每个阶段都以“键值对”作为输入和输出
Map函数提取年份和气温信息,获得如下数据:
(1950,0)
(1950,22)
(1950,-11)
(1949,111)
(1949,78)
map函数的输出经由MapReduce框架处理后,最后发送到reduce函数
这个处理过程基于键来对键值对进行排序和分组
reduce函数可以看到如下输入:
(1949, [111,78])
(1950, [0, 22, -11])
reduce函数,现在要做的是遍历整个列表,从中找出最大的读书:
(1949, 111)
(1950, 22)
这是最终输出结果:每一年的全球最高气温记录。
MapReduce逻辑数据流:
1、input、cat *
2、map、map.rb
3、shuffle、sort
4、reduce、reduce.rb
5、output、output
示例
一个map函数
一个reduce函数
一些用来运行作业的代码
map函数,由Mapper类实现 来表示
Mapper类声明一个map()虚方法......
Mapper类,是一个泛型类型,有四个形参类型,分别指定map函数的输入键、输入值、输出键、输出值
输入键:一个长整数偏移量
输入值:一行文本
输出键:年份
输出值:气温(整数)
map()方法的输入,是一个键和一个值,首先将包含有一行输入的Text值转换成Java的String类型,然后使用substring()方法提取需要的列。
map()方法还提供Context实例用于输出内容的写入。将年份数据按Text对象读写(年份作为键),将气温值封装在IntWritable类型中。
只有气温数据不缺并且所对应质量代码显示为正确的气温读数时,这些数据才会被写入输出记录中。
同样,reduce函数也有四个形式参数类型用于指定输入和输出类型。
输入类型必须匹配map函数的输出类型,即:Text和IntWritable类型
因此,输出类型也必须是Text和IntWritable类型。
这个最高气温是通过循环比较每个气温与当前所知最高气温所得到的。
Job对象指定作为执行规范,控制整个作业的运行。
构造Job对象之后,需要指定输入和输出数据的路径。
这个路径,可以是单个的文件、一个目录、或符合特定文件模式的一系列文件。
由函数名可知,可以多次调用addInputPath()来实现多路径的输入。
setOutPath()指定输出路径,指定的是reduce函数输出文件的写入目录
在运行作业前,该目录是不应该存在的。否则Hadoop会报错并拒绝运行作业。(目的:放置数据丢失【被覆盖】)
2.4 横向扩展