Mapreduce,mapper任务无输出以及相关问题解决,日志的正确用法

问题提出

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,一直下一个就可找到相应的输出结果:
在这里插入图片描述

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

看不见的罗辑

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值