大数据学习之提交job流程,分区和合并11

一:分区

1:自定义一个Partition类(直接使用上次那个流量统计那个代码

package it.dawn.YARNPra.flow流量汇总序列化.partition;

import org.apache.hadoop.io.Text;
import org.apache.hadoop.mapreduce.Partitioner;


/**
 * @author Dawn
 * @date 2019年5月3日22:03:08
 * @version 1.0
 * 自定义一个分区
 */
public class PhonenumPartitioner extends Partitioner<Text, FlowBean>{

	//根据手机号前三位进行分区
	@Override
	public int getPartition(Text key, FlowBean value, int numpartitions) {
		//1.获取手机号前三位
		String phoneNum=key.toString().substring(0, 3);
		//2:分区
		int partitioner=4;
		
		if("135".equals(phoneNum)) {
			return 0;
		}else if("137".equals(phoneNum)){
			return 1;
		}else if("138".equals(phoneNum)) {
			return 2;
		}else if("139".equals(phoneNum)) {
			return 3;
		}
		
		return partitioner;
	}

}

  

2:在Driver类中添加Partiton的分区个数

3:运行结果

 

一:合并mapTask的合并)

原理图:

1maptask并行度与决定机制

2 maptask工作机制

3:运用场景

1:多个小文件合并优化(减少mapTask任务)

2:Combiner 合并(使用上回的wordcount程序)

父类Reducer

局部汇总 ,减少网络传输量 ,进而优化程序。

注意:求平均值?

3  5  7  2  6

mapper: (3 + 5 + 7)/3 = 5

(2 + 6)/2 = 4

reducer:(5+4)/2

前提: 只能应用在不影响最终业务逻辑的情况下

使用:只需添加一行代码即可

//添加combiner

job.setCombinerClass(WordCountReducer.class);

原文地址:https://www.cnblogs.com/hidamowang/p/10807118.html