Hadoop切分纯文本时对某一行跨两个分片这种情况的处理

Hadoop切分纯文本时对某一行跨两个分片这种情况的处理Hadoop切分纯文本时对某一行跨两个分片这种情况的处理

大家好,又见面了,我是你们的朋友全栈君。

hdfs写入文件需要把大文件分割成多个块,那么有可能会把文件的某一个行分成在不同的块中;这是一个出现分块的时候。还有个就是我的上篇博文中说到的,在mapreduce处理时,当hdfs分块的block大小大于split设置的最大值时也会分割成多个split分片,相当于对块的进一步切割。但是这两种情况出现的概率都很小。

下面转自:https://blog.csdn.net/appstore81/article/details/15027767

事实上,Hadoop对这种某一行跨两个分片的情况进行了特殊的处理。
通常Hadoop使用的InputSplit是FileSplit,一个FileSplit主要存储了三个信息<path, start, 分片length>。假设根据设置分片大小为100,那么一个250字节大小的文件切分之后,我们会得到如下的FileSplit:
<path, 0, 100>
<path, 100, 100>
<path, 200, 50>
(具体的切分算法可以参考
FileInputFormat的实现)
 
因此,事实上,每个MapReduce程序得到的只是类似<path, 0, 100>的信息。当MapReduce程序开始执行时,会根据path构建一个FSDataInputStream,定位到start,然后开始读取数据。在处理一个FileSplit的最后一行时,当读取到一个FileSplit的最后一个字符时,如果不是换行符,那么会继续读取下一个FileSplit的内容,直到读取到下一个FileSplit的第一个换行符。这样子就保证我们不会得到一个不完整的行了。
 
那么当MapReduce在处理下一个FileSplit的时候,怎么知道上一个FileSplit有没有已经处理了这个FileSplit的第一行内容?
我们只需要检查一下前一个FileSplit的最后一个字符是不是换行符,如果是,那么当前Split的第一行还没有被处理,如果不是,表示当前Split的第一行已经被处理,我们应该跳过。

LineRecordReader中,使用了一个很巧妙的方法来实现上述的逻辑,把当前FileSplit的start减一,然后跳过第一行(下面是这个代码片断)。
 

}else{
if(start!= 0) {
skipFirstLine =true;
--start;
 fileIn.seek(start);
}
in=newLineReader(fileIn, job, recordDelimiter);
 }
if(skipFirstLine) {// skip first line and re-establish "start".
start+=in.readLine(newText(), 0,
(int)Math.min((long)Integer.MAX_VALUE,end-start));
}
事实上,InputSplit只是一个逻辑上的概念,跟HDFS本身的block等机制无关,HDFS的好处是让我们可以假设MapReduce程序只是在处理一个本地的文件。

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请联系我们举报,一经查实,本站将立刻删除。

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/106129.html原文链接:https://javaforall.net

(0)
全栈程序员-站长的头像全栈程序员-站长


相关推荐

  • Delphi XE5中的新增内容

    Delphi XE5中的新增内容DelphiXE5中的新增内容DelphiXE5是所有Delphi开发人员的必须备升级,并且是来自Embarcadero的获奖的、多设备应用开发解决方案的最新版本。使用DelphiXE5的新特性,以交付应用Android、iOS、Windows和OSX。以PC机、平板电脑和智能手机为目标,更轻松地与更多数据连接-等等!DelphiXE5中的新特性针对设

    2022年7月18日
    16
  • centos7 配置lamp 环境[通俗易懂]

    centos7 配置lamp 环境[通俗易懂]搭建版本版本组合php5.6+apache/2.4.6(centos7)+mysql5.7.24因为新系统不能确认哪些指令已经搭建所以安装前需要确认下是否拥有检测是否已经安装过Vimrpm-qa|grepvim显示出完整的包名:vim-common,vim-enhanced,vim-minimal,vim-filesystem表示安装成功若是缺少Vim包名:则使用命令:比如说:vim-enhanced这个包少了,执行:yum-yinstallvim-enha..

    2022年5月29日
    36
  • TCP和UDP协议的区别_朋友关系

    TCP和UDP协议的区别_朋友关系在解释两者之间的关系之前,我们必须从宏观的角度了解互联网的整个交互模型。因为当了解互联网在大体上是如何运作时,我们才能了解HTTP和TCP存在的意义,包括他们所要解决的问题是。 (此图来自Udacity的网络协议教程)互联网的模型被分为4层,从上至下每一层都依赖其底层协议。换言之,Application(应用层)的协议操作成功的前提是Transport(运输层)的存在。没有运输层就没有应…

    2022年9月20日
    0
  • Beyond Compare 4试用期已过

    BeyondCompare很好用,但是只有一段时间的试用时间,当试用期过了之后就提示不能试用了怎么办呢?我在网上找到了两个方法:1.直接用注册码(来自:https://blog.csdn.n

    2022年2月16日
    76
  • java stopwatch_java stopwatch 功能

    java stopwatch_java stopwatch 功能1/*2*Copyright(C)2008TheGuavaAuthors3*4*LicensedundertheApacheLicense,Version2.0(the”License”);5*youmaynotusethisfileexceptincompliancewiththeLicense.6*Youmayobtain…

    2022年6月23日
    28
  • MyBatis框架核心之(五)注解使用resultMap及多表查询「建议收藏」

    MyBatis框架核心之(五)注解使用resultMap及多表查询「建议收藏」MyBatis框架核心之(五)注解使用resultMap及多表查询

    2022年4月21日
    43

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号