3

我希望看到以下代码通过 hdfs 在我的“/tmp”中创建一个目录。例如,我可以运行

hadoop fs -mkdir hdfs://localhost:9000/tmp/newdir

并成功。

jps 列出了正在运行的namenode、datanode。Hadoop 版本 0.20.1+169.89。

  public static void main(String[] args) throws IOException {
    Configuration conf = new Configuration();
    conf.set("fs.default.name", "hdfs://localhost:9000");
    FileSystem fs = FileSystem.get(conf);
    fs.mkdirs(new Path("hdfs://localhost:9000/tmp/alex"));
}

我收到以下错误:

Exception in thread "main" java.io.IOException: Failed on local exception: java.io.EOFException; Host Details : local host is: "<my-machine-name>/192.168.2.6"; destination host is: "localhost":9000; 
    at org.apache.hadoop.net.NetUtils.wrapException(NetUtils.java:764)
    at org.apache.hadoop.ipc.Client.call(Client.java:1351)
    at org.apache.hadoop.ipc.Client.call(Client.java:1300)
    at org.apache.hadoop.ipc.ProtobufRpcEngine$Invoker.invoke(ProtobufRpcEngine.java:206)
    at com.sun.proxy.$Proxy9.mkdirs(Unknown Source)
    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
    at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39)
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25)
    at java.lang.reflect.Method.invoke(Method.java:597)
    at org.apache.hadoop.io.retry.RetryInvocationHandler.invokeMethod(RetryInvocationHandler.java:186)
    at org.apache.hadoop.io.retry.RetryInvocationHandler.invoke(RetryInvocationHandler.java:102)
    at com.sun.proxy.$Proxy9.mkdirs(Unknown Source)
    at org.apache.hadoop.hdfs.protocolPB.ClientNamenodeProtocolTranslatorPB.mkdirs(ClientNamenodeProtocolTranslatorPB.java:467)
    at org.apache.hadoop.hdfs.DFSClient.primitiveMkdir(DFSClient.java:2394)
    at org.apache.hadoop.hdfs.DFSClient.mkdirs(DFSClient.java:2365)
    at org.apache.hadoop.hdfs.DistributedFileSystem$16.doCall(DistributedFileSystem.java:817)
    at org.apache.hadoop.hdfs.DistributedFileSystem$16.doCall(DistributedFileSystem.java:813)
    at org.apache.hadoop.fs.FileSystemLinkResolver.resolve(FileSystemLinkResolver.java:81)
    at org.apache.hadoop.hdfs.DistributedFileSystem.mkdirsInternal(DistributedFileSystem.java:813)
    at org.apache.hadoop.hdfs.DistributedFileSystem.mkdirs(DistributedFileSystem.java:806)
    at org.apache.hadoop.fs.FileSystem.mkdirs(FileSystem.java:1933)
    at com.twitter.amplify.core.dao.AccessHdfs.main(AccessHdfs.java:39)
    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
    at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39)
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25)
    at java.lang.reflect.Method.invoke(Method.java:597)
    at com.intellij.rt.execution.application.AppMain.main(AppMain.java:120)
Caused by: java.io.EOFException
    at java.io.DataInputStream.readInt(DataInputStream.java:375)
    at org.apache.hadoop.ipc.Client$Connection.receiveRpcResponse(Client.java:995)
    at org.apache.hadoop.ipc.Client$Connection.run(Client.java:891)
4

2 回答 2

2

您的版本不匹配-您的问题指出了运行版本 0.20.1+169.89 的 NameNode(我认为它来自 Cloudera distro CDH2 - http://archive.cloudera.com/cdh/2/),并且在 IntelliJ 中您正在使用Apache hadoop 2.2.0 版。

更新您的 IntelliJ 类路径以使用与您的集群版本兼容的 jar - 即:

  • hadoop-0.20.1+169.89-core.jar
于 2013-11-11T14:09:58.760 回答
0

我在主节点和从节点上安装了相同版本的 Hadoop(hadoop-2.2.0),但仍然遇到相同的异常。为了摆脱它,我遵循了以下步骤:
1. 从 $HADOP_HOME 执行 sbin/stop-all.sh,停止集群
2. 从所有有问题的节点中删除数据目录。如果你不知道数据目录在哪里,那么打开core-site.xml,找到hadoop.tmp.dir对应的值,进入那个目录,然后cd dfs在那里你会找到一个名为data的目录,从所有目录中删除那个数据目录有问题的数据
节点 3. 格式化主节点
4. 从 $HADOP_HOME 执行 sbin/start-all.sh,启动集群

于 2014-05-16T23:27:36.333 回答