복붙노트

[HADOOP] HDFS 오류 : 1 대신에 0 노드로만 복제 할 수있었습니다.

HADOOP

HDFS 오류 : 1 대신에 0 노드로만 복제 할 수있었습니다.

나는 EC2에서 우분투 단일 노드 hadoop 클러스터를 만들었습니다.

hdfs에 대한 간단한 파일 업로드를 테스트하는 것은 EC2 시스템에서 작동하지만 EC2 외부의 시스템에서는 작동하지 않습니다.

원격 컴퓨터에서 웹 인터페이스를 통해 파일 시스템을 탐색 할 수 있으며 서비스중인 것으로보고 된 하나의 데이터 노드를 보여줍니다. 0에서 60000 (!)까지 보안에있는 모든 TCP 포트를 열어서 그렇게 생각하지 않습니다.

오류가 발생했습니다.

java.io.IOException: File /user/ubuntu/pies could only be replicated to 0 nodes, instead of 1
at org.apache.hadoop.hdfs.server.namenode.FSNamesystem.getAdditionalBlock(FSNamesystem.java:1448)
at org.apache.hadoop.hdfs.server.namenode.NameNode.addBlock(NameNode.java:690)
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.ipc.WritableRpcEngine$Server.call(WritableRpcEngine.java:342)
at org.apache.hadoop.ipc.Server$Handler$1.run(Server.java:1350)
at org.apache.hadoop.ipc.Server$Handler$1.run(Server.java:1346)
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:742)
at org.apache.hadoop.ipc.Server$Handler.run(Server.java:1344)

at org.apache.hadoop.ipc.Client.call(Client.java:905)
at org.apache.hadoop.ipc.WritableRpcEngine$Invoker.invoke(WritableRpcEngine.java:198)
at $Proxy0.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:82)
at org.apache.hadoop.io.retry.RetryInvocationHandler.invoke(RetryInvocationHandler.java:59)
at $Proxy0.addBlock(Unknown Source)
at org.apache.hadoop.hdfs.DFSOutputStream$DataStreamer.locateFollowingBlock(DFSOutputStream.java:928)
at org.apache.hadoop.hdfs.DFSOutputStream$DataStreamer.nextBlockOutputStream(DFSOutputStream.java:811)
at org.apache.hadoop.hdfs.DFSOutputStream$DataStreamer.run(DFSOutputStream.java:427)

namenode 로그는 같은 오류를줍니다. 다른 사람들은 재미있는 것 같지 않습니다.

어떤 아이디어?

건배

