hadoop学习笔记之MapReduce特性

1.计数器

在MR作业中内置计数器,统计任务状态,用户可以自定义计数器以实现统计目的,这块比较简单,不是什么原理性的东西,直接略过

2.排序

排序是MR中比较核心的问题,MR中数据是通过排序来进行组织的。排序的效率直接影响着整个作业的运行效率

i)部分排序
在Map任务执行完毕之后,写入到磁盘文件之前,对输出数据进行预排序。这样的排序是按照键进行字典排序而成,将键相同的数据组织到一起。

预排序完成之后,将数据写入本地磁盘,而后通过Partitioner将数据映射传递到对应reducer,默认是一个HashPartitioner进行分区。对键进行hash处理,将值对reducer数目取模,从而确定reducer。

数据传递到reducer之后,reducer对每个分区内数据进行合并排序,依然是按键字典排序,当然也可以通过继承RowCompartor类并且显示设置comparatorClass指定排序方式,这样一来每个reducer输入分区的数据都是有序的,但是就整体所有数据而言,并不是有序的,所以称之为部分排序。

2.完全排序
要想实现所有数据均可以实现有序,那么需要对Partitioner进行设置为TotalOrderPartitioner,对所有数据进行分组,比如说将数据分为{a,b,c,d,e,f}六个分组,那么a组所有键必须小于b组,而b组所有键必须小于c组,以此类推,这就意味着是按照键的范围对数据进行分组。

在对数据进行分组时,如何划分是一个问题。因为可能某一段范围数据量特别大,数据分布不均匀,那将会导致有一部分reducer执行时间长,有一部分执行时间短,不能充分利用资源。我们需要分组内数据量分布均匀,方法是先探查清楚数据分布情况,而后根据分布情况划分分区。

对所有数据遍历一边显然是不高效的,在MR中提供采样器对数据分布进行采样。采样器实现Sampler接口,内置InputSampler实现,其中包含不少采样器,最常用的是InputSampler.RandomSampler。

代码略

3.辅助排序
在前面的排序中,都是按照键进行排序的,没有对值进行排序。辅助排序是指在排序条件中添加值的因素。

这是采用组合键方式实现的,将需要做排序的字段都组合到一个对象中,自定义partitioner将某个字段相同的数据划分到同一个Reducer中,自定义RowComparator类实现按字段排序。

例如,想要统计一年中气温最高的一天,以年份作为键,气温作为值。可以将年份和气温组合成一个键,即年份和气温作为键对象的两个属性,自定义Partitioner按照年份分区,自定义RowComparator按气温排序。

猜你喜欢

转载自blog.csdn.net/flushest/article/details/60963159