복붙노트

[HADOOP] Java로 원격 HDFS 파일 읽기

HADOOP

Java로 원격 HDFS 파일 읽기

간단한 Hadoop 설치로 약간의 문제가 있습니다. hadoop 2.4.0을 다운로드하여 단일 CentOS Linux 노드 (가상 머신)에 설치했습니다. 아파치 사이트 (http : //hadoop.apache.org/docs/r2.4.0/hadoop-project-dist/hadoop-common/SingleCluster.html)에 설명 된대로 의사 배포로 단일 노드에 대해 hadoop을 구성했습니다. 그것은 로그에서 아무 문제없이 시작하고 명령 행에서 "hadoop fs"명령을 사용하여 파일을 읽고 쓸 수 있습니다.

Java API를 사용하여 원격 시스템의 HDFS에서 파일을 읽으려고합니다. 컴퓨터는 디렉토리 내용을 연결하고 나열 할 수 있습니다. 또한 파일에 코드가 있는지 여부를 확인할 수 있습니다.

Path p=new Path("hdfs://test.server:9000/usr/test/test_file.txt");
FileSystem fs = FileSystem.get(new Configuration());
System.out.println(p.getName() + " exists: " + fs.exists(p));

시스템은 존재 함을 나타내는 "true"를 인쇄합니다. 그러나 다음과 같이 파일을 읽으려고 할 때 :

BufferedReader br = null;
try {
    Path p=new Path("hdfs://test.server:9000/usr/test/test_file.txt");
    FileSystem fs = FileSystem.get(CONFIG);
    System.out.println(p.getName() + " exists: " + fs.exists(p));

    br=new BufferedReader(new InputStreamReader(fs.open(p)));
    String line = br.readLine();

    while (line != null) {
        System.out.println(line);
        line=br.readLine();
    }
}
finally {
    if(br != null) br.close();
}

이 코드는 예외를 throw합니다.

스레드 "main"에서 예외가 발생했습니다. org.apache.hadoop.hdfs.BlockMissingException : 블록을 가져올 수 없습니다 : BP-13917963-127.0.0.1-1398476189167 : blk_1073741831_1007 file = / usr / test / test_file.txt

인터넷 검색을 통해 가능한 팁을 얻었지만 모두 체크 아웃되었습니다. 데이터 노드가 연결되어 있고 활성 상태이며 공간이 충분합니다. hdfs dfsadmin -report의 admin 보고서는 다음을 보여줍니다.

클라이언트 jar는 hadoop 설치에서 직접 복사되므로 버전이 일치하지 않습니다. Java 클래스로 파일 시스템을 탐색하고 파일 속성을 읽을 수 있습니다. 예외를 얻지 않고 파일 내용을 읽을 수 없습니다. 코드를 사용하여 파일을 작성하려고하면 다음과 같이하십시오.

FileSystem fs = null;
BufferedWriter br = null;

System.setProperty("HADOOP_USER_NAME", "root");

try {
    fs = FileSystem.get(new Configuraion());

    //Path p = new Path(dir, file);
    Path p = new Path("hdfs://test.server:9000/usr/test/test.txt");
    br = new BufferedWriter(new OutputStreamWriter(fs.create(p,true)));
    br.write("Hello World");
}
finally {
    if(br != null) br.close();
    if(fs != null) fs.close();
}

이것은 파일을 생성하지만 바이트를 쓰지 않고 예외를 throw합니다.

스레드 "main"의 예외 org.apache.hadoop.ipc.RemoteException (java.io.IOException) : /usr/test/test.txt 파일은 minReplication (= 1) 대신 0 노드로만 복제 될 수 있습니다. 1 개의 데이터 노드가 실행 중이고 1 개의 노드가이 작업에서 제외됩니다.

이것에 대한 인터넷 검색은 가능한 공간 문제를 나타내지 만 dfsadmin 보고서에서 많은 공간이있는 것으로 보입니다. 이것은 일반 바닐라 설치이며이 문제를 해결할 수는 없습니다.

환경 요약은 다음과 같습니다.

섬기는 사람:

가상 배포가있는 Hadoop 2.4.0 (http://hadoop.apache.org/docs/r2.4.0/hadoop-project-dist/hadoop-common/SingleCluster.html)

CentOS 6.5 가상 머신 64 비트 서버 Java 1.7.0_55

고객:

Windows 8 (가상 컴퓨터) Java 1.7.0_51

어떤 도움이라도 대단히 감사하겠습니다.

해결법

  1. ==============================

    1.하둡 오류 메시지는 실망 스럽습니다. 종종 그들은 그들이 의미하는 바를 말하지 않고 진짜 문제와 관련이 없습니다. 이 문제는 클라이언트, namenode 및 datanode가 제대로 통신 할 수없는 경우 발생합니다. 귀하의 경우 두 가지 문제 중 하나를 선택합니다.

    하둡 오류 메시지는 실망 스럽습니다. 종종 그들은 그들이 의미하는 바를 말하지 않고 진짜 문제와 관련이 없습니다. 이 문제는 클라이언트, namenode 및 datanode가 제대로 통신 할 수없는 경우 발생합니다. 귀하의 경우 두 가지 문제 중 하나를 선택합니다.

    호스트 이름 "test.server"는 매우 의심 스럽습니다. 다음을 모두 확인하십시오.

    FQDN, 호스트 이름, 숫자 IP 및 localhost 사용시 모순이 있으면 제거해야합니다. conf 파일이나 클라이언트 코드에서 이들을 혼용하지 마십시오. FQDN을 일관되게 사용하는 것이 좋습니다. 숫자 IP의 일관된 사용은 보통 또한 작동합니다. 정규화되지 않은 호스트 이름, localhost 또는 127.0.0.1을 사용하면 문제가 발생합니다.

  2. ==============================

    2.위의 대답은 올바른 방향을 가리키고 있습니다. 다음을 추가하도록 허용 :

    위의 대답은 올바른 방향을 가리키고 있습니다. 다음을 추가하도록 허용 :

    hostname : 9000은 클라이언트 코드에서 액세스 할 수 있으므로 디렉토리 내용을 나열 할 수있었습니다. 너는 위의 2 번을하고 있었다. 읽고 쓸 수 있으려면 클라이언트 코드가 데이터 노드 (번호 3)에 액세스해야합니다. 데이터 노드 DFS 데이터 전송의 기본 포트는 50010입니다. 클라이언트 통신을 hostname : 50010으로 차단하는 중입니다. 방화벽 또는 SSH 터널링 구성 문제 일 수 있습니다. Hadoop 2.7.2를 사용하고 있었기 때문에 포트 번호 설정이 다를 수 있습니다.

  3. ==============================

    3.우리는 fs.default.name 공간을 다음과 같이 설정해야합니다.

    우리는 fs.default.name 공간을 다음과 같이 설정해야합니다.

    configuration.set ( "fs.default.name", "hdfs : // ourHDFSNameNode : 50000");

    아래 샘플 코드를 넣었습니다.

     Configuration configuration = new Configuration();
     configuration.set("fs.default.name","hdfs://ourHDFSNameNode:50000");
     FileSystem fs = pt.getFileSystem(configuration);
     BufferedReader br = new BufferedReader(new InputStreamReader(fs.open(pt)));
     String line = null;
     line = br.readLine
     while (line != null) {
      try {
        line = br.readLine
        System.out.println(line);
      }
    }
    
  4. from https://stackoverflow.com/questions/23307235/reading-remote-hdfs-file-with-java by cc-by-sa and MIT license