运行nutch报错unzipBestEffortreturnednull怎么办
小编今天带大家了解运行nutch报错unzipBestEffort returned null怎么办,文中知识点介绍的非常详细。觉得有帮助的朋友可以跟着小编一起浏览文章的内容,希望能够帮助更多想解决这个问题的朋友找到问题的答案,下面跟着小编一起深入学习“运行nutch报错unzipBestEffort returned null怎么办”的知识吧。
报错信息:fetch ofhttp://szs.mof.gov.cn/zhengwuxinxi/zhengcefabu/201402/t20140224_1046354.htmlfailed with: java.io.IOException: unzipBestEffort returned null
完整的报错信息为:
2014-03-1216:48:38,031ERRORhttp.Http-Failedtogetprotocoloutput java.io.IOException:unzipBestEffortreturnednull atorg.apache.nutch.protocol.http.api.HttpBase.processGzipEncoded(HttpBase.java:317) atorg.apache.nutch.protocol.http.HttpResponse.<init>(HttpResponse.java:164) atorg.apache.nutch.protocol.http.Http.getResponse(Http.java:64) atorg.apache.nutch.protocol.http.api.HttpBase.getProtocolOutput(HttpBase.java:140) atorg.apache.nutch.fetcher.Fetcher$FetcherThread.run(Fetcher.java:703) 2014-03-1216:48:38,031INFOfetcher.Fetcher-fetchofhttp://szs.mof.gov.cn/zhengwuxinxi/zhengcefabu/201402/t20140224_1046354.htmlfailedwith:java.io.IOException:unzipBestEffortreturnednull 2014-03-1216:48:38,031INFOfetcher.Fetcher--finishingthreadFetcherThread,activeThreads=0
由此可知抛出异常的代码位于src/plugin/lib-http/src/java/org/apache/nutch/protocol/http/api/HttpBase.java(lib-http插件)类的processGzipEncoded方法的317行:
byte[]content; if(getMaxContent()>=0){ content=GZIPUtils.unzipBestEffort(compressed,getMaxContent()); }else{ content=GZIPUtils.unzipBestEffort(compressed); } if(content==null) thrownewIOException("unzipBestEffortreturnednull");
nutch2.7\src\plugin\protocol-http\src\java\org\apache\nutch\protocol\http\HttpResponse.java(protocol-http插件)的164行调用了processGzipEncoded方法:
readPlainContent(in); StringcontentEncoding=getHeader(Response.CONTENT_ENCODING); if("gzip".equals(contentEncoding)||"x-gzip".equals(contentEncoding)){ content=http.processGzipEncoded(content,url); }elseif("deflate".equals(contentEncoding)){ content=http.processDeflateEncoded(content,url); }else{ if(Http.LOG.isTraceEnabled()){ Http.LOG.trace("fetched"+content.length+"bytesfrom"+url); } }
通过Firefox的Firebug工具可查看该URL的响应头为Content-Encoding:gzip,Transfer-Encoding:chunked。
解决方法如下:
1、修改文件nutch2.7\src\java\org\apache\nutch\metadata\HttpHeaders.java,增加一个field:
publicfinalstaticStringTRANSFER_ENCODING="Transfer-Encoding";
2、修改文件nutch2.7\src\plugin\protocol-http\src\java\org\apache\nutch\protocol\http\HttpResponse.java,替换第160行代码readPlainContent(in);为如下代码
StringtransferEncoding=getHeader(Response.TRANSFER_ENCODING); if(transferEncoding!=null&&"chunked".equalsIgnoreCase(transferEncoding.trim())){ readChunkedContent(in,line); }else{ readPlainContent(in); }
3、http内容长度限制不能使用负值,只能使用一个大整数:
<property> <name>http.content.limit</name> <value>655360000</value> </property>
4、因为修改了核心代码和插件代码,所以需要重新编译打包发布,执行nutch2.7\build.xml的默认target:runtime
cdnutch2.7 ant
感谢大家的阅读,以上就是“运行nutch报错unzipBestEffort returned null怎么办”的全部内容了,学会的朋友赶紧操作起来吧。相信博信小编一定会给大家带来更优质的文章。谢谢大家对博信网站的支持!
版权声明
本文仅代表作者观点,不代表博信信息网立场。