nutch 异常集锦
异常:
Exception in thread "main" java.io.IOException: Failed to set permissions of path: \tmp\hadoop-dell\mapred\staging\dell1008071661\.staging to 0700
at org.apache.hadoop.fs.FileUtil.checkReturnValue(FileUtil.java:691)
at org.apache.hadoop.fs.FileUtil.setPermission(FileUtil.java:664)
原因:
hadoop在windows下文件权限问题,在linux不存在这个问题。
解决方法:
1 代码的修改:
笔者使用的是nutch-1.7,对应的hadoop版本为1.2.0 下载地址:(hadoop-core-1.2.0)
在下载的release-1.2.0\src 下搜索 ‘FileUtil’ ,然后修改:
private static void checkReturnValue(boolean rv, File p, FsPermission permission) {
/**
if (!rv) {
throw new IOException("Failed to set permissions of path: " + p +
" to " +
String.format("%04o", permission.toShort()));
}
**/
}
2 hadoop的编译:(不需要导入eclipse)
环境:Cygwin,Ant
Ant后会生成:\release-1.2.0\build\hadoop-core-1.2.1-SNAPSHOT.jar
改名为 hadoop-core-1.2.0 覆盖 \apache-nutch-1.7\lib\hadoop-core-1.2.0.jar即可。

