NameNode 는 RPC 클래스를 통해서 Server 클래스를 동작시킨다.

Server 클래스는 아래의 3개의 내부 쓰레드를 가진다.

1. Listener 스레드 : ServerSocket 을 가지면 클라이언트가 접속할 때 마다 Connection 쓰레드를 생성
2. Connection 스레드 : 클라이언트의 요청 데이터를 받아서 Call 객체를 생성하여 callQueue 에 넣는다.
                                 데이터는 DataInput 으로 부터 읽어 들임
3. Handler 쓰레드 : callQueue로 부터 Call 객체를 받아와 RPC 호출을 실행 시킨다.
                           실제적으로 일을 하는 쓰레드로 conf 객체의 "dfs.namenode.handler.count"  값으로
                           갯수를 결정하며 default 는 10 이다.


클라이언트가 요청할 때 DataInput 으로 읽어들이는 값의 순서
1. id : in.readInt() 로 id 값을 읽음
2. methodName : UTF8.readString(in) 로 메소드 명을 읽음
3. 파라미터 갯수 : in.readInt() 로 파라미터 갯수를 int 값으로 읽음
4. 파라미터 객체를 읽음 : ObjectWritable.readObject(in, objectWritable, this.conf) 로 파라미터 객체 생성에 
                                    필요한 값을 읽음

4번 파라미터 객체를 읽는 순서
1. className : UTF8.readString(id) 로 클래스명을 읽음
                      클래스명은 in.readUnsignedShort() 로 클래스명이 차지하는 byte 수를 읽고 
                      그 클래스명 크기만큼 읽어들임
2. 자기 클래스에 맞는 크기 만큼 읽어 들임.
    - null 이면 NuuInstance 의 readFields(in) 를 읽음
    - 원시타임(char, int, long 등등)은 in.readChar() 등으로 읽음
    - Array 는 in.readInt() 로 배열크기를 읽은 다음 recursive call로 readObject() 를 다시 읽음
    - String 은 UTF8.readString(in) 으로 읽음
    - 그외 객체는 1번으로 읽어들인 클래스명으로 인스턴스를 만들어 객체가 Writable 인터페이스를 구현한
       writable.readFields(in) 로 읽어들임
Posted by Kubernetes Korea co-leader seungkyua@gmail.com