小编给大家分享一下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修改后输出翻倍异常怎么办”有了一定的了解,如果想了解更多相关知识,欢迎关注亿速云行业资讯频道,感谢各位的阅读!
免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。