(하둡) 직렬화

직렬화는 네트워크 전송을 위해 구조화된 객체를 바이트 스트림으로 전환하는 과정이다.
역지렬화는 바이트 스트림을 일련의 구조화된 객체로 역전환하는 과정이다.

직렬화는 프로세스간 통신과 영속적인 저장소와 같은 분산 데이터 처리의 독특한 두 영역에서 나타난다.

하둡 시스템에서 노드 사이의 프로세스 간 통신은 원격 프로시저 호출(RPC) 을 사용하여 구현한다.

RPC프로토콜은 원격 노드로 보내기 위한 메시지를 하나의 바이너리 스트림으로 구성하기 위해 직렬화를 사용하고, 그 후 원격 노드에서 바이너리 스트림을 원본 메시지로 재구성하기 위해 역직렬화를 사용한다.
일반적으로 RPC직렬화 포맷이 유익한 이유는 다음과 같다.

  • 간결성
 간결한 포맷을 사용하면 데이터 센터에서 가장 희소성이 높은 자원인 네트워크 대역폭을 절약할 수 있다.

  • 고속화
프로세스 간 통신은 분산 시스템을 위한 백본을 형성하기 때문에 직렬화와 역직렬화는 가능한 오버헤드가 작아야한다.

  • 확장성
프로토콜은 새로운 요구사항을 만족시키기 위해 점차 변경되므로 클라이언트와 서버 사이의 통제 방식과 관련된 프로토콜의 발전도 직관적이어야한다. 예를들어 새로운 인자를 메소드 호출에 추가할 수 있어야하고, 새로운 서버는 기존 클라이언트에서(새로운 인자없이) 예전 포맷의 메시지도 수용할 수 있어야한다.


  • 상호운용성
일부 시스템을 위해 다양한 언어로 작성된 클라이언트를 지원하는 편이 좋으며, 이를 가능하도록 포맷을 설계할 필요가있다.

하둡은 Writeable이라는 매우 간결하고 빠른 자체 직렬화 포맷을 사용한다.
그러나 확장하거나 자바외에 다른 언어를 사용하는 것은 어렵다. 
에이브로는(Writable의 일부 한계를 극복하기 위해 설계된 직렬화시스템)



자바 기본자료형을 위한 Writable래퍼


char(IntWritable로 저장가능)를 제외한 모든 자바 기본 자료형을 위한 Writable 래퍼가 존재한다. 모든 Writable 래퍼는 래핑된 값을 얻고 저장하기 위한 get()과 set()메소드를 제공한다.


자바 기본 자료형            Writable구현체            직렬화된 크기(바이트)
boolean                        BooleanWritable                  1
byte                             ByteWritable                       1
short                            ShortWritable                     2
int                               IntWritable                         4
                                  VIntWritable                       1~5
float                            FloatWritable                       4
long                            LongWritable                       8
                                  VLongWritable                     1~9
double                         DoubleWritable                    8 




텍스트

Text는 UTF-8시퀀스를 위한 Writable 구현체다. 이거은 java.lang.String에 상응하는 Writable로 생각될 수 있다.
Text클래스는 문자열 인코딩에 다수의 바이트를 저장하기 위해 가변길이 인코딩으로 int를 사용하므로 최댓값은 2GB에이른다.
더욱이 Text는 표준 UTF-8dmf 사용하기 때문에 UTF-8을 사용하는 다른 도구와의 상호운용성이 뛰어나다.

인덱스 만들기. 표준 UTF-8을 사용하는 것은 매우 중요하기 때문에 Text와 자바 String 클래스의 차이점을 살펴볼 필요가 있다. Text클래스에서 인코딩된 바이트의 시퀀스의 우치 관점이지 문자열에서의 유니코드 문자나 자바 char 코드 단위(String에서 하는 것처럼)의 위치 관점은 아니다.
ASCII문자열에 대해서는 이러한 인덱스 위치에 대한 세 가지 관점이 동시에 수반된다.

charAt() 이 유니코드 코드 포인트를 표현하는 int를 반환함을 주목하라. 이것은 char를 반환하는 String 과는 다르다.
Text역시 String의 indexOf() 메소드와 유사한 find()메소드가 있다

유니코드. 한 바이트 이상을 인코딩 하는 문자를 사용해보면 Text와 String의 차이점을 명확히 알 수 있다.
다음 유니코드 문자를 살펴보자.

유니코드 포인트   U+0041                    U+00DF                      U+6771                                U+10400
이름                 라틴대문자 A       세련된 라틴 소문자S      N/A(한의 통일된 표의문자)       데저랫대문자I
UTF-8코드 단위     41                          c3 9f                            e6 9d b1                          f0 90 90 80
자바 표기             \u0041                   \u00DF                         \u6771                    \uuD801\uDC00


표에서 마지막문자 인 U+10400을 제외한 모든 문자는 1개의 자바 char로 표현될 수 있다.
U+10400은 보충 문자에 해당하고, 대행 쌍으로 알려진 2개의 자바 char로 표기된다.
다음은 4개의 문자로 구성된 문자열을 처리할때 String과 Text사이의 차이점을 알 수 있다.

























댓글

이 블로그의 인기 게시물

(18장) WebSocekt과 STOMP를 사용하여 메시징하기

(네트워크)폴링방식 vs 롱 폴링방식

(ElasticSearch) 결과에서 순서 정렬