赞
踩
1.输出空文件之前遇到过ArrayIndexOutOfBoundsException->数组越界的错误,解决也很简单:加上判断语句 。其实当时是有些怀疑是不是读取数据错误了,但是考虑可能是最后一行空值数据被读到了导致出现的这个错误,就没往下想。
2).在执行MR任务时,mapper和reducer都正常运行,但是hdfs输出文件为空。(任务是关于MR执行排序任务的)
数据如下:
1.查看core-site.xml是不是路径(hadoop.tmp.dir属性)配置错误了,导致数据放错了位置。然而 不是
2.因为没有报错所以排除了是集群的问题。然后就是考虑的是可能程序错误了,但是一直没有发现错误。期间也尝试过重写输入文本,重写MR程序,重新打包等操作。
3.注意到了命令行MR程序执行结束后留下的信息:
Mapper的输出为空(Map output records=0)
这说明错误完全是出现在mapper阶段
尝试使用了程序经典的输出语句标志位,但是因为没找到它的输出,就暂时放弃了。本来想使用hadoop本地模式运行MR并使用Debug的方式查找错误的,感觉有些复杂就舍弃了。最后网上查询了如何查看MR程序的println输出(方法末尾附上)后,发现了问题。
这里需要查看logs文件(如果添加了历史服务器,则可以直接查看历史服务器的map任务,找到最新执行的任务,查看logs文件。没有则见最后查询logs日志的方法)
println输出结果如下:
可以发现得到的每一行数据都没有问题但是得到的数组长度始终为1,说明map任务中的split函数(以“\t”拆分)并没有将数据拆分。查看输入文件发现,间距很小。怀疑是间隔符的问题。但是在vim编辑输入文件时发现确实\t间距就是很小。多次尝试之后,发现结果:
vim编辑器并不很好适应所有外部文件复制的\t,很可能将其看为空格了。如果出现这种情况要么将数据拿出来使用记事本重新添加\t再复制到vim编辑器中,要么直接使用vim编辑器将间隔修改为\t
修改结束后:MR任务正常运行
Map输出如下:
MR运行结果如下:
1.重点学会看logs日志文件,从日志文件中我们可以发现很多错误,也可以很好帮助我们解决问题。
2.遇到错误的时候,先考虑自己翻译下错误,不要忙着找文章看是什么错误(之前我就是…),比如数组越界异常ArrayIndexOutOfBoundsException,翻译过来就很好理解错误在哪里了。
3.使用好MR程序添加println输出的tip,可以提示自己那些位置出错了,快速反应。
有历史服务器(JobHistoryServer)的:
找到最新执行完的MR程序点击history查看
1.
3.
4.
向下翻就可以找到我们添加的输出结果,如果不想使用本地的集群运行模式通过debug找错的,可以使用这个方法。
无历史服务器的:
打开hdfs web界面,打开/tmp/logs/目录找到用户的最新log文件,如图:
将文件下载下来搜索stdout,一直下一个就可找到相应的输出结果:
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。