java.net.BindException: Problem binding to [namenode:9000] java.net.BindException: Cannot assign requested address;

suran choi·2022년 11월 4일
1

Hadoop

목록 보기
2/6
post-thumbnail

하둡의 설치 및 모든 설정 파일을 설정해주고 기쁜 마음으로 start-all.sh을 입력했것만 돌아오는 것은 귀여운 자바 오류였습니다.

해당 오류를 해결하는 과정을 순서대로 적어보겠습니다.

결과만 확인하고 싶으신 분들은 제일 아래로 가주세요!



상황

당시에는 etc/hosts 파일을 아래와 같이 모두 public ip로 적어두었습니다.

namenode public_ip
datanode01 public_ip
datanode02 public_ip

오류는 아래와 같습니다.

java.net.BindException: 
Problem binding to [namenode:9000] 
java.net.BindException: Cannot assign requested address; 
For more details see:  http://wiki.apache.org/hadoop/BindException

내용을 보니깐 네임노드 9000포트에 바인딩을 못한다는 것 같고,
심지어 친절하게 링크까지 걸어주었기에 링크로 들어가 보았습니다.

아래는 그 링크에 들어가 번역기를 돌린 내용입니다.




오류 확인

  • 공식 문서

    BindException java.net을 얻을 수 있습니다.BindException: 시스템의 소켓이 이미 사용 중이고 서비스(NameNode, JobTracker, DataNode, TaskTracker, HTTP Server 등)가 수신 요청을 수신하기 위해 동일한 포트에 정렬을 만들려고 하는 경우 이미 사용 중인 주소입니다.


  • 공식 문서 내에서 예상되는 원인 리스트
    • Q) 포트가 이미 사용 중 (가장 가능성 높음)
      • A) netstat으로 확인한 결과 다른 곳에서 9000번 쓰고 있지 않음
    • Q) 포트가 1024보다 작으면 OS에서 프로그램이 “신뢰할 수 있는 포트”에 바인딩되지 않을 수 있음
      • A) 포트가 1024보다 큼
    • Q) 구성이 hostname:port 값인 경우, 호스트 이름이 잘못되었거나 해당 IP 주소가 시스템에 없는 것일 수 있습니다.
      • A) 오타 오류 없음
    • Q) 이미 실행중인 서비스의 인스턴스가 있음
      • A) 해당 사항 없음
    • EC2에서 실행 중인 경우 서비스는 공용 호스트 이름 또는 IP를 사용하거나 "0.0.0.0"을 주소로 암시적으로 사용하여 공용 Elastic IP 주소를 명시적으로 바인딩하려고 합니다.

공식 문서에서 준 예상 원인들을 살펴보니 너가 쓰기로 한 포트 다른 데서 쓰고 있는거 아니야?? 포트 값이 너무 작거나 호스트 이름을 잘 못 쓴거 아니야?? 정도의 의문점을 제시하는 것 같습니다.

제 인스턴스에서는 하둡 혹은 자바 정도만 설치를 했고, 다른 곳에서 9000번 포트를 지정해주지도 않았으며 hosts 파일을 확인한 결과 오타도 나지 않았습니다.

이쯤에서 다른 곳으로 눈을 돌려야 한다는 사실을 명심하며, ip를 째려보기 시작하였습니다.


AWS에서는 각 인스턴스에 public ip, private ip가 따로 존재합니다.

public ip전체 웹 상에서 고유하며,
private ipPrivate Network에서만 고유합니다.

우리가 ssh 명령어로 인스턴스에 접속할 때는 public ip를 사용합니다. 그야 우리가 사용하는 컴퓨터와 인스턴스의 네트워크가 다르기 때문이죠.

그렇다면 현재 하둡을 각기 다른 네트워크 상에서 구축했기 때문에 public ip로 다른 인스턴스를 명시하는 것은 분명한데 왜 오류가 발생했을까요?

이러한 궁금증으로 모든 xml 설정 파일을 뜯어보았습니다. 보던 중, 설정 파일에서 자기 자신 노드를 가리키고 있는 파일을 발견하였습니다.

core-site.xml

<configuration>
    <property>
            <name>fs.defaultFS</name>
            <value>hdfs://namenode:9000</value>
    </property>
</configuration>

yarn-site.xml

<configuration>
   <property>
      <name>yarn.nodemanager.aux-services</name>
      <value>mapreduce_shuffle</value>
   </property>
    <property>
        <name>yarn.resourcemanager.hostname</name>
        <value>namenode</value>
    </property>
</configuration>

위와 같은 경우에 사실 데이터 노드 입장에서는 public ip로 다른 네트워크인 네임노드를 가리키는 상황이기 때문에 문제가 되지 않습니다.

다만 네임노드 입장에서는 자기 자신을 public ip로 가리키고 있는 상황이었기에 namenode가 실행이 안 된것이 아닐까 생각합니다.




해결!

결국 hosts 파일을 다음과 같이 바꾸고 namenode 까지 잘 올라오는 것을 확인하였습니다.

namenode private_ip
datanode01 public_ip
datanode02 public_ip

0개의 댓글