我正在使用伪集群模式下的 Hadoop Pipes MapReduce 应用程序,该应用程序抛出以下错误:
2013-06-24 11:04:41,026 ERROR org.apache.hadoop.mapred.pipes.BinaryProtocol: java.net.SocketException: Connection reset
at java.net.SocketInputStream.read(SocketInputStream.java:189)
at java.net.SocketInputStream.read(SocketInputStream.java:121)
at java.io.BufferedInputStream.fill(BufferedInputStream.java:235)
at java.io.BufferedInputStream.read(BufferedInputStream.java:254)
at java.io.DataInputStream.readByte(DataInputStream.java:265)
at org.apache.hadoop.io.WritableUtils.readVLong(WritableUtils.java:299)
at org.apache.hadoop.io.WritableUtils.readVInt(WritableUtils.java:320)
at org.apache.hadoop.mapred.pipes.BinaryProtocol$UplinkReaderThread.run(BinaryProtocol.java:121)
这会产生一个损坏的管道错误,该错误会在多次尝试后中止应用程序(所有尝试都显示相同的行为)。
有趣的是,在运行这项工作之前,我运行了另一个完美运行的工作。我已经阅读了一些关于密集型 CPU 映射器(这基本上是我所拥有的)的内容,因为连接在超时后关闭,但我还没有找到解决方案。
我将不胜感激任何更好的诊断指南和解决此问题的提示。是否有任何配置参数或代码可以修改以消除超时?
提前致谢,
里奥
++++ 编辑 ++++
做更多的研究我发现这个版本支持将超时设置为零。可以在hadoop-home /conf/hdfs-site.xml 中修改套接字超时,在配置标签中添加类似这样的内容:
<property>
<name>dfs.socket.timeout</name>
<value>0</value>
</property>
同时使用零值和高值对我有用。
++++ 编辑 2 ++++
dfs.socket.timeout仅适用于读取套接字,因此dfs.datanode.socket.write.timeout也应该修改。
我希望它有所帮助。
问候。