学堂 学堂 学堂公众号手机端

运行nutch报错unzipBestEffortreturnednull怎么办

lewis 1年前 (2024-04-05) 阅读数 8 #技术

小编今天带大家了解运行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怎么办”的全部内容了,学会的朋友赶紧操作起来吧。相信博信小编一定会给大家带来更优质的文章。谢谢大家对博信网站的支持!

版权声明

本文仅代表作者观点,不代表博信信息网立场。

热门