복붙노트

[HADOOP] Java에서 HDFS로 작성하면 "minReplication 대신 0 개의 노드로만 복제 할 수 있습니다"

HADOOP

Java에서 HDFS로 작성하면 "minReplication 대신 0 개의 노드로만 복제 할 수 있습니다"

CDH4 (Hadoop 2.0.0 실행) 용 Cloudera의 Hadoop Demo VM을 다운로드하여 시작했습니다. 내 Windows 7 컴퓨터 (VM이 실행중인 동일한 컴퓨터 / OS)에서 실행되는 Java 프로그램을 작성하려고합니다. 다음과 같은 샘플 프로그램이 있습니다.

public static void main(String[] args) {
    try{
        Configuration conf = new Configuration();
        conf.addResource("config.xml");
        FileSystem fs = FileSystem.get(conf);
        FSDataOutputStream fdos=fs.create(new Path("/testing/file01.txt"), true);
        fdos.writeBytes("Test text for the txt file");
        fdos.flush();
        fdos.close();
        fs.close();
    }catch(Exception e){
        e.printStackTrace();
    }

}

내 config.xml 파일은 fs.default.name = hdfs : // CDH4_IP : 8020에 정의 된 속성에만 있습니다.

그것을 실행할 때 다음과 같은 예외가 발생합니다.

org.apache.hadoop.ipc.RemoteException(java.io.IOException): File /testing/file01.txt could only be replicated to 0 nodes instead of minReplication (=1).  There are 1 datanode(s) running and 1 node(s) are excluded in this operation.
    at org.apache.hadoop.hdfs.server.blockmanagement.BlockManager.chooseTarget(BlockManager.java:1322)
    at org.apache.hadoop.hdfs.server.namenode.FSNamesystem.getAdditionalBlock(FSNamesystem.java:2170)
    at org.apache.hadoop.hdfs.server.namenode.NameNodeRpcServer.addBlock(NameNodeRpcServer.java:471)
    at org.apache.hadoop.hdfs.protocolPB.ClientNamenodeProtocolServerSideTranslatorPB.addBlock(ClientNamenodeProtocolServerSideTranslatorPB.java:297)
    at org.apache.hadoop.hdfs.protocol.proto.ClientNamenodeProtocolProtos$ClientNamenodeProtocol$2.callBlockingMethod(ClientNamenodeProtocolProtos.java:44080)
    at org.apache.hadoop.ipc.ProtobufRpcEngine$Server$ProtoBufRpcInvoker.call(ProtobufRpcEngine.java:453)
    at org.apache.hadoop.ipc.RPC$Server.call(RPC.java:898)
    at org.apache.hadoop.ipc.Server$Handler$1.run(Server.java:1693)
    at org.apache.hadoop.ipc.Server$Handler$1.run(Server.java:1689)
    at java.security.AccessController.doPrivileged(Native Method)
    at javax.security.auth.Subject.doAs(Subject.java:396)
    at org.apache.hadoop.security.UserGroupInformation.doAs(UserGroupInformation.java:1332)
    at org.apache.hadoop.ipc.Server$Handler.run(Server.java:1687)
    at org.apache.hadoop.ipc.Client.call(Client.java:1160)
    at org.apache.hadoop.ipc.ProtobufRpcEngine$Invoker.invoke(ProtobufRpcEngine.java:202)
    at $Proxy9.addBlock(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:164)
    at org.apache.hadoop.io.retry.RetryInvocationHandler.invoke(RetryInvocationHandler.java:83)
    at $Proxy9.addBlock(Unknown Source)
    at org.apache.hadoop.hdfs.protocolPB.ClientNamenodeProtocolTranslatorPB.addBlock(ClientNamenodeProtocolTranslatorPB.java:290)
    at org.apache.hadoop.hdfs.DFSOutputStream$DataStreamer.locateFollowingBlock(DFSOutputStream.java:1150)
    at org.apache.hadoop.hdfs.DFSOutputStream$DataStreamer.nextBlockOutputStream(DFSOutputStream.java:1003)
    at org.apache.hadoop.hdfs.DFSOutputStream$DataStreamer.run(DFSOutputStream.java:463)

나는 인터넷을 둘러 보았는데, 디스크 공간이 적을 때 이런 일이 일어나는 것 같지만, "hdfs dfsadmin -report"를 실행하면 나에게는 그렇지 않다.

Configured Capacity: 25197727744 (23.47 GB)
Present Capacity: 21771988992 (20.28 GB)
DFS Remaining: 21770715136 (20.28 GB)
DFS Used: 1273856 (1.21 MB)
DFS Used%: 0.01%
Under replicated blocks: 0
Blocks with corrupt replicas: 0
Missing blocks: 0

