后天比赛了 今天研究了一下mapreduce做奇偶行相加。回想自己学了一个多月的Mapreduce,也算是学有所获,希望后天的考试给自己交一份完美的答卷
首先准备前置知识:
RecordReader
抽象类的作用是根据给定的InputSplit 创建键/值对.InputSplit是面向 字节的Split视图,而RecordReader能够解析InputSplit并使其k可以被Mapper处理。
RecordReader从输入源中读取字节并将其转换成WritableComparable的键以及Writable的值。当创建自定义输入格式时,自定义数据类型也十分常见,这是将信息呈现给mapper的一种很好的面向对象的方式
我们的思路就是在奇数行的话,key%2==1,偶数行标志为key%2 = =0这样的话利用一个判断就 可以将奇数行之和 偶数行之和相加 然后写一个分区 将两个结果写进去。
一:
DefRecordReader继承RecordReader:
public static class DefRecordReader extends RecordReader<LongWritable, Text>{
//起始位置
private long start;
//结束位置
private long end;
//当前位置
private long pos;
//文件输入流
private FSDataInputStream fin = null;
//自定义自己的key和value
private LongWritable key = null;
private Text value = null;
//定义行阅读器
private LineReader reader = null;
public void initialize(InputSplit split, TaskAttemptContext context)throws IOException,InterruptedException {
//获取分片
FileSplit fileSplit = (FileSplit) split;
//获取起始位置
start = fileSplit.getStart();
//获取结束位置
end = start+fileSplit.getLength();
//获取输入分片的路径
Path path = fileSplit.getPath();
Configuration conf = context.getConfiguration();
//根据路径获取文件系统
FileSystem fs = path.getFileSystem(conf);
//打开文件输入流
fin = fs.open(path);
//找到开始位置开始读取
fin.seek(start);
//创建阅读器
reader = new LineReader(fin);
//将当期位置置为1
pos = 1;
}
public boolean nextKeyValue(