首先我们需要明确一个问题就是,hdfs中blocksize是物理概念是真的把数据进行了按块切分,而mapreduce 中的切片概念是逻辑层面的并没有真正按照切片大小对数据进行切分,只是按照预先规划好的切片数据根据偏移量读取数据,实现逻辑层面的分片。
以上我们了解了mapreduce的分片方式后,默认的textinputformat是按照文件长度读取数据(按照分片),非常有可能一行数据被放到了两个切片中,这样一行被切分后很有可能数据分割错了,比如单词从中间切分开了等其他情况。
但是mapreduce考虑到了这个问题并巧妙的避开了这个问题:
如果map按照split读取数据时发现最后一行数据没有遇到
换行符,则会去下一个split中读取数据直到遇到
为止,第二个map读取数据时会查看上个map的split数据的最后一行是不是
,若果不是说明本split的第一行数据已经被读取,自己从第二行开始读取;