MapReduce的数据切片和并行度

简介

在这里插入图片描述

MapReduce主要分为两个阶段,map阶段和reduce阶段。而map阶段的数据主要是交给MapTask来进行处理,同样reduce阶段主要是交给ReduceTask来处理。那么在这两个阶段中启动多少个Task将直接影响数据处理的效率,下面分别介绍影响这两个阶段Task数量的因素以及如何设置Task数量。

Map阶段并行度

在介绍一个任务中Map阶段并行度之前要先介绍一下分片的概念。

原始数据在进入map阶段之前会有一个格式化的过程,这个过程是由InputFormat来完成,InputFormat的主要工作内容有两个:1.对数据进行分片。2.将输入的原始数据处理成mapTask想要的KV类型格式。第二个工作内容很好理解,第一个数据分片可以理解为对输入的数据进行划分,将原始数据按照某种标准划分成很多份,也就是分片,这样做的目的是为了增加map阶段的并行度,也就增加了数据处理的效率。在一个MapReduce程序中,MapTask的数量是由数据的分片数决定的,一个MapTask处理一个数据片,所以数据片增多就可以增加MapTask的数量从而增加map阶段的并行度。那么InputFormat的分片标准是什么呢?实际上InputFormat并不是一个具体的实现类,官方给我们提供了很多具体的实现类,默认是TextInputFormat。这个类的默认切片大小是HDFS上存储的数据块大小,同时是以文件为单位进行切分,比如有两个小文件,这两个小文件大小综合也小于数据块的大小,但是这两个文件会被切分成两份分别启动两个maptask来进行处理。需要注意的是分片的数量越多理论上并行度也就越大,但是如果都是小文件,MapTask启动的时长大于处理时长这就导致效率范围更低,应该避免处理大量小文件的情况。

Reduce阶段的并行度

ReduceTask的数量就可以由我们自己通过job.setNumReduceTasks(2)设置,默认是一个。当设置了n个Reduce后,map阶段的数据就会将K映射到n个Reduce中也就进行了分区,每个分区内的处理是相互独立的互不干扰。这就带来了一个问题。比如需要对一堆数据进行全局排序,那么设置多个ReduceTask,就只能得到每个分区内的数据有序,全局是无序的,这时候只能设置Reduce为默认值1才能实现全局排序。所以Reduce数量的设置是需要根据业务逻辑来确定的。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值