티스토리 뷰

얼마전 hadoop 클러스터의 네트워크 설정에 대한 문의가 온적이 있습니다.


내부망으로 구성된 hadoop의 네임노드에 공인IP를 추가했는데, 

클라이언트에서 네임노드에 접근은 되지만, HDFS의 블록에 접근할 수가 없다는 내용이였는데요.


클라이언트에서 HDFS의 블록을 조회하면, 다음과 같은 로그가 출력되고 있었습니다.


WARN hdfs.DFSClient: Failed to connect to /데이터노드 내부망IP:50010, add to deadNodes and continuejava.net.SocketTimeoutException: 60000 millis timeout while waiting for channel to be ready for connect. ch : java.nio.channels.SocketChannel[connection-pending remote=/데이터노드 내부망IP:50010] 


네임노드에 잘 접근이 되는데, 왜 이런 로그가 나오는 걸까요?


다음 그림은 HDFS 클라이언트가 HDFS 블록을 조회하는 방식을 나타낸 그림입니다.

(출처는 제 책입니다. ㅎㅎㅎ)

hadoop의 네임노드는 HDFS클라이언트에게 직접 블록을 전송하지 않습니다.


HDFS클라이언트는 네임노드에서 블록에 대한 위치 정보를 전달 받아서, 

해당 데이터 노드에서 파이프 라인 방식으로 직접 블록을 조회하게 됩니다.

(hadoop 패키지에 있는 DFSClient.java 소스를 보면, 보다 명확하게 이해하실 수 있습니다.)


이때 HDFS 클라이언트가 데이터 노드에 접근을 하려면,

당연히 같은 네트워크로 설정되어 있어야 합니다.


그런데 제게 문의 주신 분의 경우 클라이언트는 외부망인데,

데이터 노드는 모두 방화벽 안쪽에 있어서 접근이 안된 것이지요. ^^;;


참고로 업무용으로 hadoop을 구성할 때는, 

내부망으로 구성을 한 후에 hadoop 노드간에만 방화벽을 풀어 놓습니다.


댓글
댓글쓰기 폼