hadoop08--maptask、reducetask的并行度&数据倾斜问题

maptask的并行度

1.maptask:运行map部分的任务,我们就叫做maptask。

2.并行度:同时运行的maptask的任务的个数,一个maptask肯定只运行在一台节点上。

3.例如文件大小是500M:
存储为三块:
blk_1:0-128 blk_2:128-256 blk_3:256-384 blk_4:384-500

启动一个maptask合适吗?剩下的两台机器的没有任务,不合理!

maptask应该最终对应解决了多少数据量?
一个maptask解决100M合理吗?
第1个maptask:0-100M 第一个块的0-100M
第2个maptask:100-200M 第一个块100-128M 第二个块128-200M
第3个maptask:200-300M 第二个块的200-256M 第三个块256-300M
第4个maptask:300-400M ….
第5个maptask:400-500M …
如果两个块存储的是不同的节点,这个时候需要跨节点访问数据,存在网络传输问题,性能低 !
一个maptask解决200M问题合理吗?
第1maptask:0-200M 第一个块0-128M 第二个快 128-200M
仍然存在和上面相同的问题我们分析,如果一个maptask解决的数据正好是128M,这样最好 。

4.实际上:一个maptask任务解决的数据量对应的是一个文件切片。 分片的数量等于启动的MapTask的数量。

5.切片不是一个物理概念,是一个逻辑概念,仅仅划分一个偏移量的 并没有真正的进行文件切分。逻辑切片理论上大小=一个block块的大小=128m。

protected long computeSplitSize(long blockSize, long minSize,
    long maxSize) {
    return Math.max(minSize, Math.min(maxSize, blockSize));
    }

通过以上方法最终算的切片的大小是block大小,128M

6.切片和切块的关系:只是在默认情况大小相同
切块:针对于数据存储的,物理上的
切片:针对于maptask的并行度,逻辑上的概念

7.想自定义切片的大小:
1)修改配置文件,改变的是整个集群的
<128M protected long computeSplitSize(long blockSize, long minSize,long maxSize) {
return Math.max(minSize, Math.min(maxSize, blockSize));
}
maxSize= mapreduce.input.fileinputformat.split.maxsize >128M
minSize=mapreduce.input.fileinputformat.split.minsize
2)在代码中修改
FileInputFormat.setMaxInputSplitSize(job, 100);//设置最大值
//FileInputFormat.setMinInputSplitSize(job, 130*1024*1024);//设置最下值

8.例如有4个小文件,存4个块—4个逻辑切片,任务的启动的时候,启动4个maptask任务
运行mr程序的时候,产生进程:
MRAppMaster:程序的管理者
YarnChild—–一个maptask/reducetask任务
……

有小文件的运行的时候,应该合并,让多个小文件启动一个任务
//多个小文件运行的时候:  修改输入类
job.setInputFormatClass(CombineTextInputFormat.class);
//修改切片大小
CombineTextInputFormat.setMinInputSplitSize(job, 130*1024*1024);

reducetask的并行度

1.reducetask并行度就是将原来的一个大任务,分成多个小任务,每一个任务负责一部分计算数据。

2.reduce任务有几个,最直观的的显示就是结果文件的个数。一个结果文件对应于一个reducetask的执行结果。底层分reducetask任务的时候,是按照分区规则分的,每一个reducetask最终对应一个分区的数据。reducetsak的个数和用户设定的有关。

3.默认的分区算法:

    public class HashPartitioner<K, V> extends Partitioner<K, V> {
   
    /** Use {
   @link Object#hashCode()} to partition. */
    //K key  map输出的lkey, V value  map输出的value   int numReduceTasks     job.setNumReducetask(3)
     public int getParti
  • 2
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值