一。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分配的数据很好,有些很多