MapReduce执行及输入和输出过程

执行过程

数据的输入格式

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,包括上面提到的三个抽象方法。

经验分享 程序员 微信小程序 职场和发展