关于mapreduce读取文件分片会不会断行

MapReduce在处理文件分片时,确保每一行记录不会被拆分。通过分析Hadoop 2.8版本的源码,特别是TextInputFormat和LineRecordReader,可以发现系统会在读取时考虑到UTF-8的字节序标记,并且在split边界处理上,即使在分片末尾也会完整读取一行数据。每个非首个split会从第二行开始读取,避免数据重复,保证了行的完整性。
摘要由CSDN通过智能技术生成

大家在接触mapreduce时,对于一个文件要分片,在分片末尾会不会有一条记录被拆开,从而导致map端在输入的时候,会不会有一行记录是不完整的疑惑,其实这肯定是不可能,如果这样的问题没有解决,那在生产生活中肯定是经常遇到,所以hadoop源码中肯定有这方面的处理,今天就带大家看看mapreduce中的源码,我们这次看的是hadoop2.8版本的,其他版本差距不大。

首先肯定想到的是读取文本文件的类是TextInputFormat,其中比较重要的方法是createRecordReader方法

public RecordReader<LongWritable, Text> createRecordReader(InputSplit split, TaskAttemptContext context) {
        String delimiter = context.getConfiguration().get("textinputformat.record.delimiter");
        byte[] recordDelimiterBytes = null;
        if(null != delimiter) {
            recordDelimiterBytes = delimiter.getBytes(Charsets.UTF_8);
        }

        return new LineRecordReader(recordDelimiterBytes);
    }

这里主要是从配置中读取了文本的记录之间的分隔符,如果不另外在设置别的分隔符,这里的recordDelimiterBytes就是空值,则默认CR和LF这些换行符为record的分隔符,将分隔符设成UTF-8的形式传入到LineRecordReader中去,意思是每次碰到一个分隔符,就为一条记录,然后我们再去LineRecordReader类中去看,我们去看nextKeyValue()方法,当其返回true时,就会调用getCurrentKey()和getCurrentValue()去获取key和value

 public boolean nextKeyValue() throws IOException {
        if(this.key == null) {
            this.key = new LongWritable();
        }
        this.key.set(this.pos);
        if(this.value == null) {
            this.value = new Text();
        }
        int newSize = 0;
        //getFilePosition()当前文件的偏移量,end表示split结束的位置
        while(this.getFilePosition() <= 
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值