学习MapReduce相关知识
分区
在MapReduce执行当中,有一个默认的步骤就是
partitioner分区,默认情况下,分区的作用就是将相同的数据
发送到同一个ReduceTask里面去。在MapReduce中有一个抽
象类叫做Partitioner,默认使用的实现类是HashPartitioner。
在MapReduce中,分区是从0开始的,有多少个分区,就对
应了多少个ReduceTask任务,每个ReduceTask任务会输出一
个结果文件part-r-0000x
分区的特点
- 在MapReduce中,分区默认是从0开始依次递增
- 在MapReduce中,每一个分区需要启动对应一个ReduceTask(Reduce任务),每一个Reduce Task都会对应一个结果文件。
- 如果不指定分区,默认使用的分区类时HashPartitioner,也就是对键取hashcode值后,转换成正数,然后对设定的ReduceTask数量取余。默认的numReduceTasks =1,所以取余的结果一定是0,一定都在一个分区上面,最后也只会产生一个结果文件。
自定义分区
自定义类继承
-
org.apache.hadoop.mapreduce.Partitioner,重写getPartition()方法
-
在job驱动中,设置自定义partitioner
job.setPartitionerClass(自定义分区类.class); -
自定义partition后,要根据自定义partitioner的逻辑设置相
应数量的reduce task
job.setNumReduceTasks(reduce个数); -
分区个数=Reduce Task(Reduce任务)个数=结果文件个数
Shuffle
Shuffle是MapReduce处理流程中的一个核心,整体来看,分
为3个操作:
- 分区(Partitioner):决定了Map输出的数据会被哪个reduce进行处理。reduce个数是由Partitioner个数决定。每个Partitioner的数据由对应的一个reduce来处理。
- 排序:根据key排序
- Combiner:进行局部value的合并,目的是降低网络数据传
输