【问题标题】:EOFException in connecting to HDFS in hadoop在 hadoop 中连接到 HDFS 时出现 EOFException
【发布时间】:2014-06-12 12:39:54
【问题描述】:

我在包含的测试程序中尝试将文件从本地磁盘复制到 HDFS。代码如下:

package foo.foo1.foo2.test;

import java.io.IOException;

import org.apache.hadoop.conf.Configuration;
import org.apache.hadoop.fs.FileSystem;
import org.apache.hadoop.fs.Path;

public class TestTestTest {

    public static void main(String[] args) {

    String srcLocation = "foo";
    String destination = "hdfs:///tmp/";

    FileSystem hdfs = null;

    Configuration configuration = new Configuration();
    configuration.set("fs.default.name", "hdfs://namenode:54310/");

    try {
        hdfs = FileSystem.get(configuration);
    } catch (IOException e2) {
        e2.printStackTrace();
        return;
    }

    Path srcpath = new Path(srcLocation);
    Path dstpath = new Path(destination);

    try {
        hdfs.copyFromLocalFile(srcpath, dstpath);
    } catch (IOException e) {
        e.printStackTrace();
    }

    }

}

这会失败,但有以下异常:

java.io.IOException: Call to namenode/10.1.1.1:54310 failed on local exception:     java.io.EOFException
    at org.apache.hadoop.ipc.Client.wrapException(Client.java:775)
    at org.apache.hadoop.ipc.Client.call(Client.java:743)
    at org.apache.hadoop.ipc.RPC$Invoker.invoke(RPC.java:220)
    at $Proxy0.getProtocolVersion(Unknown Source)
    at org.apache.hadoop.ipc.RPC.getProxy(RPC.java:359)
    at org.apache.hadoop.hdfs.DFSClient.createRPCNamenode(DFSClient.java:106)
    at org.apache.hadoop.hdfs.DFSClient.<init>(DFSClient.java:207)
    at org.apache.hadoop.hdfs.DFSClient.<init>(DFSClient.java:170)
    at org.apache.hadoop.hdfs.DistributedFileSystem.initialize(DistributedFileSystem.java:82)
    at org.apache.hadoop.fs.FileSystem.createFileSystem(FileSystem.java:1378)
    at org.apache.hadoop.fs.FileSystem.access$200(FileSystem.java:66)
    at org.apache.hadoop.fs.FileSystem$Cache.get(FileSystem.java:1390)
    at org.apache.hadoop.fs.FileSystem.get(FileSystem.java:196)
    at org.apache.hadoop.fs.FileSystem.get(FileSystem.java:95)
    at foo.foo1.foo2.test.TestTestTest.main(TestTestTest.java:22)
Caused by: java.io.EOFException
    at java.io.DataInputStream.readInt(DataInputStream.java:375)
    at org.apache.hadoop.ipc.Client$Connection.receiveResponse(Client.java:501)
    at org.apache.hadoop.ipc.Client$Connection.run(Client.java:446)

我的问题看似简单:是什么原因造成的,我怎样才能使这个程序正常工作?根据我能找到的少量信息,我推测连接到 HDFS 存在问题,这与配置中的 fs.default.name 属性有关。以下是我的 core-site.xml 文件的相关部分:

<configuration>
  <property>
    <name>fs.default.name</name>
    <value>hdfs://namenode:54310</value>
  </property>

</configuration>

也许特别有趣的是,如果我将类路径中的所有 jar 包捆绑到一个巨型 jar 中,并通过 hadoop 命令运行该程序,它就可以正常工作。那我做错了什么?

【问题讨论】:

  • 您能否通过命令行实用程序访问 HDFS?如果是这样,您是否针对您在集群上运行的相同版本的 Hadoop 编译代码?
  • 你知道,我准备发誓它们是相同的版本。我的意思是,我使用名称节点作为我的开发机器。我肯定会针对相同的版本进行开发!但在我说出我的名字之前,我决定检查一下,你不知道吗!集群正在运行cloudera jars,我为开发提供的jars 不一样。将 cloudera jar 放在类路径上可以解决问题!随意把它放在“答案”中。

标签: java hadoop hdfs eofexception


【解决方案1】:

确保您正在针对您在集群上运行的相同 Hadoop 版本进行编译。

【讨论】:

  • 在我们的例子中更棘手:我们得到了一个 pig-udf.jar,它是用另一个版本的 hadoop 客户端构建的。 maven 发现我们的 hadoop-core.jar (0.20.2-cdh3u2) 版本和 pig-udf.jar 之间没有冲突,当它们都放在同一个文件夹的类路径中并加载 -cp lib/* 时,结果是不确定性...
  • 在从 Spark 作业服务器针对 Hadoop 上的 Apache Spark 运行 HDFS 文件流作业时,我遇到了相同的 java.io.EOFException。只有当我让 Spark 作业服务器在其类路径上使用与目标运行时 Spark 集群完全相同的 Hadoop 版本构建的 Spark 版本时,EOFException 才消失并且文件流作业工作。
【解决方案2】:

确保具有可序列化接口的正确异常并使用正确版本的 hadoop。

【讨论】:

    【解决方案3】:

    您的问题代码可能是错误的“foo”目录路径

    【讨论】:

    • 如果答案这么短,请考虑发表评论。
    【解决方案4】:

    我过去也遇到过类似的问题。但问题是我的,我有两个不同版本的 hadoop。我已经从早期版本启动了守护进程,并且 bash_profile 指向新的并且发生了这个问题。所以请确保你没有玩版本不匹配``

    【讨论】:

      猜你喜欢
      • 2022-11-10
      • 2015-07-29
      • 2020-07-19
      • 2012-01-31
      • 2020-05-12
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多