-------------------------------------------------
Datanodes available: 1 (1 total, 0 dead)

Live datanodes:
Name: 127.0.0.1:50010 (localhost.localdomain)
Hostname: localhost.localdomain
Decommission Status : Normal
Configured Capacity: 25197727744 (23.47 GB)
DFS Used: 1273856 (1.21 MB)
Non DFS Used: 3425738752 (3.19 GB)
DFS Remaining: 21770715136 (20.28 GB)
DFS Used%: 0.01%
DFS Remaining%: 86.4%
Last contact: Fri Jan 11 17:30:56 EST 201323 EST 2013

또한이 코드를 VM에서와 같이 실행해도됩니다. 문제가 무엇인지 또는 문제를 해결하는 방법을 모르겠습니다. 이것은 처음으로 hadoop을 사용하기 때문에 나는 아마 뭔가를 놓친 것 같다. 어떤 아이디어?

로그에서 볼 수있는 유일한 것은 클라이언트에서 얻는 것과 비슷한 예외입니다.

java.io.IOException: File /testing/file01.txt could only be replicated to 0 nodes instead of minReplication (=1).  There are 1 datanode(s) running and 1 node(s) are excluded in this operation.
    at org.apache.hadoop.hdfs.server.blockmanagement.BlockManager.chooseTarget(BlockManager.java:1322)
    at org.apache.hadoop.hdfs.server.namenode.FSNamesystem.getAdditionalBlock(FSNamesystem.java:2170)
    at org.apache.hadoop.hdfs.server.namenode.NameNodeRpcServer.addBlock(NameNodeRpcServer.java:471)
    at org.apache.hadoop.hdfs.protocolPB.ClientNamenodeProtocolServerSideTranslatorPB.addBlock(ClientNamenodeProtocolServerSideTranslatorPB.java:297)
    at org.apache.hadoop.hdfs.protocol.proto.ClientNamenodeProtocolProtos$ClientNamenodeProtocol$2.callBlockingMethod(ClientNamenodeProtocolProtos.java:44080)
    at org.apache.hadoop.ipc.ProtobufRpcEngine$Server$ProtoBufRpcInvoker.call(ProtobufRpcEngine.java:453)
    at org.apache.hadoop.ipc.RPC$Server.call(RPC.java:898)
    at org.apache.hadoop.ipc.Server$Handler$1.run(Server.java:1693)
    at org.apache.hadoop.ipc.Server$Handler$1.run(Server.java:1689)
    at java.security.AccessController.doPrivileged(Native Method)
    at javax.security.auth.Subject.doAs(Subject.java:396)
    at org.apache.hadoop.security.UserGroupInformation.doAs(UserGroupInformation.java:1332)
    at org.apache.hadoop.ipc.Server$Handler.run(Server.java:1687)

데이터 디렉토리 (/ var / lib / hadoop-hdfs / cache / hdfs / dfs / data)에 대한 사용 권한을 변경하려고 시도했지만 수정하지 않았습니다.

나는 HUE 웹 응용 프로그램을 통해 HDFS를 탐색 할 때 폴더 구조가 만들어지고 파일이 존재하지만 비어 있음을 확인합니다. 파일을 기본 사용자 디렉토리에 넣으려고했는데

FSDataOutputStream fdos=fs.create(new Path("testing/file04.txt"), true); 

대신에

FSDataOutputStream fdos=fs.create(new Path("/testing/file04.txt"), true);

그러면 파일 경로가 "/user/dharris/testing/file04.txt"( 'dharris'는 내 Windows 사용자)가됩니다. 그러나 그것은 저에게 동일한 종류의 오류를주었습니다.

