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

  • 3
    点赞
  • 26
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 1
    评论
MapReduce Mapper类是一个抽象类,用于处理输入的数据并生成中间键值对(key-value pairs)。Mapper类是MapReduce的第一个阶段,也称为“映射阶段”(Map phase),它的作用是将输入数据划分为若干个小块,然后对每个小块进行处理,将处理结果输出为中间键值对。Mapper类的主要任务是将原始数据转换为中间键值对,这些键值对将会在后续的阶段中作为输入传递给Reducer类进行进一步处理。 Mapper类通常需要实现两个方法:map()方法和setup()方法。其中,map()方法是Mapper类的核心方法,用于将输入数据转换为中间键值对。setup()方法在Mapper类初始化时被调用,可以用来进行一些预处理操作,例如读取配置文件、连接数据库等操作。 Mapper类的输入数据通常包含两个部分:输入键(input key)和输入值(input value)。输入键表示输入数据的唯一标识,通常是输入数据的起始位置或者文件名等信息。输入值表示实际的数据内容,通常是一个字符串或者一个字节数组。Mapper类在处理输入数据时,需要根据输入值进行相应的处理,并将处理结果输出为中间键值对。 Mapper类的输出数据也包含两个部分:中间键(intermediate key)和中间值(intermediate value)。中间键是Mapper类处理后的结果的唯一标识,通常是一个字符串或者一个数字等。中间值是Mapper类处理后的结果的实际内容,通常是一个字符串或者一个字节数组等。中间键值对通常会被写入到本地文件系统或者分布式文件系统中,以供后续的Reducer类进行处理。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

看不见的罗辑

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

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

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

打赏作者

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

抵扣说明:

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

余额充值