configuration 의 "dfs.data.dir" 의 값으로 DataNode와 그에 속한 쓰레드를 실행하며 값은space 나 comma 로 분리되고 분리된 갯수 만큼 DataNode를 실행한다. (ServerSocket 을 전달함)
DataNode 생성자에서 서버소켓을 실행, 서버 포트는 "dfs.datanode.port" 의 값으로 시작되며 디폴트는 50010 이고 서버가 갯수 만큼 실행 될 때 +1 씩 포트가 증가한다.
DataNode 가 갖는 쓰레드
1. 자체 Thread : Namenode에 Heartbeat, blockReport 를 보냄
2. DataXceiveServer : ServerSocket 을 전달받아 클라이언트 접속이 있으며 DataXceiver 스레드를 만든다.
3. DataXceiver : 클라이언트가 보낸 데이터를 읽는다. (in : InputStream, reply : OutputStream)
1. in.read() : 1 byte 를 읽어서 operation 을 알아낸다.
operation 이 write block 일 경우
2. in.readBoolean() : 리포트를 해야할 블럭인지 boolean 값을 읽어낸다.
3. block.readFields(in) : block id와 block의 길이 len 을 읽는다.
4. in.readInt() : block 을 복사할 타켓의 갯수를 읽는다.
5. DatanodeInfo.readFields(in) : 데이터 노드명, 용량, 남은용량, 마지막 업데이트 값을 타겟수만큼 읽는다.
6. in.read() : 인코딩 타입을 1 byte 읽는다.
7. in.readLong() : 이후 읽어야할 실제 데이터 길이 len 을 읽는다.
현재 데이터노드 서버에 파일을 생성하여 outputstream 을 만든다.
첫번째는 자신의 데이터 노드 이므로 다음 타겟인 데이터노드와 소켓으로 접속하여 out2 와 in2 를 생성한다.
1. out2.write(OP_WRITE_BLOCK) : 1 byte 값이 block write operation을 보낸다.
2. out2.writeBoolean(shouldReportBlock) 으로 리포트 해야할 블럭인지를 보낸다.
3. block.wirte(out2) : block id와 block의 길이 len 을 쓴다.
4. out2.writeInt(target.length -1) : 복사해야할 남은 타겟의 갯수를 쓴다.
5. DatanodeInfo.write(out2) : 루프를 돌면서 남은 데이터노드의 정보를 보낸다.
6. out2.write(encodingType) : 1 byte 의 인코딩 타입값을 쓴다.
7. out2.writeLong(len) : 데이터 길이 len 을 쓴다.
8. in.read(buf, 0, len) : 루프를 돌면서 데이터를 다 읽는다.
9. out.write(buf,0, len), out2.write(buf, 0, len) : 루프를 돌면서 로컬 파일(out) 과 out2 에 데이터를 쓴다.
10. out2.flush() : 복사하는 타겟 out2 를 flush 한다.
11. in2.readLong() : long 값의 WRITE_COMPLETE 를 읽는다. 복사된 타겟이 잘 전달됐는지 확인
12. LocatedBlock.readFields(in2) : block 을 읽고 DatanodeInfo의 갯수를 읽고 루프돌면서 DatanodeInfo 읽음
이것으로 복사된 타겟의 정보를 얻을 수 있음
13. data.finalizeBlock(b) : DataNode 의 속성인 FSDataset 의 dirTree 에 block과 파일을 저장
14. receivedBlockList.add(b) : Namenode에 보고할 block을 리스트에 저장한다.
리스트에 저장되면 Datanode 자체쓰레드에서 관련 정보를 Namenode에 보냄
15. reply.writeLong(WRITE_COMPLETE) : 클라이언트에게 complete 메세지를 보냄
16. LocatedBlock.write(reply) : block, DatanodeInfo 갯수, 루프를 돌면서 DatanodeInfo.write 를 보낸다.