nutch 无法在 eclipse下调试的问题

在Ubuntu 10.04系统使用Eclipse调试Nutch时遇到问题,表现为终端正常运行但在Eclipse中出现IOException错误。通过调整Eclipse的Debug Configurations中console encoding为UTF-8解决了乱码导致的问题。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

系统是 ubuntu-10.04
IDE用的是eclipse
这时候出现了一个匪夷所思的现象,在终端中运行nutch,完全没有任何问题。但是,一旦转到eclipse下调试,nutch就跑不起来了,报出的错误如下:
java.io.IOException: Expecting a line not the end of stream
at org.apache.hadoop.fs.DF.parseExecResult(DF.java:109)
at org.apache.hadoop.util.Shell.runCommand(Shell.java:179)
at org.apache.hadoop.util.Shell.run(Shell.java:134)
at org.apache.hadoop.fs.DF.getAvailable(DF.java:73)
at org.apache.hadoop.fs.LocalDirAllocator$AllocatorPerContext.getLocalPathForWrite(LocalDirAllocator.java:321)
at org.apache.hadoop.fs.LocalDirAllocator.getLocalPathForWrite(LocalDirAllocator.java:124)
at org.apache.hadoop.mapred.MapOutputFile.getSpillFileForWrite(MapOutputFile.java:107)
at org.apache.hadoop.mapred.MapTask$MapOutputBuffer.sortAndSpill(MapTask.java:930)
at org.apache.hadoop.mapred.MapTask$MapOutputBuffer.flush(MapTask.java:842)
at org.apache.hadoop.mapred.MapTask.run(MapTask.java:343)
at org.apache.hadoop.mapred.LocalJobRunner$Job.run(LocalJobRunner.java:138)

在网上查了一通后,基本都是在windows下遇到这种问题,那是因为windows下没有df命令。但是,我的是在ubuntu上发生的,这两种情况不是一回事。

我跟踪代码到org.apache.hadoop.fs.DF.parseExecResult,观察了此函数的传入参数 BufferedReader lines, lines里面显示的内容是乱码,但是确实是df正确执行后的结果。这时候,我有点明白了,本来是两行的DF结果,由于乱码,变成了一行,这才导致输出上面的错误。

解决方法是:修改 DebugConfigurations,将commen选项页中的console encoding ,设为 utf-8.以前的值是 Default-Inherited,由于我把项目默认编码设成了gbk,所以此时的default就是 gbk

至此,真相大白: DF命令本身运行的很正常,没有出错,不像网上的韩国和日本的有些人说是权限问题导致DF失败,只是这个结果被输出到eclipse的console后,由于console的编码设置问题,结果变质了,最终导致parseExecResult异常。

教训惨痛,花费了整整一天的时间,看了中,日,韩和英几种语言的二十多篇技术Blog。没想到是自己擅自修改项目编码带来的问题。顺便提一句,装了cygwin后,我在windows系统下调试倒是一帆风顺,没有遇见这个问题.

不过还是想给hadoop项目的开发提点小建议,如果可能的话,最好重新设计一下DF和DF相关的类,争取能自动识别命令结果的编码格式,这样就不会因为这种问题出错。

项目初始的时候是在windows下开发,用的也是eclispe
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值