maptask和reduceta的并行度

版权声明:数据丁 https://blog.csdn.net/reasery/article/details/82863094

一。maptask的并行度
同一时间内,maptask任务同时运行的数量。
一个maptask任务对应一个逻辑切片,split
注意与文件切块的区别:
文件切块block是hdfs存储的单位,物理上的切分,不同的块可能存在不同的节点上
文件切片是一个逻辑概念,是maptask任务执行对应的数据单元,并没有物理切分
切片的大小和切块的大小一样,并没有别的关系
修改方式
大于128m,修改最小值,minSize设置为大于128

1.配置文件中修改mapred-site.xml
mapreduce.input.fileinputformat.split 
2.代码中修改
FileInputFormat.setMinInputSplitSize(job,130*1024*1024);

小于128m,修改最大值,maxSize设置为小于128

1.配置文件中修改mapred-site.xml
mapreduce.input.fileinputformat.split 
2.代码中修改
FileInputFormat.setMaxInputSplitSize(job,100*1024*1024);

如果是大量小文件,最好进行合并处理,共同启动一个maptask,这样比较节省资源
代码设置

//设置输入类
job.setInputFormatClass(CombineTextInputFormat.class);
//设置切片大小,合并输入的切片大小
CombineTextInputFormat.setMinInputSplitSize(job,130*1024*1024);
//指定输入路径
CombineTextInputFormat.addInputPath(job,new Path("hdfs://master:9000/abc"))

一个jar对应一个MRAppMaster,一个maptask对应一个yarnchild进程,yarn的调度后面再说
二。reducetask的并行度
框架决定,默认只有一个,跟数据量没有关系,只跟用户设置有关
修改方法:

//想启动几个参数就写几
job.setNumReduceTasks(3);

并行度的算法:
HashPartitioner方法
–getPartitioner{return (key.hashCode()&Ingeter.MAX_VALUE%numRduceTasks)}
需求:将wc的结果按照a-k,l-z进行输出
需要进行自定义分区算法
driver类里job设置添加这么两句

//指定分区算法
job.setPartitionerClass(MyPartitioner.class);
//设置reducetask的并行度
job.setNumReduceTasks(2);

写一个MyPartitioner类继承Partitioner

package mrpro924;

import org.apache.hadoop.io.IntWritable;
import org.apache.hadoop.io.Text;
import org.apache.hadoop.mapreduce.Partitioner;
/*
 * @Parm:
 * key:map输出的key
 * value:map输出的value
 * 分区编号从0开始依次递增
 */
public class MyPartitioner extends Partitioner<Text, IntWritable>{

	@Override
	public int getPartition(Text key, IntWritable value, int numPartitions) {
		//取出key的第一个字母,用来判断分到哪个区
		char firstchar = key.toString().charAt(0);
		if(firstchar>='a'&&firstchar<='k'){
			return 0;
		}else{
			return 1;
		}
	}
}

运行得到的结果是两个文件

运行得到的结果是两个文件
不好的分区算法会造成数据倾斜,有的reducetask分配的数据很好,有些很多

猜你喜欢

转载自blog.csdn.net/reasery/article/details/82863094