morebo2ks / hadoop

5 stars 0 forks source link

25주차 hadoop 스터디 #25

Closed KilJaeeun closed 1 year ago

KilJaeeun commented 1 year ago

파트

발표자

발표 기간

참고 링크

wookiist commented 1 year ago
jasonkang14 commented 1 year ago

https://jasonkang14.github.io/hadoop/what-is-avro

KilJaeeun commented 1 year ago

https://www.notion.so/12-567ef92764444665acadcda1639573ba#bc30260117b14b5aad666c4ef24c5f3d

hyunju-song commented 1 year ago

https://www.notion.so/ch-12-3d089978f41e4357a429e6ca58e50ffa

JSYoo5B commented 1 year ago

Avro

하둡의 문제점: Java로 작성되어 있다는 점 ~(현재 본인 기준으로 극명한 단점이라 생각함)~ 하지만 데이터를 생성, 사용하는 언어는 다양할 수도 있다. -> 데이터를 주고 받기 위한 표준이 필요하다. 그래서 대충 Thrift나 ProtoBuf와 비슷하게 IDL 식으로 데이터를 주고 받을 방법이 필요해서 Avro가 나옴

데이터를 JSON으로 주고받는게 아니라, 타입 정의(IDL)를 JSON으로 한다. 물론 그거 말고 Avro IDL도 존재함. (JSON으로 못 주고 받는 이유야 당연히 너무 string 지향적이고, 해석 할 데이터의 크기나 방식을 알 수 없으니까)

Avro 데이터 타입 및 스키마 정의

Primitive type은 일반적인 컴파일 타임 언어가 제공하는 기초적인 수준 Complex type은 배열, 맵, record(설명이 붙은 구조체 수준), enum, fixed(길이고정형 bytes), union이 제공된다.

스키마를 통해 미리 빌드타임에 스키마에 해당하는 코드를 생성하여 매핑한다. (Specific Mapping) 그것이 불가능 한 경우 동적 매핑을 한다. (자바에서는 Generic Mapping) 자바에서는 Avro 스키마의 내용에 따라 자바 Primitive로 매핑하는 reflection이 제공된다.

인메모리 직렬화 및 역직렬화

스키마를 정의하고 정적/동적 매핑 혹은 reflection을 했다면 이에 따라 받은 데이터를 객체로 변환하거나, 객체를 보내기 위해 변환해야 한다. (직렬화 및 역직렬화)

너무 당연한 내용인거같아서 왜 다뤘는지 좀 이해가 안됨

Specific API

Specific mapping을 하는 방법 중 Maven에서 빌드할 때 생성시키는 방법을 예제로 보여준다. IDL을 Java 코드로 변환하는 과정을 빌드 툴에 넣는다고 생각하면 된다.

Avro 데이터 파일

앞에서 다뤘던 부분은 메모리에서 직렬화/역직렬화에 집중했다면, 지금은 HDFS 등에 Avro로 정의된 데이터가 들어있는 경우를 이야기한다. 객체 컨테이너 파일 포맷은 이전에 배웠던 SequenceFile, MapFile 처럼 블록 단위로 저장하면서 sync 마커 등을 활용하여 효율적으로 데이터를 읽어올 수 있게 한다.

상호운영성

Avro 자체를 Java가 아닌 언어(다른 환경의 프로그램)에서 사용하고 연동하는 방법에 대해 설명한다.

근데 하필 스크립팅 언어인 Python이냐... 물론 정적 동적 매핑 성능 차이가 있긴 하겠지만 거의 비슷한 수준이라...

스키마 해석

reader와 writer가 완벽히 일치하지 않아도 된다. (타입 등이 바뀌는건 안되고, 추가 제거 정도는 가능하다.) 다른 IDL이라면 서로 맞추는게 당연하겠지만, Avro는 직렬화 과정에서 타입에 대한 메타데이터도 기록되나보다. 이전 레코드의 필드 이름이 변경되는 경우 aliases를 통해 하위호환성을 확보할 수 있다.

정렬 순서

기본적인 타입은 일반적인 논리의 정렬이 제공되며, record의 경우 각 필드마다 정렬 방식을 결정할 수 있다. (근데 record 내 field간 우선순위는 언급 안된거같은데?)

맵리듀스

직렬화 되고, 객체간 비교 되고, 비정형적인 스키마 정의 가능 하고, 정렬 가능하니 맵리듀스도 가능하다. 좀 더 Avro 친화적인 패키지를 제공해줘서 덜 고생하고 맵리듀스를 할 수 있다는 점을 보여줌.