MapReduce原理分析之MapTask读取数据,华为od技术一面

在自定义的Mapper中我们只需要重写map方法,那么每读取一行记录就会调用一次该方法,如下

在这里插入图片描述

2.查看Mapper源码


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);

}

}

}

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

| 方法 | 说明 |

| — | :-- |

| 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中查看

![在这里插入图片描述](https://img-blog.csdnimg.cn/20190406002058691.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9kcGI

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

【docs.qq.com/doc/DSmxTbFJ1cmN1R2dB】 完整内容开源分享

tYm9ib2thb3lhLXNtLmJsb2cuY3Nkbi5uZXQ=,size_16,color_FFFFFF,t_70)

在这里插入图片描述

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

在这里插入图片描述

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

public boolean nextKeyValue() throws IOException {

if (key == null) {

key = new LongWritable();

}

key.set(pos);

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

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值