hadoop-tarasort测试Error: read past eof解决办法

关键词:
问题现象

【问题描述】:

测试terasort,遇到过下面的错误:

Error: java.io.EOFException: read past eof

at org.apache.hadoop.examples.terasort.TeraInputFormat$TeraRecordReader.nextKeyValue(TeraInputFormat.java:261)

 

告警信息

Error:
18/03/20 08:02:36 INFO mapreduce.Job: Task Id : attempt_1412690505174_0006_m_000034_0, Status : FAILED
Error: java.io.EOFException: read past eof
at org.apache.hadoop.examples.terasort.TeraInputFormat$TeraRecordReader.nextKeyValue(TeraInputFormat.java:261)
at org.apache.hadoop.mapred.MapTask$NewTrackingRecordReader.nextKeyValue(MapTask.java:533)
at org.apache.hadoop.mapreduce.task.MapContextImpl.nextKeyValue(MapContextImpl.java:80)
at org.apache.hadoop.mapreduce.lib.map.WrappedMapper$Context.nextKeyValue(WrappedMapper.java:91)
at org.apache.hadoop.mapreduce.Mapper.run(Mapper.java:144)
at org.apache.hadoop.mapred.MapTask.runNewMapper(MapTask.java:764)
at org.apache.hadoop.mapred.MapTask.run(MapTask.java:340)
at org.apache.hadoop.mapred.YarnChild$2.run(YarnChild.java:167)
at java.security.AccessController.doPrivileged(Native Method)
at javax.security.auth.Subject.doAs(Subject.java:415)
at org.apache.hadoop.security.UserGroupInformation.doAs(UserGroupInformation.java:1556)
at org.apache.hadoop.mapred.YarnChild.main(YarnChild.java:162)

原因分析

多个角度进行了分析验证:

1)如果只保证文件最后一行是100个字符,中间行有少于100字符,执行还是报错。

2)保证每一行都是100字符(行数也要多一些,我这有可用的示例数据,如附件),执行ok

3)上一个可用示例数据,最后一行去掉1个字符,执行报跟之前一样的错。

【初步结论】

    TeraInoutFormat文件大小是RECORD_LENGTH的精确倍数

因为生成的数据如果某一行比RECORD_LENGTH(一般都是100字节)小,可能会导致这样的问题。

解决办法

1:选取的split个数:samples = Math.min(10, splits.length); ,改变map的RECORD_LENGTH长度小于100,一般为99:

      2:删除结果目录(如果有的话),否则执行报错:

hdfs dfs -rm -r -skipTrash /tmp/terasort-output

     3:

terasort程序提交执行:

nohup yarn jar /usr/hdp/2.3.4.0-3485/hadoop-mapreduce/hadoop-mapreduce-examples-2.7.1.2.3.4.0-3485.jar terasort -Dmapred.reduce.tasks=50 /tmp/tcode /tmp/terasort-output

查看结果:

登录华三DataEngine平台(https://10.154.74.145:8443/,用户名密码:admin/admin),点击“服务-Yarn-快速连接-ResourceManager UI

建议与总结

在map阶段,TotalOrderPartition通过trie查找来确定mapper中某个record被送往哪个reducer,然后才由reducer进行局部排序,reducer中各个数据块的大小关系是在查找过程中才由trie来确定下来,这个参数需要经过调试来确定

案例信息

案例类型:经验案例
案例号:201804070001
创建时间:2018年4月7日
更新时间:2018年4月24日
发布时间:2018/4/24 17:33:50
文章密级:游客可见
有效期:长期有效
发布者:王乐A [w13928]
点击次数:874
评论平均得分:0
关键词:
产品线:大数据
产品系列:DataEngine DI
产品版本:
故障类型:

附件
常用操作
收藏