异常
java.io.IOException: Job failed!
解决方案:
Src中的:
<property>
<name>plugin.folders</name>
<value>./src/plugin</value>
<description>./src/pluginDirectories where nutch plugins are located. Each
element may be a relative or absolute path. If absolute, it is used
as is. If relative, it is searched for on the classpath.</description>
</property> 记住是单数哦 bin中的:
plugin文件夹是单数,所以这里要做一下修改。
<property>
<name>plugin.folders</name>
<value>./src/plugins</value>
<description>./src/pluginDirectories where nutch plugins are located. Each
element may be a relative or absolute path. If absolute, it is used
as is. If relative, it is searched for on the classpath.</description>
</property>
异常:nutch下载的html不完整的因素
1 http://news.163.com/ skipped. Content of size 481597 was truncated to 65376
解决方案:
将conf/nutch-default.xml 将 parser.skip.truncated 为false 2 http请求的字节限制
<property>
<name>http.content.limit</name>
<value>-1</value>
<description>The length limit for downloaded content using the http://
protocol, in bytes. If this value is nonnegative (>=0), content longer
than it will be truncated; otherwise, no truncation at all. Do not
confuse this setting with the file.content.limit setting.
</description>
</property>
异常:
种子添加了,http://www.gov.cn/
regex-urlfilter.txt 中添加了 +^http://www.gov.cn/
配置完全没错,但是爬虫却没采集到任何东西
原因:
对方设置了机器人协议。
解决方案:
如果要修改:Fetcher 类
/**
if (!rules.isAllowed(fit.u.toString())) {
// unblock
fetchQueues.finishFetchItem(fit, true);
if (LOG.isDebugEnabled()) {
LOG.debug("Denied by robots.txt: " + fit.url);
}
output(fit.url, fit.datum, null, ProtocolStatus.STATUS_ROBOTS_DENIED, CrawlDatum.STATUS_FETCH_GONE);
reporter.incrCounter("FetcherStatus", "robots_denied", 1);
continue;
}**/
异常 : unzipBestEffort returned null 转载自:http://blog.chinaunix.net/uid-8345138-id-3358621.html
Nutch爬虫爬取某网页是出现下列异常:
ERROR http.Http (?:invoke0(?)) - java.io.IOException: unzipBestEffort returned null
ERROR http.Http (?:invoke0(?)) - at org.apache.nutch.protocol.http.api.HttpBase.processGzipEncoded(HttpBase.java:472)
ERROR http.Http (?:invoke0(?)) - at org.apache.nutch.protocol.http.HttpResponse.<init>(HttpResponse.java:151)
ERROR http.Http (?:invoke0(?)) - at org.apache.nutch.protocol.http.Http.getResponse(Http.java:63)
ERROR http.Http (?:invoke0(?)) - at org.apache.nutch.protocol.http.api.HttpBase.getProtocolOutput(HttpBase.java:208)
ERROR http.Http (?:invoke0(?)) - at org.apache.nutch.fetcher.Fetcher$FetcherThread.run(Fetcher.java:173)
经过调试发现异常来源于:
java.io.IOException: Not in GZIP format
at java.util.zip.GZIPInputStream.readHeader(GZIPInputStream.java:137)
at java.util.zip.GZIPInputStream.<init>(GZIPInputStream.java:58)
at java.util.zip.GZIPInputStream.<init>(GZIPInputStream.java:68)
该异常原因:
此页面采用这个是一个分段传输,而nutch爬虫则默认采用了非分段式处理,导致构造GZIP时出错,从而影响了后面的GZIP解压失败。
是否是分段传输可以在Http headers里面看到,如果是分段传输则有:transfer-encoding:chunked这样一个响应。
处理方法:
1. 修改接口org.apache.nutch.metadata.HttpHeaders, 添加:
- public final static String TRANSFER_ENCODING = "Transfer-Encoding";
2. 在nutch中的org.apache.nutch.protocol.http.HttpResponse类中已经提供了分段传输类型的处理方法:
- private void readChunkedContent(PushbackInputStream in,
- StringBuffer line)
我们只需要在HttpResponse的构造方法总调用该方法即可,添加如下代码:
- String transferEncoding = getHeader(Response.TRANSFER_ENCODING);
- if(transferEncoding != null && transferEncoding.equalsIgnoreCase("chunked")){
- StringBuffer line = new StringBuffer();
- this.readChunkedContent(in, line);
- }else{
- readPlainContent(in);
- }
修改完成,运行测试。
![]()
刚才不能爬取的站点终于可以爬取了
=========================================================
注:
1.有两个HttpResponse类,一个在protocol.http里面,一个在protocol.httpclient里面,我们需要修改的是前者。
2.Nutch2.0已将readChunkedContent方法删掉,故贴上Nutch1.5的方法,将这个方法放入HttpResponse:
点击(此处)折叠或打开
- private void readChunkedContent(PushbackInputStream in, StringBuffer line)
- throws HttpException, IOException {
- boolean doneChunks = false;
- int contentBytesRead = 0;
- byte[] bytes = new byte[Http.BUFFER_SIZE];
- ByteArrayOutputStream out = new ByteArrayOutputStream(Http.BUFFER_SIZE);
- while (!doneChunks) {
- if (Http.LOG.isTraceEnabled()) {
- Http.LOG.trace("Http: starting chunk");
- }
- readLine(in, line, false);
- String chunkLenStr;
- // if (LOG.isTraceEnabled()) { LOG.trace("chunk-header: '" + line +
- // "'"); }
- int pos = line.indexOf(";");
- if (pos < 0) {
- chunkLenStr = line.toString();
- } else {
- chunkLenStr = line.substring(0, pos);
- // if (LOG.isTraceEnabled()) { LOG.trace("got chunk-ext: " +
- // line.substring(pos+1)); }
- }
- chunkLenStr = chunkLenStr.trim();
- int chunkLen;
- try {
- chunkLen = Integer.parseInt(chunkLenStr, 16);
- } catch (NumberFormatException e) {
- throw new HttpException("bad chunk length: " + line.toString());
- }
- if (chunkLen == 0) {
- doneChunks = true;
- break;
- }
- if ((contentBytesRead + chunkLen) > http.getMaxContent())
- chunkLen = http.getMaxContent() - contentBytesRead;
- // read one chunk
- int chunkBytesRead = 0;
- while (chunkBytesRead < chunkLen) {
- int toRead = (chunkLen - chunkBytesRead) < Http.BUFFER_SIZE ? (chunkLen - chunkBytesRead)
- : Http.BUFFER_SIZE;
- int len = in.read(bytes, 0, toRead);
- if (len == -1)
- throw new HttpException("chunk eof after "
- + contentBytesRead + " bytes in successful chunks"
- + " and " + chunkBytesRead + " in current chunk");
- // DANGER!!! Will printed GZIPed stuff right to your
- // terminal!
- // if (LOG.isTraceEnabled()) { LOG.trace("read: " + new
- // String(bytes, 0, len)); }
- out.write(bytes, 0, len);
- chunkBytesRead += len;
- }
- readLine(in, line, false);
- }
- if (!doneChunks) {
- if (contentBytesRead != http.getMaxContent())
- throw new HttpException(
- "chunk eof: !doneChunk && didn't max out");
- return;
- }
- content = out.toByteArray();
- parseHeaders(in, line);
- }
3.修改构造方法的地方在call readPlainContent的地方。
could only be replicated to nodes, instead of 周末机房断电,然后hadoop爆出如题的错误,解决方案就是关闭所有节点的防火墙,相关命令如下: 查看防火墙状态:
/etc/init.d/iptables status
暂时关闭防火墙:
/etc/init.d/iptables stop
禁止防火墙在系统启动时启动
/sbin/chkconfig --level iptables off
重启iptables:
/etc/init.d/iptables restart
nutch 异常集锦的更多相关文章
- 【Apache Nutch系列】Nutch2.0配置安装异常集锦
1.java.lang.NoClassDefFoundError: org/apache/hadoop/hbase/HBaseConfiguration Exception in thread &qu ...
- SP Flash Tool使用异常集锦
1.The load scatter file is invalid无法载入scatter文件 (ubuntu下)我如果我们在使用MTK的Smart Phone Flash Tool过程中无法载入Sc ...
- java常见异常集锦
1. java.lang.nullpointerexception 这个异常大家肯定都经常遇到,异常的解释是"程序遇上了空指针",简单地说就是调用了未经初始化的对象或者是不存在的对 ...
- JAVA常见异常集锦(持续更新)
No1:Nested in org.springframework.beans.factory.parsing.BeanDefinitionParsingException 2013-07-02 10 ...
- MyBatis 异常 集锦
异常1.使用映射器 (还没有使用Spring) 异常信息摘要: org.apache.ibatis.binding.BindingException: Type interface com.jege. ...
- Hibernate 异常 集锦
异常1.Error parsing JNDI name [foo] 异常信息摘要: org.hibernate.engine.jndi.JndiException: Error parsing JND ...
- JPA 系列教程 异常 集锦
异常1.hibernate升级到3.5版本 异常信息摘要: Associations marked as mappedBy must not define database mappings like ...
- Tensorflow异常集锦
一.tensorflow checkpoint报错 在调用tf.train.Saver#save时,如果使用的路径是绝对路径,那么保存的checkpoint里面用的就是绝对路径:如果使用的是相对路径, ...
- Hibernate 菜鸟教程 异常 集锦
异常1.Error parsing JNDI name [foo] 异常信息摘要: org.hibernate.engine.jndi.JndiException: Error parsing JND ...
随机推荐
- windows mysql 中文乱码和中文录入提示太大错误的解决方法
今天操作mysql的时候很郁闷,因为修改默认字符集搞了半天,终于弄成了(关于如何把windows的默认字符集设置成功,可以参看另一篇博文,最终在mysql中输入show variables like ...
- WCF - 实例与会话
实例上下文 实例上下文是对服务实例的封装 是WCF管理服务实例生命周期的依托 一个WCF服务通过ServiceHost进行寄宿 开启服务后当接收到请求 则会判断当前是否存在实例上下文 如果存在 则通 ...
- 网络学习笔记----01--pathping跟踪数据包路径
操作系统win7 Pathping主要用于提供有关在来源和目标之间的中间跃点处的网络滞后和网络丢失的信息. Pathping将多个回显请求消息发送到来源和目标之间的各个路由器一段时间,然后根据各个路由 ...
- Linux学习笔记总结--ssh认证登录
原理简介 SSH证书认证登录的基础是一对唯一匹配密钥: 私钥(private key)和公钥(public key).公钥用于对数据进行加密,而且只能用于加密.而私钥只能对使用所匹配的公钥,所加密过的 ...
- sublime text 3.0使用
# 快捷键 //未完待续 ctrl+p : 文件快速搜索 Ctrl+D : 选词 (按住-继续选择下个相同的字符串) ctrl+L : 选择整行(按住-继续选择下行,即按住ctrl不放按一次L则 ...
- centos 安装mysqldb 记录
vim setup_pofix.py #修改mysql_config路径 <pre> ln -s /usr/local/mysql/lib/libmysqlclient.so.18 /us ...
- .NET 统一用户管理 -- 单点登录
单点登录 前言 本篇做为.Net 统一用户管理的系列文章的开山之作,主要说一个单点登录是怎么实现的,以及为啥要统一用户管理. 单点登录(Single Sign On),简称为 SSO,是目前比较流行的 ...
- 用Markdown优雅的渲染我们的网页
认识 Markdown Markdown 是一种用来写作的轻量级「标记语言」,它用简洁的语法代替排版,而不像一般我们用的字处理软件 Word 或 Pages 有大量的排版.字体设置.它使我们专心于码字 ...
- 基础之 window-self-top-opener
今天我都在怀疑,很多项目还用不用iframe这个框架做页面布局. 如果你有兴趣想告诉我,请给我留言. 一. 说明 注:这里top和window.top等价,window是可以省略的,有得情况下不允许省 ...
- Java设计模式--单列设计模式
设计模式:解决某一类问题行知最有效的方法.java有23种设计模式 单列设计模式: 解决一个类在内存中只存在一个对象 思路:(要保证对象的唯一性) 1.为了避免其它程序建立该对象,先禁止替他类创建改对 ...