HADOOP学习笔记总结二:分布式计算框架mapreduce

本文详细介绍了Hadoop MapReduce的核心概念,包括map、shuffle、reduce过程,以及split数据切片的机制。同时,分析了maptask与reducetask数量的决定因素,强调了数据分区与排序在MapReduce中的重要性。对于reduce任务的数量,不仅受setNumReduceTasks设置的影响,还与数据分区策略和tasktracker的相关配置有关。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

一、mapreduce 设计理念

移动计算不移动数据

1、split数据切片

2、MAP过程

3、shuffle过程

4、reduce过程

二、shuffler过程

partition过程默认hash模计算,根据reduce 的数量来决定,分好区后,reduce 自已fetch自己的那个部分后,再merge操作,可以解决所谓的数据倾斜问题。

sort排序,为后面的reduce group等操作事先排序,减轻reduce的计算负担

spill to disk 写入磁盘

注意其中的combiner的merge是可以不需要的。

三、split切片

很多人可能认为在hadoop中的split和block是一样的,可能是因为hadoop在默认情况下split的大小和hdfs文件分块大小是一样的导致的。

首先:split是mapreduce 的概念,是对应一个maptask 的输入,而block是hdfs中的文件块。

其次:split默认与block的大小一样,是因为mapreduce的FileInputFormat类中有个getSplits() 方法对文件进行split计算,

算法:

Math.max(minSize, Math.min(maxSize, blockSize))

其中minisize 与maxsize的值可以通过配置文件设置,可以发现,如果blockSize小于maxSize && blockSize 大于 minSize之间,那么split就是blockSize,如果blockSize小于maxSize && blockSize 小于 minSize之间,那么split就是minSize,如果blockSize大于maxSize && blockSize 大于 minSize之间,那么split就是maxSize。

四、maptask与reducetask个数的决定

从shuffle过程的图示中可以知道 ,一个Split对应着一个maptask,所以具体有多少个maptask,得看split的大小,得看上述设置

而reduce的个数,则可以通过应当程序 显示的设置:如job.setNumReduceTasks(100),但具体有哪些因素有关呢?
1、 设置mapred.tasktracker.reduce.tasks.maximum的大小可以决定单个tasktracker一次性启动reduce的数目,但是不能决定总的reduce数目。setNumReduceTasks(100)表示总的 REDUCE的数目。

2、但有个问题,有的时候虽然启动了100个 reduce,但可能只有50个在干活,为什么?

shuffle的过程,根据我们的业务把数据分成若干partition,每个partition的数据由对应的一个reducer来处理,需要根据key的值决定将这条<K,V> (map的输出),送到哪一个reduce中去。送到哪一个reduce中去靠调用默认的org.apache.hadoop.mapred.lib.HashPartitioner的getPartition()方法来实现。所以reducer个数是由partition个数决定。

默认的分区是使用:hashpartitioner方法,可以自定义重写getPartition方法来决定partition的个数:

public class HashPartitioner<K, V> extends Partitioner<K, V> {

  /** Use {@link Object#hashCode()} to partition. */
  public int getPartition(K key, V value,
                          int numReduceTasks) {
    return (key.hashCode() & Integer.MAX_VALUE) % numReduceTasks;
  }

}

基中:key的hash值,与numReduceTasks两个 参数决定。

 

 

 

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值