`
bupt04406
  • 浏览: 347392 次
  • 性别: Icon_minigender_1
  • 来自: 杭州
社区版块
存档分类
最新评论

java.net.SocketTimeoutException: 480000 millis timeout hdfs

 
阅读更多

hdfs集群出现SocketTimeoutException,但是原因不得而知,社区不少issue都提到过,但是就是不懂具体原因。

https://issues.apache.org/jira/browse/HDFS-693

https://issues.apache.org/jira/browse/HDFS-770

https://issues.apache.org/jira/browse/HDFS-3342

http://search-hadoop.com/m/zjdcx1aR6Aa1/millis+timeout+while+waiting+for+channel+to+be+ready+for+write.+ch&subj=Lots+of+Different+Kind+of+Datanode+Errors

 

http://www.quora.com/What-are-some-tips-for-configuring-HBase

相关讨论说设置dfs.datanode.socket.write.timeout为0可以解决,不管怎么样都觉得没到点上。

 

今天测试,偶然发现居然重现了

 

 

重现步骤如下:

 

CacheConfig cacheConf = new CacheConfig(conf);

SchemaMetrics.setUseTableNameInTest(false);

Reader reader = HFile.createReader(fs, path, cacheConf);

reader.loadFileInfo();

 

HFileScanner scanner = reader.getScanner(false, false); // pread=false,非随机读取

// Align scanner at start of the file.

scanner.seekTo();

ByteBuffer key = scanner.getKey();

byte [] keyBytes = Bytes.toBytes(key);

ByteBuffer val = scanner.getValue();

byte[] valBytes = Bytes.toBytes(val);

System.out.println(" key: " + Bytes.toString(keyBytes));

System.out.println(" value: " + Bytes.toString(valBytes));

while (true) {

try { Thread.sleep(60000); count++; } catch (Exception e) { e.printStackTrace(); }

}

 

这个时候可以看到 

DataNode有个DataXceiver线程,栈如下:

"DataXceiver for client /127.0.0.1:35602 [sending block blk_912297361534887040_1518]" daemon prio=10 tid=0x08259400 nid=0x225 runnable [0xb34e1000]

java.lang.Thread.State: RUNNABLE

at sun.nio.ch.EPollArrayWrapper.epollWait(Native Method)

at sun.nio.ch.EPollArrayWrapper.poll(EPollArrayWrapper.java:210)

at sun.nio.ch.EPollSelectorImpl.doSelect(EPollSelectorImpl.java:65)

at sun.nio.ch.SelectorImpl.lockAndDoSelect(SelectorImpl.java:69)

 

locked <0x508e9be8> (a sun.nio.ch.Util$2)

locked <0x508e9bd8> (a java.util.Collections$UnmodifiableSet)

locked <0x508d9798> (a sun.nio.ch.EPollSelectorImpl)

at sun.nio.ch.SelectorImpl.select(SelectorImpl.java:80)

at org.apache.hadoop.net.SocketIOWithTimeout$SelectorPool.select(SocketIOWithTimeout.java:339)

at org.apache.hadoop.net.SocketIOWithTimeout.waitForIO(SocketIOWithTimeout.java:249)

at org.apache.hadoop.net.SocketOutputStream.waitForWritable(SocketOutputStream.java:164)

at org.apache.hadoop.net.SocketOutputStream.transferToFully(SocketOutputStream.java:207)

at org.apache.hadoop.hdfs.server.datanode.BlockSender.sendChunks(BlockSender.java:391)

at org.apache.hadoop.hdfs.server.datanode.BlockSender.sendBlock(BlockSender.java:493)

at org.apache.hadoop.hdfs.server.datanode.DataXceiver.readBlock(DataXceiver.java:291)

at org.apache.hadoop.hdfs.server.datanode.DataXceiver.run(DataXceiver.java:180)

 

过了480000ms后,DataNode出现日志:

 

2012-08-13 00:55:14,155 INFO org.apache.hadoop.hdfs.server.datanode.DataNode.clienttrace: src: /127.0.0.1:50010, dest: /127.0.0.1:35634, bytes: 330240, op: HDFS_READ, cliID: DFSClient_1059963309, offset: 0, srvID: DS-383488255-0:0:0:0:0:0:0:1-50010-1343028787069, blockid: blk_912297361534887040_1518, duration: 480154978318

2012-08-13 00:55:14,155 WARN org.apache.hadoop.hdfs.server.datanode.DataNode: DatanodeRegistration(127.0.0.1:50010, storageID=DS-383488255-0:0:0:0:0:0:0:1-50010-1343028787069, infoPort=50075, ipcPort=50020):Got exception while serving blk_912297361534887040_1518 to /127.0.0.1:

java.net.SocketTimeoutException: 480000 millis timeout while waiting for channel to be ready for write. ch : java.nio.channels.SocketChannel[connected local=/127.0.0.1:50010 remote=/127.0.0.1:35634]

at org.apache.hadoop.net.SocketIOWithTimeout.waitForIO(SocketIOWithTimeout.java:250)

at org.apache.hadoop.net.SocketOutputStream.waitForWritable(SocketOutputStream.java:164)

at org.apache.hadoop.net.SocketOutputStream.transferToFully(SocketOutputStream.java:207)

at org.apache.hadoop.hdfs.server.datanode.BlockSender.sendChunks(BlockSender.java:391)

at org.apache.hadoop.hdfs.server.datanode.BlockSender.sendBlock(BlockSender.java:493)

at org.apache.hadoop.hdfs.server.datanode.DataXceiver.readBlock(DataXceiver.java:291)

at org.apache.hadoop.hdfs.server.datanode.DataXceiver.run(DataXceiver.java:180)

 

2012-08-13 00:55:14,162 INFO org.apache.hadoop.hdfs.server.datanode.DataNode: check disk error costs(ms): 7

2012-08-13 00:55:14,163 ERROR org.apache.hadoop.hdfs.server.datanode.DataNode: DatanodeRegistration(127.0.0.1:50010, storageID=DS-383488255-0:0:0:0:0:0:0:1-50010-1343028787069, infoPort=50075, ipcPort=50020):DataXceiver remoteAddress:/127.0.0.1:35634

java.net.SocketTimeoutException: 480000 millis timeout while waiting for channel to be ready for write. ch : java.nio.channels.SocketChannel[connected local=/127.0.0.1:50010 remote=/127.0.0.1:35634]

at org.apache.hadoop.net.SocketIOWithTimeout.waitForIO(SocketIOWithTimeout.java:250)

at org.apache.hadoop.net.SocketOutputStream.waitForWritable(SocketOutputStream.java:164)

at org.apache.hadoop.net.SocketOutputStream.transferToFully(SocketOutputStream.java:207)

at org.apache.hadoop.hdfs.server.datanode.BlockSender.sendChunks(BlockSender.java:391)

at org.apache.hadoop.hdfs.server.datanode.BlockSender.sendBlock(BlockSender.java:493)

at org.apache.hadoop.hdfs.server.datanode.DataXceiver.readBlock(DataXceiver.java:291)

at org.apache.hadoop.hdfs.server.datanode.DataXceiver.run(DataXceiver.java:180)

 

此时在看DataNode进程栈,发现上面的DataXceiver 栈信息已经没有了,这个线程退出了

原因是因为Client向DataNode请求数据,但是只读取了一部分,剩下的一直没有去读取,所以过了480000后就会超时

 

在一些scan场景下就可能发生,scan的时候调用的是seek+read,new BlockReader时,设置的长度是(blk.getNumBytes() - offsetIntoBlock,也就是当前块剩余可读的数据量,从当前位置到block结束的长度)

如果scan没有读取到块结束就不读了,并且之后480000ms都没有在通过这个流执行seek+read,那么就会出现SocketTimeoutException异常

 

分享到:
评论
5 楼 bupt04406 2014-01-22  
robindut 写道
请问一下这各问题是怎么解决的?

懂了原理之后,这个问题没什么关系,不解决也没事。
4 楼 bupt04406 2014-01-22  
fansika 写道
问一下 上面的问题,你解决了吗?

懂了原理之后,这个问题没什么关系。
3 楼 robindut 2014-01-22  
请问一下这各问题是怎么解决的?
2 楼 fansika 2014-01-14  
问一下 上面的问题,你解决了吗?
1 楼 fansika 2014-01-14  
问一下 上面的问题,你决绝了吗?

相关推荐

    java.net.SocketTimeoutException: Receive timed out

    标题中的“java.net.SocketTimeoutException: Receive timed out”是一个Java编程中常见的异常,通常发生在进行网络通信时,接收数据超时。这个异常是由于Socket在等待接收数据时超过了预设的超时时间,没有接收到...

    java.io.Reader 和 java.io.InputStream 的区别

    ### Java.io.Reader与Java.io.InputStream的关键差异解析 在深入探讨`java.io.Reader`与`java.io.InputStream`的具体差异之前,我们首先需要理解这两者在Java I/O操作中的基础角色。`java.io.Reader`和`java.io....

    Redis连接超时异常的处理方法

    Exception in thread “main” redis.clients.jedis.exceptions.JedisConnectionException: java.net.SocketTimeoutException: Read timed out  at redis.clients.util.RedisInputStream.ensureFill...

    Redis常见客户端异常.docx

    redis.clients.jedis.exceptions.JedisConnectionException: java.net.SocketTimeoutException: Read timed out 该异常的原因有: 1. 读写超时设置的过短:可以调整读写超时的设置,以满足实际情况。 2. 命令本身...

    NewClass.java

    广东外语外贸大学思科信息学院计算机专业JAVA课程专业中的一小段代码

    nacos-dubbo:dubbo微服务使用nacos注册中心

    code:500 msg: java.net.SocketTimeoutException: connect timed out at com.alibaba.nacos.client.naming.net.NamingProxy.callServer(NamingProxy.java:424) at ...

    java socket长连接中解决read阻塞的3个办法

    可以通过调用`Socket`对象的`setSoTimeout(int timeout)`方法来设置一个读取超时值。如果在指定的时间内没有接收到数据,`read()`方法会抛出一个`SocketTimeoutException`,从而强制退出阻塞状态。示例代码如下: ...

    hbase常见错误整理3年运维经验整理

    03-02 12:11:21,983 WARN org.apache.hadoop.hdfs.DFSClient: DFSOutputStream ResponseProcessor exception for block blk_1439491087566691588_6207 java.net.SocketTimeoutException: 69000 millisecond timeout ...

    JAVA开发JAVA本地监听与远程端口扫描(源代码+论文)

    在Java中,这通常通过`java.net.Socket`类或`java.net.SocketTimeoutException`来实现。下面是一个基本的远程端口扫描示例: ```java import java.io.IOException; import java.net.InetAddress; import java.net....

    DnsQuery_SUN_java.zip

    - 缓存时间可以通过系统属性`sun.net.dns.cache.timeout`进行设置,默认值为60秒。 3. **DNSSEC(DNS Security Extensions)**: - Java支持DNSSEC,可以验证DNS查询响应的来源和完整性。这通过`java.net.DNS...

    poi处理excel文件的小程序

    在Java编程中,Apache POI库是处理Excel文件的常用工具,尤其在数据分析、自动化报告生成等领域有着广泛的应用。本程序"poi处理excel文件的小程序"就是基于Apache POI实现的,用于读取和操作Excel数据。 1. **...

    android中简单的客户端与服务器[归类].pdf

    import java.net.SocketTimeoutException; import java.net.UnknownHostException; public class ClientActivity extends Activity { public EditText messageEditText; @Override public void onCreate(Bundle...

    java 网络编程

    在Java中,`java.net.Socket`和`java.net.ServerSocket`类用于客户端和服务器之间的通信。客户端通过创建Socket对象与服务器建立连接,而服务器端则通过创建ServerSocket监听特定端口,等待客户端连接。 2. **TCP/...

    简单的UDP通信JAVA代码

    System.out.println("Heartbeat timeout, retrying..."); } } } socket.close(); } } ``` 对应的服务器端代码也需要处理接收到的心跳包并返回响应,以保持通信的连贯性。通过这样的设计,我们可以在不可靠的...

    java 多线程ftp代码

    2. Java FTP库:Java标准库中的`java.net.FTPSClient`和`java.net.FTPClient`类提供了FTP功能。此外,Apache Commons Net库提供了更强大的`FTPClient`,支持FTP、FTPS(FTP over SSL/TLS)以及SFTP(SSH File ...

    使用Android实现联网

    - `android.net`包:除了`java.net`中的类,还提供了额外的网络访问接口,如URI类。 - `android.net.http`包:处理SSL证书,支持安全的HTTPS连接。 - `android.net.wifi`包:用于管理WiFi相关的功能,如扫描、...

    java Socket编程基础代码

    在Java中,`java.net.Socket`类代表了TCP协议的Socket,而`java.net.ServerSocket`则用于创建监听客户端连接的服务器端Socket。 1. **创建服务器端Socket** - `ServerSocket(int port)`:创建一个监听指定端口的...

Global site tag (gtag.js) - Google Analytics