温馨提示×

温馨提示×

您好,登录后才能下订单哦!

密码登录×
登录注册×
其他方式登录
点击 登录注册 即表示同意《亿速云用户服务条款》

Hadoop中TeraSort修改后输出翻倍异常怎么办

发布时间:2021-11-19 16:49:14 来源:亿速云 阅读:208 作者:小新 栏目:云计算

小编给大家分享一下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修改后输出翻倍异常怎么办”有了一定的了解,如果想了解更多相关知识,欢迎关注亿速云行业资讯频道,感谢各位的阅读!

向AI问一下细节

免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。

AI