해결법

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

    1.경고 : 다음은 HDFS의 모든 데이터를 파괴합니다. 기존 데이터를 손상시키지 않으려면이 대답의 단계를 실행하지 마십시오!

    경고 : 다음은 HDFS의 모든 데이터를 파괴합니다. 기존 데이터를 손상시키지 않으려면이 대답의 단계를 실행하지 마십시오!

    당신은 이것을해야합니다 :

    또한 시스템의 디스크 공간을 확인하고 로그에서 경고하지 않는지 확인하십시오.

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

    2.이것이 문제입니다. 클라이언트가 데이터 노드와 통신 할 수 없습니다. 클라이언트가 데이터 노드에 대해받은 IP가 내부 IP이고 공용 IP가 아니기 때문입니다. 이것 좀 봐

    이것이 문제입니다. 클라이언트가 데이터 노드와 통신 할 수 없습니다. 클라이언트가 데이터 노드에 대해받은 IP가 내부 IP이고 공용 IP가 아니기 때문입니다. 이것 좀 봐

    http://www.hadoopinrealworld.com/could-only-be-replicated-to-0-nodes/

    DFSClient $ DFSOutputStrem (Hadoop 1.2.1)의 소스 코드를 살펴보십시오.

    //
    // Connect to first DataNode in the list.
    //
    success = createBlockOutputStream(nodes, clientName, false);
    
    if (!success) {
      LOG.info("Abandoning " + block);
      namenode.abandonBlock(block, src, clientName);
    
      if (errorIndex < nodes.length) {
        LOG.info("Excluding datanode " + nodes[errorIndex]);
        excludedNodes.add(nodes[errorIndex]);
      }
    
      // Connection failed. Let's wait a little bit and retry
      retry = true;
    }
    

    여기에서 이해해야 할 핵심은 Namenode가 블록을 저장하기 위해 Datanode 목록 만 제공한다는 것입니다. 네임 노드는 데이터를 데이터 노드에 쓰지 않습니다. DFSOutputStream을 사용하여 데이터 노드에 데이터를 쓰는 것은 클라이언트의 작업입니다. 쓰기가 시작되기 전에 클라이언트가 데이터 노드와 통신 할 수 있는지 확인하고 통신이 데이터 노드에 실패하면 데이터 노드가 excludedNodes에 추가됩니다.

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

    3.다음을보십시오 :

    다음을보십시오 :

    이 예외 (1 대신에 0 노드에만 복제 될 수 있음)를 보게되면 데이터 노드를 이름 노드에 사용할 수 없습니다.

    다음과 같은 경우 데이터 노드는 이름 노드에서 사용할 수 없습니다.

    예를 들어 "a"를 추가 한 후 동기화를 호출했으며 버퍼를 추가하려고하면 "ab"가 있어야합니다.

    그리고 서버 쪽은 청크가 512의 배수가 아닐 때 메타 파일에있는 crc뿐 아니라 블록 파일에있는 데이터에 대해 Crc 비교를 시도합니다. 그러나 블록에있는 데이터에 대한 crc를 생성하는 동안 항상 초기 Offsetet까지 비교합니다. 또는 더 많은 분석을 위해 데이터 노드 로그를 확인하십시오.

    참조 : http://www.mail-archive.com/hdfs-user@hadoop.apache.org/msg01374.html

  4. ==============================

    4.단일 노드 클러스터를 설정하는 비슷한 문제가있었습니다. 나는 데이터 노드를 설정하지 않았다는 것을 깨달았다. 내 호스트 이름을 conf / slave에 추가 한 다음 문제가 해결되었습니다. 희망이 도움이됩니다.

    단일 노드 클러스터를 설정하는 비슷한 문제가있었습니다. 나는 데이터 노드를 설정하지 않았다는 것을 깨달았다. 내 호스트 이름을 conf / slave에 추가 한 다음 문제가 해결되었습니다. 희망이 도움이됩니다.

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

    5.내 설정 및 솔루션을 설명하려고합니다 : 내 설정 : RHEL 7, hadoop-2.7.3

    내 설정 및 솔루션을 설명하려고합니다 : 내 설정 : RHEL 7, hadoop-2.7.3

    필자는 독립 실행 형 작업을 먼저 설정하고 가상 배포 작업을 동일한 문제로 실패한 가상 분산 작업을 먼저 설정하려고했습니다.

    내가 hadoop을 시작할 때,

    sbin/start-dfs.sh
    

    나는 다음과 같은 것을 가지고있다.

    Starting namenodes on [localhost]
    localhost: starting namenode, logging to /home/<user>/hadoop-2.7.3/logs/hadoop-<user>-namenode-localhost.localdomain.out
    localhost: starting datanode, logging to /home/<user>/hadoop-2.7.3/logs/hadoop-<user>-datanode-localhost.localdomain.out
    Starting secondary namenodes [0.0.0.0]
    0.0.0.0: starting secondarynamenode, logging to /home/<user>/hadoop-2.7.3/logs/hadoop-<user>-secondarynamenode-localhost.localdomain.out
    

    유망한 것으로 보입니다 (실패없이 datanode를 시작합니다). 그러나 datanode는 실제로 존재하지 않았습니다.

    또 다른 표시는 작동중인 데이터 노드가 없음을 확인하는 것입니다 (아래 스냅 샷은 고정 된 작업 상태를 보여줍니다).

    다음을 수행하여 해당 문제를 해결했습니다.

    rm -rf /tmp/hadoop-<user>/dfs/name
    rm -rf /tmp/hadoop-<user>/dfs/data
    

    다시 시작하십시오.

    sbin/start-dfs.sh
    ...
    
  6. ==============================

    6.데이터 노드가 시작되지 않아 MacOS X 10.7 (hadoop-0.20.2-cdh3u0)에서 동일한 오류가 발생했습니다. start-all.sh는 다음 출력을 생성합니다.

    데이터 노드가 시작되지 않아 MacOS X 10.7 (hadoop-0.20.2-cdh3u0)에서 동일한 오류가 발생했습니다. start-all.sh는 다음 출력을 생성합니다.

    starting namenode, logging to /java/hadoop-0.20.2-cdh3u0/logs/...
    localhost: ssh: connect to host localhost port 22: Connection refused
    localhost: ssh: connect to host localhost port 22: Connection refused
    starting jobtracker, logging to /java/hadoop-0.20.2-cdh3u0/logs/...
    localhost: ssh: connect to host localhost port 22: Connection refused
    

    시스템 환경 설정 -> 공유 -> 원격 로그인을 통해 ssh 로그인을 활성화 한 후 그것은 일하기 시작했습니다. start-all.sh 출력이 다음과 같이 변경되었습니다 (데이터 노드 시작 참고).

    starting namenode, logging to /java/hadoop-0.20.2-cdh3u0/logs/...
    Password:
    localhost: starting datanode, logging to /java/hadoop-0.20.2-cdh3u0/logs/...
    Password:
    localhost: starting secondarynamenode, logging to /java/hadoop-0.20.2-cdh3u0/logs/...
    starting jobtracker, logging to /java/hadoop-0.20.2-cdh3u0/logs/...
    Password:
    localhost: starting tasktracker, logging to /java/hadoop-0.20.2-cdh3u0/logs/...
    
  7. ==============================

    7.그리고 dfs로 복사 할 때 모든 데이터 노드가 있는지 확인해야한다고 생각합니다. 어떤 경우에는 시간이 좀 걸립니다. 건강 상태 웹 페이지로 가서 모든 것을 기다려야하는 이유는 해결책 인 '건강 상태 확인'이 효과가 있다고 생각합니다. 5 센트입니다.

    그리고 dfs로 복사 할 때 모든 데이터 노드가 있는지 확인해야한다고 생각합니다. 어떤 경우에는 시간이 좀 걸립니다. 건강 상태 웹 페이지로 가서 모든 것을 기다려야하는 이유는 해결책 인 '건강 상태 확인'이 효과가 있다고 생각합니다. 5 센트입니다.

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

    8.내 상황에서 문제를 파악하는 데 일주일이 걸립니다.

    내 상황에서 문제를 파악하는 데 일주일이 걸립니다.

    클라이언트 (귀하의 프로그램)가 nameNode에 데이터 조작을 요청하면 nameNode는 dataNode의 IP를 클라이언트에 제공하여 dataNode를 선택하고 클라이언트를 탐색합니다.

    그러나 dataNode 호스트가 여러 개의 ip를 갖도록 구성되어 있고 nameNode가 클라이언트가 액세스 할 수없는 클라이언트를 제공 할 경우 클라이언트는 제외 목록에 dataNode를 추가하고 nameNode에 새 노드를 요청하고 마지막으로 모든 dataNode 이 오류가 발생합니다.

    모든 것을 시도하기 전에 노드의 IP 설정을 확인하십시오!

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

    9.모든 데이터 노드가 실행중인 경우 HDFS에 데이터 공간이 충분한 지 여부를 한 번 더 확인하십시오. 작은 파일을 업로드 할 수는 있지만 큰 파일 (30GB)을 HDFS에 업로드하지 못했습니다. 'bin / hdfs dfsadmin -report'는 각 데이터 노드가 몇 GB 만 ​​사용 가능하다는 것을 보여줍니다.

    모든 데이터 노드가 실행중인 경우 HDFS에 데이터 공간이 충분한 지 여부를 한 번 더 확인하십시오. 작은 파일을 업로드 할 수는 있지만 큰 파일 (30GB)을 HDFS에 업로드하지 못했습니다. 'bin / hdfs dfsadmin -report'는 각 데이터 노드가 몇 GB 만 ​​사용 가능하다는 것을 보여줍니다.

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

    10.위키 http://wiki.apache.org/hadoop/HowToSetupYourDevelopmentEnvironment에서 추천을 시도 했습니까?

    위키 http://wiki.apache.org/hadoop/HowToSetupYourDevelopmentEnvironment에서 추천을 시도 했습니까?

    데이터를 dfs에 넣을 때이 오류가 발생했습니다. 해결책은 이상하고 아마 일치하지 않습니다. namenode와 함께 모든 임시 데이터를 삭제하고 namenode를 다시 포맷하고 모든 것을 시작한 다음 "클러스터의"dfs 상태 페이지 (http : // your_host : 50070 / dfshealth.jsp)를 방문했습니다. 마지막 단계 인 상태 페이지를 방문하면 오류를 해결할 수있는 유일한 방법입니다. 일단 내가 페이지를 방문하면 dfs에 파일을 넣거나 가져 오는 것이 좋습니다.

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

    11.노드를 다시 포맷하는 것은 해결책이 아닙니다. start-all.sh를 편집해야합니다. dfs를 시작하고 완전히 시작될 때까지 기다린 다음 맵핑을 시작하십시오. 잠을 사용하면됩니다. 1 초를 기다리는 것이 나를 위해 일했습니다. 전체 솔루션은 http://sonalgoyal.blogspot.com/2009/06/hadoop-on-ubuntu.html에서 확인하십시오.

    노드를 다시 포맷하는 것은 해결책이 아닙니다. start-all.sh를 편집해야합니다. dfs를 시작하고 완전히 시작될 때까지 기다린 다음 맵핑을 시작하십시오. 잠을 사용하면됩니다. 1 초를 기다리는 것이 나를 위해 일했습니다. 전체 솔루션은 http://sonalgoyal.blogspot.com/2009/06/hadoop-on-ubuntu.html에서 확인하십시오.

  12. ==============================

    12.나는 파티에 조금 늦었다는 것을 알지만, 나는 이것을 게시하고 싶다. 이 페이지의 미래 방문자를 위해. 나는 비슷한 문제를 안고 있었다. 내가 로컬에서 hdfs로 파일을 복사하고 namenode가 문제를 해결하지 못했습니다. 내 이름이 밝혀졌다. 로그에 다음 오류 메시지가 있습니다.

    나는 파티에 조금 늦었다는 것을 알지만, 나는 이것을 게시하고 싶다. 이 페이지의 미래 방문자를 위해. 나는 비슷한 문제를 안고 있었다. 내가 로컬에서 hdfs로 파일을 복사하고 namenode가 문제를 해결하지 못했습니다. 내 이름이 밝혀졌다. 로그에 다음 오류 메시지가 있습니다.

    2012-07-11 03:55:43,479 ERROR org.apache.hadoop.hdfs.server.datanode.DataNode: DatanodeRegistration(127.0.0.1:50010, storageID=DS-920118459-192.168.3.229-50010-1341506209533, infoPort=50075, ipcPort=50020):DataXceiver java.io.IOException: Too many open files
            at java.io.UnixFileSystem.createFileExclusively(Native Method)
            at java.io.File.createNewFile(File.java:883)
            at org.apache.hadoop.hdfs.server.datanode.FSDataset$FSVolume.createTmpFile(FSDataset.java:491)
            at org.apache.hadoop.hdfs.server.datanode.FSDataset$FSVolume.createTmpFile(FSDataset.java:462)
            at org.apache.hadoop.hdfs.server.datanode.FSDataset.createTmpFile(FSDataset.java:1628)
            at org.apache.hadoop.hdfs.server.datanode.FSDataset.writeToBlock(FSDataset.java:1514)
            at org.apache.hadoop.hdfs.server.datanode.BlockReceiver.<init>(BlockReceiver.java:113)
            at org.apache.hadoop.hdfs.server.datanode.DataXceiver.writeBlock(DataXceiver.java:381)
            at org.apache.hadoop.hdfs.server.datanode.DataXceiver.run(DataXceiver.java:171)
    

    분명히 이것은 hadoop 클러스터에서 상대적으로 일반적인 문제이며 Cloudera는 nofile과 epoll 한계를 증가시킬 것을 제안합니다 (on 커널 2.6.27)을 사용하십시오. 까다로운 점은 nofile과 epoll 한계는 시스템에 따라 크게 다릅니다. 내 우분투 10.04 서버가 작동하려면 약간 다른 구성이 필요합니다. 제대로, 그래서 당신은 당신의 접근 방식을 적절히 변경해야 할 수도 있습니다.

  13. ==============================

    13.나는 또한 같은 문제 / 오류가 발생했습니다. 문제는 내가 hadoop namenode -format을 사용하여 포맷했을 때 발생했습니다.

    나는 또한 같은 문제 / 오류가 발생했습니다. 문제는 내가 hadoop namenode -format을 사용하여 포맷했을 때 발생했습니다.

    따라서 start -all.sh를 사용하여 hadoop을 다시 시작한 후에 데이터 노드가 시작되거나 초기화되지 않았습니다. jps를 사용하여이를 확인할 수 있습니다. 5 개의 항목이 있어야합니다. 데이터 노드가 누락 된 경우 다음 작업을 수행 할 수 있습니다.

    데이터 노드 프로세스가 Hadoop에서 실행되지 않음

    희망이 도움이됩니다.

  14. ==============================

    14.이름 노드를 즉시 형식화하지 마십시오. stop-all.sh를 실행하고 start-all.sh를 사용하여 시작하십시오. 문제가 계속되면 이름 노드의 서식을 지정하십시오.

    이름 노드를 즉시 형식화하지 마십시오. stop-all.sh를 실행하고 start-all.sh를 사용하여 시작하십시오. 문제가 계속되면 이름 노드의 서식을 지정하십시오.

  15. ==============================

    15.다음 단계를 따르십시오. 1. dfs와 원사를 멈 춥니 다. 2. core-site.xml에 지정된대로 datanode 및 namenode 디렉토리를 제거합니다. 3. 다음과 같이 dfs 및 yarn을 시작합니다.

    다음 단계를 따르십시오. 1. dfs와 원사를 멈 춥니 다. 2. core-site.xml에 지정된대로 datanode 및 namenode 디렉토리를 제거합니다. 3. 다음과 같이 dfs 및 yarn을 시작합니다.

    start-dfs.sh
    start-yarn.sh
    mr-jobhistory-daemon.sh start historyserver
    
  16. ==============================

    16.SELINUX에 관한 것입니다. 제 경우 CentOS 6.5

    SELINUX에 관한 것입니다. 제 경우 CentOS 6.5

    모든 노드 (이름, 초, 데이터 ....)

  17. from https://stackoverflow.com/questions/5293446/hdfs-error-could-only-be-replicated-to-0-nodes-instead-of-1 by cc-by-sa and MIT license