해결법

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

    1.나는 똑같은 문제가있다. 내 경우, 문제의 핵심은 다음과 같은 오류 메시지였습니다. 1 개의 데이터 노드가 실행 중이고 1 개의 노드가이 작업에서 제외됩니다.

    나는 똑같은 문제가있다. 내 경우, 문제의 핵심은 다음과 같은 오류 메시지였습니다. 1 개의 데이터 노드가 실행 중이고 1 개의 노드가이 작업에서 제외됩니다.

    이는 hdfs-client가 50010 포트로 데이터 노드에 연결할 수 없음을 의미합니다. hdfs namenode에 연결하면 데이터 노드의 상태를 알 수 있습니다. 그러나 hdfs-client가 데이터 노드에 연결하지 못했습니다.

    (hdfs에서 namenode는 파일 디렉토리와 데이터 노드를 관리합니다 .hdfs-client가 namnode에 연결하면 대상 파일 경로와 데이터가있는 데이터 노드의 주소를 찾을 수 있습니다. 그러면 hdfs-client는 datanode와 통신합니다. netstat을 사용하여 그 datanode uri를 확인하십시오. 왜냐하면 hdfs-client는 namenode에 의해 알려지는 주소를 사용하여 datanode와 통신하려고하기 때문입니다)

    나는 그 문제를 다음과 같이 해결했다.

    가난한 영어 실력으로 인해 유감입니다.

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

    2.Linux VM으로 이동하여 호스트 이름과 IP 주소 (ifconfig cmd 사용)를 확인하십시오. 그런 다음 리눅스 VM에서 / etc / host 파일을 편집하십시오.

    Linux VM으로 이동하여 호스트 이름과 IP 주소 (ifconfig cmd 사용)를 확인하십시오. 그런 다음 리눅스 VM에서 / etc / host 파일을 편집하십시오.

    IP 주소 (SPACE) 호스트 이름

    예 : 192.168.110.27 clouderavm

    모든 hadoop 구성 파일을 다음과 같이 변경하십시오.

    core-site.xml

    hdfs-site.xml

    mapred-site.xml

    yarn-site.xml

    localhost 또는 localhost.localdomain 또는 0.0.0.0을 호스트 이름으로 변경하십시오

    cloudera 관리자를 다시 시작하십시오.

    윈도우 머신에서 C : \ Windows \ System32 \ Drivers \ etc \ hosts 편집

    끝에 한 줄 추가

    vm 컴퓨터의 IP와 호스트 이름 (VM의 / etc / host 파일에서했던 것과 동일)

    VMIPADRESS VMHOSTNAME

    예 :

    192.168.110.27 clouderavm

    그런 다음 지금 확인해보세요. 튜브의 비디오를 따라 세부 구성 확인을 위해 작동해야합니다.

    https://www.youtube.com/watch?v=fSGpYHjGIRY

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

    3.hdfs-site.xml에 주어진 속성 추가

    hdfs-site.xml에 주어진 속성 추가

    <property>
       <name>dfs.replication</name>
       <value>1</value>
     </property>
    

    이 파일을 프로그램에 추가하십시오.

    conf.addResource("hdfs-site.xml");
    

    멈추다

    stop-all.sh
    

    시작하다

    start-all.sh
    
  4. ==============================

    4.비슷한 문제가 발생하여 두 가지 정보가 도움이 될 수 있습니다.

    비슷한 문제가 발생하여 두 가지 정보가 도움이 될 수 있습니다.

    내가 변경 한 후 core-site.xml에서

    <name>fs.defaultFS</name>
    <value>hdfs://localhost:9000</value>
    

    <value>hdfs://host_name:9000</value>
    

    더 이상 ssh 터널이 필요하지 않으며 원격으로 hdfs에 액세스 할 수 있습니다.

  5. ==============================

    5.나는 똑같은 문제를 가지고있는 것에 대한 나의 수색에서 이처럼 많은 질문을 발견했기 때문에 나는 마침내 나를 위해 일한 것을 공유 할 것이라고 생각했다. Hortonworks에서이 포럼 게시물을 발견했습니다. https://community.hortonworks.com/questions/16837/cannot-copy-from-local-machine-to-vm-datanode-via.html

    나는 똑같은 문제를 가지고있는 것에 대한 나의 수색에서 이처럼 많은 질문을 발견했기 때문에 나는 마침내 나를 위해 일한 것을 공유 할 것이라고 생각했다. Hortonworks에서이 포럼 게시물을 발견했습니다. https://community.hortonworks.com/questions/16837/cannot-copy-from-local-machine-to-vm-datanode-via.html

    대답은 진정으로 새로운 Configuration ()을 호출하는 것이 무엇인지를 이해하고 필요한 매개 변수를 설정하는 것이 었습니다. 제 경우에는 정확히 그 게시물에서 언급 한 것입니다. 그래서 제 작업 코드는 이렇게 보입니다.

    try {
        Configuration config = new Configuration();
        config.set("dfs.client.use.datanode.hostname", "true");
        Path pdFile = new Path("stgicp-" + pd);
        FileSystem dFS = FileSystem.get(new URI("hdfs://" + HadoopProperties.HIVE_HOST + ":" + HadoopProperties.HDFS_DEFAULT_PORT), config, 
                HadoopProperties.HIVE_DEFAULT_USER);
        if (dFS.exists(pdFile)) {
            dFS.delete(pdFile, false);
        } 
        FSDataOutputStream outStream = dFS.create(pdFile);
        for (String sjWLR : processWLR.get(pd)) {
            outStream.writeBytes(sjWLR);
        }     
        outStream.flush();
        outStream.close();
    
        dFS.delete(pdFile, false);
        dFS.close();
    } catch (IOException | URISyntaxException | InterruptedException e) {
        log.error("WLR file processing error: " + e.getMessage());
    }
    
  6. ==============================

    6.hadoop 구성에서 기본 복제는 3으로 설정됩니다. 한 번 확인하고 요구 사항에 따라 변경하십시오

    hadoop 구성에서 기본 복제는 3으로 설정됩니다. 한 번 확인하고 요구 사항에 따라 변경하십시오

  7. ==============================

    7.수동으로 데이터 (dfs / data) 폴더를 삭제하고 namenode를 포맷 할 수 있습니다. 그런 다음 hadoop을 시작할 수 있습니다.

    수동으로 데이터 (dfs / data) 폴더를 삭제하고 namenode를 포맷 할 수 있습니다. 그런 다음 hadoop을 시작할 수 있습니다.

  8. ==============================

    8.오류 메시지 복제 요인이 양호한 것 같습니다. 즉 1. 그것은 datanode 제대로 작동하거나 권한 문제가있는 것 같습니다. 사용 권한을 확인하고 사용자의 데이터 노드 상태를 확인하면 hadoop을 실행하려고합니다.

    오류 메시지 복제 요인이 양호한 것 같습니다. 즉 1. 그것은 datanode 제대로 작동하거나 권한 문제가있는 것 같습니다. 사용 권한을 확인하고 사용자의 데이터 노드 상태를 확인하면 hadoop을 실행하려고합니다.

  9. ==============================

    9.나는 비슷한 문제가 있었는데, 내 경우에 다음 폴더를 비웠다. $ {hadoop.tmp.dir} / nm-local-dir / usercache / {{hdfs_user}} / appcache /

    나는 비슷한 문제가 있었는데, 내 경우에 다음 폴더를 비웠다. $ {hadoop.tmp.dir} / nm-local-dir / usercache / {{hdfs_user}} / appcache /

  10. ==============================

    10.FS에 문제가있는 것으로 보입니다. cross-site.xml의 매개 변수가 읽으려는 파일과 일치하지 않습니다.

    FS에 문제가있는 것으로 보입니다. cross-site.xml의 매개 변수가 읽으려는 파일과 일치하지 않습니다.

    또는

    경로에 공통된 불일치가 있습니다 (WINDOWS 참조가 있음을 알 수 있습니다).

    cygwin 도구를 사용하여 경로를 설정하고 datanodes 및 temp 파일 위치가 놓여 있고 그 트릭을 충분히 수행해야하는 위치에 배치 할 수 있습니다 위치 : $ / bin / cygpath.exe

  11. ==============================

    11.다음은 HDFS에서 파일을 만드는 방법입니다.

    다음은 HDFS에서 파일을 만드는 방법입니다.

    import java.io.BufferedReader;
    import java.io.BufferedWriter;
    import java.io.InputStreamReader;
    import java.io.OutputStream;
    import java.io.OutputStreamWriter;
    import org.apache.hadoop.fs.FileSystem;
    import org.apache.hadoop.fs.Path;
    
    FileSystem hdfs = FileSystem.get(context.getConfiguration());
    Path outFile=new Path("/path to store the output file");
    
    String line1=null;
    
    if (!hdfs.exists(outFile)){
                OutputStream out = hdfs.create(outFile);
                BufferedWriter br = new BufferedWriter(new OutputStreamWriter(out, "UTF-8"));
                br.write("whatever data"+"\n");
                br.close();
                hdfs.close();
            }
    else{
                String line2=null;
                BufferedReader br1 = new BufferedReader(new InputStreamReader(hdfs.open(outFile)));
                while((line2=br1.readLine())!=null){
                    line1=line1.concat(line2)+"\n";
                }
                br1.close();
                hdfs.delete(outFile, true);
                OutputStream out = hdfs.create(outFile);
                BufferedWriter br2 = new BufferedWriter(new OutputStreamWriter(out, "UTF-8"));
                br2.write(line1+"new data"+"\n");
                br2.close();
                hdfs.close();
            }
    
  12. from https://stackoverflow.com/questions/14288453/writing-to-hdfs-from-java-getting-could-only-be-replicated-to-0-nodes-instead by cc-by-sa and MIT license