참고문헌: 빅데이터 시대의 하둡 완벽 입문/제이펍
(현재 버전의 HDFS와 다를 수 있음)
HDFS
하둡에서 사용되는 HDFS는 분산 파일 시스템.
파일을 블록으로 분할하여 여러 노드에 분산시키고
각 노드의 HDFS 데이터 영역을 하나의 파일시스템처럼 관리해준다.
HDFS의 마스터서버는 NameNode이고
슬레이브 서버는 DataNode인데
NameNode는 DataNode에 저장된 데이터에 대한 정보인 메타 데이터를 관리하고
DataNode가 실질적인 데이터 읽기/저장을 하는 곳이다.
HDFS 특징
-투과성
사용자는 파일이 어떻게 분할되었는지 알 필요 없이 한개의 파일시스템으로 보면 된다.
-확장성
용량의 추가나 성능향상을 위해 새로운 슬레이브 서버를 추가하기만 하면되는 확장성을 전제로하는 하둡, HDFS의 특징이다.
-신뢰성
replication 기능은 해당 블록을 다수의 서버에 기록한다.
replication이 3이면 같은 블록들을 다른 두 곳에도 기록한다는 건데
때문에 특성 슬레이브서버가 고장이 나더라도 다른 DataNode에 블록이 있기 때문에 안정적이다.
(하지만 기본적으로 NameNode가 하나이기 때문에
NameNode가 고장나면 전체가 망가진다. 이를 위해서 HA 구성을 시킬 수 있다.)
rack 전체가 고장 날 것을 우려해서 복제 블록을 저장할 때 다른 rack에 배치하게 할 수 있는데
이를 Rack awareness라고 한다.
결과적으로 3배의 크기로 저장되는데 제일 최근 버전인 하둡 3.0에서는 Erasure encoding방식으로 1.4배정도의 크기로 저장할 수 있다고 한다.
-순차 접근 방식만 지원
임의 접근 방식은 고려되지 않는다.
HDFS는 batch 처리에 적합한 시스템이고
기존의 데이터베이스시스템은 처리속도가 중요한 반면 처리량이 중요하기 때문에 순차 접근 방식만 지원한다.
-데이터 저장 이후 읽기만 가능
HDFS에서 데이터를 기록한 이후에는 읽기만 되고 변경은 불가능하다.
역할
NameNode의 역할은
-메타데이터를 관리한다.
DataNode에 저장된 블록들에 대한 정보(어디 저장되있는지 등)를 기록한 메타데이터를 관리한다.
DataNode가 파일을 실질적으로 저장하고 NameNode는 다른 것으로 부하를 주지 않으려 하기 때문에
관리하는 역할을 메인으로 한다.
-DataNode 관리
용량이 꽉차거나하면 블록을 다른 DataNode로 옮길 수 있다.
그리고 DataNode는 NameNode에게 주기적으로 하트비트라는 패킷을 전송하는데
이를 가지고 NameNode에서 DataNode가 다운되었는지 감시한다.
-클라이언트 처리 요청 접수
클라이언트의 특정 요청이 들어오면 NameNode는 메타데이터를 참고하여
요청에 필요한 데이터를 가지고 있는 DataNode의 리스트를 클라이언트에 전달한다.
클라이언트는 이 리스트를 가지고 DataNode와 직접적으로 통신한다.
DataNode의 역할은
실질적으로 데이터를 저장하고 직접적으로 클라이언트와 통신하는 것
파일 저장/읽기 순서
저장 순서
클라이언트에서 NameNode에 저장을 위해 파일 열기를 요청, 파일 작성을 요구->
이후 NameNode에서는 용량, 저장가능유무 등을 체크하고 메타데이터에 정보를 추가->
NameNode에서 파일 저장용 스트림을 클라이언트에게 줌->
스트림을 받은 클라이언트는 파일저장을 시작->
'데이터 전송 큐'에 데이터를 패킷이라는 단위로 전송 큐에 삽입(초기 설정 크기:64KB)->
클라이언트가 큐 안에 파일이 삽입된 것을 확인하면 NameNode에게 블록 할당 요구->
NameNode는 저장할 DataNode의 리스트를 클라이언트에게 줌->
파이프라인을 만들고->
큐의 패킷을 첫번째 데이터노드에 기록함->
별도의 스레드로 관리중인 ack 대기 큐에도 같은 패킷을 저장함->
이후 첫번째 데이터노드에서 저장한 패킷을 파이프라인에 연결된 다른 데이터노드에 전달함(replication 규칙 적용)->
정상적으로 패킷이 기록되면 DataNode는 ack 메세지를 파이프라인 상위부에 통지하고 이 ack 메세지는 파이프라인을 전달하고 클라이언트에 도착->
ack가 도착하면 ack 대기 큐에서 패킷을 제거
ack 대기 큐는 데이터노드에 장애가 생겼을 때 사용된다.
읽기 순서
클라이언트에서 NameNode에 파일열기와 DataNode 리스트 요구->
NameNode는 읽을 대상 블록, 데이터노드 리스트를 반환->
브록들이 replication에 의해 복수의 데이터노드에 저장되어있지만 데이터노드의 위치가 클라이언트에 가까운 순으로 사용한다.
클라이언트가 DataNode에서 블록들을 읽음(가까운순)->
타 데이터노드에서 블록 읽기 반복->
다 읽으면 클라이언트는 파일 닫기를 요구
'Hadoop' 카테고리의 다른 글
MapReduce(맵리듀스) - Combiner (0) | 2017.03.06 |
---|---|
MapReduce(맵리듀스) - Shuffle&Sort (0) | 2017.02.16 |
MapReduce(맵리듀스) (0) | 2017.02.15 |
하둡(Hadoop) 시스템 구성 (0) | 2017.02.13 |
하둡(hadoop)이란 (0) | 2017.02.06 |