MapReduce原理分析之MapTask读取数据,Java程序员如何有效提升学习效率

public class Mapper<KEYIN, VALUEIN, KEYOUT, VALUEOUT> {

public abstract class Context

implements MapContext<KEYIN,VALUEIN,KEYOUT,VALUEOUT> {

}

protected void setup(Context context

) throws IOException, InterruptedException {

// NOTHING

}

@SuppressWarnings(“unchecked”)

protected void map(KEYIN key, VALUEIN value,

Context context) throws IOException, InterruptedException {

context.write((KEYOUT) key, (VALUEOUT) value);

}

protected void cleanup(Context context

) throws IOException, InterruptedException {

// NOTHING

}

public void run(Context context) throws IOException, InterruptedException {

setup(context);

try {

while (context.nextKeyValue()) {

map(context.getCurrentKey(), context.getCurrentValue(), context);

}

} finally {

cleanup(context);

}

}

【一线大厂Java面试题解析+后端开发学习笔记+最新架构讲解视频+实战项目源码讲义】

浏览器打开:qq.cn.hn/FTf 开源分享

}

通过源码我们能够看到里面的方法如下

| 方法 | 说明 |

| — | :-- |

| setup | 任务开始的时候执行一次,可以做一些预处理操作 |

| map | 每读取一行记录执行一次,获取KV对 |

| cleanup | 任务结束前执行一次,可以做一些收尾工作,比如setup的时候声明一个变量sum,map阶段累加,最后在cleanup的时候将sum输出,获取统计的结果 |

| run | 当于map task的驱动,将前面的方法组成了一个模板 |

3.context.nextKeyValue()


context的类型是Context实现了MapContext

public abstract class Context

implements MapContext<KEYIN,VALUEIN,KEYOUT,VALUEOUT> {

}

MapContext的实现类是MapContextImpl

在这里插入图片描述

而nextKeyValue()方法的调用

在这里插入图片描述

说明调用的是RecordReader中的方法,而具体是RecordReader中的哪个实现类呢?继续往下。

4.FileInputFormat


我们在启动类中设置了输入输出路径。进入FileInputFormat的子类TextFileInputFormat中查看

在这里插入图片描述

在这里插入图片描述

说明nextKeyValue()其实执行的是RecordReader中的nextKeyValue方法。

在这里插入图片描述

读取split文件中每行数据的方法。将每行的偏移量保存在key中,每行的具体数据保存在value中,分别通过getCurrentKey方法和getCurrentValue方法来获取。

public boolean nextKeyValue() throws IOException {

if (key == null) {

key = new LongWritable();

}

key.set(pos);

if (value == null) {

value = new Text();

}

int newSize = 0;

// We always read one extra line, which lies outside the upper

// split limit i.e. (end - 1)

while (getFilePosition() <= end || in.needAdditionalRecordAfterSplit()) {

if (pos == 0) {

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值