Hadoop中TeraSort修改后输出翻倍异常怎么办
小编给大家分享一下Hadoop中TeraSort修改后输出翻倍异常怎么办,希望大家阅读完这篇文章之后都有所收获,下面让我们一起去探讨吧!
创新互联公司服务项目包括仓山网站建设、仓山网站制作、仓山网页制作以及仓山网络营销策划等。多年来,我们专注于互联网行业,利用自身积累的技术优势、行业经验、深度合作伙伴关系等,向广大中小型企业、政府机构等提供互联网行业的解决方案,仓山网站推广取得了明显的社会效益与经济效益。目前,我们服务的客户以成都为中心已经辐射到仓山省份的部分城市,未来相信会继续扩大服务区域并继续获得客户的支持与信任!
简而言之,就是在修改了TeraInputFormat.java之后,运行TeraSort所得到的输出数据不同程度的翻倍,刚开始并没有什么头绪,并且把采样的线程和Map的读入<key, value>搞混了,逻辑不清晰,导致很多时间都在无关紧要的地方反复调试.
其实应该可以想到一种办法,就是在MapTask里设断点观察,但不知道是自己懒还是因为对隐藏在深处的MapTask有一种畏惧心里,起初我并没有仔细进去看,后来在MapTask里RecordReader部分的nextKeyValue()方法里设置变量计数并输出,来观察每次split所获取的记录条数,结果发现,我的每个split都完整的获取了整个(注意是整个输入文件)而不是一个split大小的记录,所以输出也随着翻倍了.
那么关键点找出来了,问题出在哪里呢?MapTask部分是Hadoop默认绑定的,TeraSort并没有重写,所以这部分不可能出错;TeraInputFormat的前半部分是取样部分,问题不可能出在这里;后半部分的RecordReader的initialize部分和修改前基本无变化,那错误的部分一定是在nextKeyValue()部分了,于是一行一行分析,最终锁定了这一句:
newSize = in.readLine(record);
很普通的读取一行记录,那有没有可能是readLine()这个方法对长度没有限定呢?虽然nextKeyValue()方法是split对象调用的,但会不会readLine()并不理会你每个split块的大小而是一股气往下读取直到读到文件末尾呢?
为了验证这个可能,我添加了全局变量:
long recordLen; //将下面这句加在nextKeyValue()中 recordLen += newSize;
来记录读取记录的总长度,,并设定当
if(recordLen >= split.getLength){ return false; }
修改后打jar包放到节点上运行,结果正确!!!
看完了这篇文章,相信你对“Hadoop中TeraSort修改后输出翻倍异常怎么办”有了一定的了解,如果想了解更多相关知识,欢迎关注创新互联行业资讯频道,感谢各位的阅读!
分享文章:Hadoop中TeraSort修改后输出翻倍异常怎么办
新闻来源:http://myzitong.com/article/gidgeg.html