在进入Mapper之前的输入分片处理过程详解

本文详细解析了Hadoop MapReduce在执行Mapper前的输入分片处理流程。从JobClient的getSplits方法开始,讨论了分片数量的确定及分片在TaskTracker上的调度。接着介绍了RecordReader的角色,它是记录的迭代器,用于为Mapper生成键值对。重点阐述了InputFormat和RecordReader接口的实现,以及如何自定义InputFormat子类和RecordReader子类以适应特定需求。最后展示了Map任务如何使用RecordReader实例处理分片数据。

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

输入前的过程是这样的:

1. JobClient调用getSplits方法以期望的map任务数numSplits作为参数传入,这个参数将作为一个参考值,因为InpFutormat实现可以自由地返回另一个不同于numSplits制定值得分片数。

        2.在计算好分片数后,客户端将分片们发送到jobtracker,jobtracker便使用其存储位置信息来调度map任务(具体该距离最近的map来处理)从而在tasktracker上处理这些分片数据。

具体细节:在tasktracker上,map任务把输入分片传给InputFormat的getRecordReader()方法来获得这个分片的RecordReader。map任务用一个RecordReader来生成键值对,然后再给map函数。

    RecordReader基本就是记录上的迭代器,他的next()方法反复调用以便为mapper生成键值对,当RecordReader到达输入流的尾部时,next()方法返回false,map任务结束。


二 、这里我们主要理解(上面第2步):

首先,我们要明白,在tasktracker上map任务会把 分片数据记录先输入到实现接口InputFormat的具体子类。这个类传递自身的一些有价值的东西,作为实现接口RecordRecorder的子类的构造函数参数,获得一个RecordRcord类的一个实例。

然后,我们的map任务就可以利用RecordReader类的实例调用这个类的方法。包括.createkey(),createvalue(),next()等等

       图形表示:


   注: (1)Runner类内部关键代码:K key=reader.createKey();

V value=reader.createValue();

while(reader.next(key,value))

{

mapper.map(key,value,output,reporter);

}

(2)InputFormat接口

public interface InputFormat<K,V> {

InputSplit [ ] getSplits(JobConf job,int numSplits) throws IOException;   //主要负责第一步产生分片

RecordReader <K,V> getRecordReader(InputSplit split,JobConf job,Re

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值