2012-03-14 3 views
3

포함 된 테스트 프로그램에서 로컬 디스크의 파일을 HDFS로 복사하려고합니다.hadoop에서 HDFS에 연결할 때의 EOFException

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에 연결하는 데 문제가 있다는 것을 모았습니다.이 정보는 Configuration의 fs.default.name 속성과 관련이 있습니다. 아래는 내 핵심-site.xml 파일의 관련 섹션 : 아마도 특별한 관심의

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

</configuration> 

는 사실은 그 나는 1 메가 항아리에 내 클래스 경로에있는 모든 항아리를 번들하고를 통해이 프로그램을 실행하면 hadoop 명령은 잘 작동합니다. 그래서 내가 뭘 잘못하고 있니?

+0

명령 줄 유틸리티를 통해 HDFS에 접근 할 수 있습니까? 그렇다면 클러스터에서 실행중인 동일한 버전의 Hadoop에 대해 코드를 컴파일하고 있습니까? –

+0

알다시피, 나는 그들이 같은 버전이라고 맹세 할 준비가되어 있었다. 내 개발 시스템으로 이름 노드를 사용하고 있습니다. 분명히 나는 ​​같은 버전을 개발할 것입니다! 하지만 그 전에 내 이름을 넣어, 내가 확인하기로 결정하고, 당신은 그것을 모를거야! 클러스터가 cloudera jar를 실행 중이며, 개발을 위해 제공된 jar는 동일하지 않습니다. classpath에 cloudera jar를 넣는 대신에 문제가 해결되었습니다! 그것을 "대답"에 자유롭게 두십시오. – david

답변

15

클러스터에서 실행중인 것과 동일한 Hadoop 버전에 대해 컴파일해야합니다.

+1

우리의 경우에는 더 까다 롭습니다. hadoop 클라이언트의 다른 버전과 함께 내장 된 pig-udf.jar가 있습니다. maven은 우리 버전의 hadoop-core.jar (0.20.2-cdh3u2)와 pig-udf.jar 사이에 충돌이없는 것을 보았습니다. 그리고 두 폴더가 동일한 폴더의 classpath에 놓이고'-cp lib/* '결과가 비 결정적이었습니다 ... – ihadanny

+0

Hadoop의 Apache Spark에 대한 Spark Job Server에서 HDFS 파일 스트리밍 작업을 실행할 때 동일한 java.io.EOFException을 가졌습니다. Spark Job Server가 대상 런타임 Spark 클러스터와 정확히 동일한 버전의 Hadoop에 대해 빌드 된 클래스 경로에서 Spark 버전을 사용하는 경우에만 EOFException이 사라지고 파일 스트리밍 작업이 수행됩니다. – snark

1

직렬화 가능 인터페이스에서 올바른 예외를 확인하고 적절한 버전의 hadoop을 사용하십시오. 오류

내가 과거에 유사한 문제에 직면했다
0

귀하의 코드입니다. 하지만 문제는 제 것이 었습니다. 저는 두 가지 다른 버전의 hadoop을 가지고있었습니다. 나는 이전 버전의 데몬을 시작했고 bash_profile은 새로운 것을 가리키며이 문제가 발생했다. 그래서 당신이 버전 불일치로 놀지 않는지 확인하십시오``

+2

대답이 짧은 경우 의견을 고려하십시오. – placeybordeaux

0

에서 아마 "foo는"디렉토리 경로 문제에 대한