MapReduce执行及输入和输出过程

执行过程

(1)MapReduce框架使用InputFormat模块做Map前的预处理,然后将输入文件切分为多个InputSplit。
(2)通过RecordReader根据InputAplit中的信息来处理InputSplit中的具体记录,加载数据并转换为适合Map任务读取的健值对,输入给Map任务。
(3)Map任务会根据用户自定义的映射规则,输出一系列的<key,value>为中间结果。
(4)Shuffle过程(以前文章中有详细介绍)
(5)Reduce接收输入,输出结果给OutputFormat模块、
(6)OutputFormat模块验证输出目录是否已存(不存在情况报错在上一篇文章,有解决办法)在以及结果是否符合配置文件,满足就输出到分布式文件系统。

数据的输入格式

MapReduce的输入格式 默认的是 TextInputFormat,即按行将文件中的文本数据读取出来形成<Key, Value>键值对形式。其中的 Key 是行在文件中的偏移量,类型为 LongWritable,Value 就是一行数据,类型为 Text。所以如果 MapReduce输入格式为默认格式,Mapper 接口中的<LongWritable, Text, Text, IntWritable>中前两项是不能改的。要想更改 Mapper 接口输入的键值对数据类型,就需要改变数据的输入格式, 即自定义数据输入格式。

必须实现的方法

  1. getSplits
    (1)确定 分片大小splitSize:通过computeSplitSize(blockSize, minSize, maxSize)方法计算。
    (2)判断文件大小(length)以及是否可分。不可分将整个数据块返回;可分且不为0,按照规定分片,剩余的作为一个分片返回,为0,返回空列表。
    (3)getSplites 方法返回的只是对需要处理的文件
    的一个分片方案,并未对文件进行物理上的划分。
  2. createRecordReader
    返回一个记录读取器 RecordReader,必须要继承并实现抽象类RecordReader 的抽象方法 initialize()、nextKeyValue()、 getCurrentKey()、getCurrentValue()、getProgress()和 close(),其中 nextKeyValue()方法实现了从分片中读取数据并返回<Key, Value>的工作。

自定义输入格式
当我们自定义输入格式类型时,需要继承自 InputFormat抽象类,实现 getSplits()和createRecordReader()方法。去实现 createRecordReader()操作时,就需要通过自定义一个 RecordReader 类,并且这个类需要继承自 RecordReader 抽象类,实 现 RecordReader 抽 象 类 所 规 定 的 包 括 initialize() 、 nextKeyValue() 、getCurrentKey()、getCurrentValue()和 close()五个抽象接口。

数据的输出格式

所谓输出,就是指把Readuce的结果输出到HDFS中如下图在这里插入图片描述
(1)输出格式类型必须继承 OutputFormat 抽象类,其中的三个抽象方法: getRecordWriter()、checkOutputSpecs()和 getOutputCommitter()。其中 getRecordWriter()方法是返回一个写记录的 writer 对 象,checkOutputSpecs()是在提交任务之后用来检查输出的相关设置是否合法。getOutputCommitter()方法将返回一个的 OutputCommitter 对象。
(2)TextOutputFormat 主要是提供了getRecordWriter()操作的实现,而该操作返回一个 LineRecordWriter 类实例。

自定义输出格式

除了默认的的 TextOutputFormat 输出格式类型外,Hadoop 还提供SequenceFileOutputformat 和 NullOutputFormat 等 输 出 格 式 类 型 。当需要自定义输出格式时,需要注意:自定义的输出格式类型需要实现抽象类 OutputFormat,包括上面提到的三个抽象方法。

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

lqcStar

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值