分享

eclipse 调试hadoop需要注意编码问题

admin 2014-2-14 23:23:44 发表于 总结型 [显示全部楼层] 回帖奖励 阅读模式 关闭右栏 0 18654
本帖为答疑贴,在hadoop编程中需要注意编码问题,不要随便修改编码。
本贴问题为:
出现什么错误,可能会是编码问题?

最近在单机调试mapreduce程序到时候,由于代码里面有中文,我就将eclipse的编码从默认到utf8调成了gbk,然后就发现原先可以运行到程序,现在不能运行了
java.io.IOException: Expecting a line not the end of stream
at org.apache.hadoop.fs.DF.parseExecResult(DF.java:109)

环境介绍:
系统是 ubuntu-10.04
IDE用的是eclipse
问题:
出现了一个匪夷所思的现象,在终端中运行nutch,完全没有任何问题。但是,一旦转到eclipse下调试,nutch就跑不起来了,报出的错误如下:
  1. java.io.IOException: Expecting a line not the end of stream
  2. at org.apache.hadoop.fs.DF.parseExecResult(DF.java:109)
  3. at org.apache.hadoop.util.Shell.runCommand(Shell.java:179)
  4. at org.apache.hadoop.util.Shell.run(Shell.java:134)
  5. at org.apache.hadoop.fs.DF.getAvailable(DF.java:73)
  6. at org.apache.hadoop.fs.LocalDirAllocator$AllocatorPerContext.getLocalPathForWrite(LocalDirAllocator.java:321)
  7. at org.apache.hadoop.fs.LocalDirAllocator.getLocalPathForWrite(LocalDirAllocator.java:124)
  8. at org.apache.hadoop.mapred.MapOutputFile.getSpillFileForWrite(MapOutputFile.java:107)
  9. at org.apache.hadoop.mapred.MapTask$MapOutputBuffer.sortAndSpill(MapTask.java:930)
  10. at org.apache.hadoop.mapred.MapTask$MapOutputBuffer.flush(MapTask.java:842)
  11. at org.apache.hadoop.mapred.MapTask.run(MapTask.java:343)
  12. 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异常。

教训惨痛,没想到是自己擅自修改项目编码带来的问题。顺便提一句,装了cygwin后,我在windows系统下调试倒是一帆风顺,没有遇见这个问题.

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

总结:这是程序员常犯的错误,也是程序员经常遇到的问题

来自群组: Hadoop技术组

没找到任何评论,期待你打破沉寂

ssbpls 发表于 2014-2-15 17:00:03
学习了。不错啊。
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

关闭

推荐上一条 /2 下一条