-
Hadoop - 읽기 쓰기 Data 흐름Data 2024. 4. 3. 00:49
들어가기 앞서,
데이터를 읽고 쓰는 명령을 받는 역할은 Name node가 아닌 Data node에서 수행한다.
그리고 데이터를 읽고 쓰는 명령을 받은 Node를 Client node라고 칭한다.데이터 읽기
사용자가 데이터 읽기 명령어를 입력하면 Client node에서 수신하고 데이터 읽기를 처리하는 과정을 알아보자.
(JVM Client 예시)
- HDFS JVM Client를 통해서 읽고자하는 파일을 여는 명령을 날린다. (Client node 영역)
- Client node에서 파일 읽기에 대한 명령을 받는 주체는 DistributedFileSystem이다.
- DistributedFileSystem은 명령을 받은 파일의 위치를 알아내기 위해서 Name node에 질의한다.
- 블록의 위치를 얻은 DistributedFileSystem이 받는다.
- Client node의 네트워크 위상에 따라 가까운 순서대로 Data node가 정렬된다.
Client node도 마찬가지로 Data node라고 설명했듯 Client node내부에 Name node가 제공한 파일의 블록 위치가 있다면 Client node 자체에서 블록 데이터를 위치를 집어낸다.
- 데이터를 사용자가 읽을 수 있게끔 DistributedFileSystem에서 FSDataInputStream을 반환하고 read()를 실행시킨다.
- read() 메서드가 실행될 때 2번에서 제공받은 Data Node에 연결하고 데이터 위치를 찾아 읽는다.
- 다 읽게 되면 close() 메서드를 실행하여 FSDataInputStream을 종료한다.
데이터 쓰기
- HDFS JVM Client는 사용자로부터 파일을 수신받는다.(Client node 영역)
- Name node에게 생성 요청 RPC(http://, hdfs://)를 통해 전송한다.
- 블록 정보에 대해서는 전송하지 않으며, Name node에서는 같은 파일 여부 검사, 권한 검사등을 실행.
- 검사 통과시 Name node에서는 레코드를 생성한다.
- 검사 실패시에는 에러를 발생시킨다. (java IOException)
- Client node에서 데이터를 쓸 때 FSDataOutputStream은 데이터를 패킷단위로 분리하고 데이터 큐에 전송한다.
- Name node에서 복제본을 저장할 노드 목록을 가져옴.
- 목록의 순서대로 파이프라인 형식으로 나열되게된다.
- DataStreamer에서 데이터 큐에 저장된 패킷들을 꺼내어 나열된 Data node에 전송한다.
- 데이터가 저장이 되면 순서대로 ack 큐(내부 패킷)에 저장이되고 마지막 Data node에 저장완료가 ack 큐에 저장이되면 FSDataOutputStream이 close()로 닫힌다.
- close() 실행 후 Data node들에게 전송되었던 패킷들이 flush가되길 기다린다.
- flush이후 "file complete" 신호를 Name node에게 전송한다
* Name Node는 DataStreamer에 의해서 블록정보에 대해 알고있는 상태이다.
* 최종적인 완료는 File Replication이 완료된 이후인데, 기본값은 3 file replica이다.
'Data' 카테고리의 다른 글
Hadoop - Name node, Data node, HDFS 클라이언트 (0) 2024.03.25 Hadoop - HDFS 알아보기 (0) 2024.03.25