반응형
에이브로 (Avro)
아파치 에이브로는 더그 커팅이 개발한 언어에 중립적인 스키마 기반의 데이터 직렬화 프레임워크이다.
데이터를 네트워크를 통해 전송하거나 저장하기 위해서는 데이터를 직렬화해야한다.
하둡 Writable 클래스들은 언어 이식성이 없기 때문에 에이브로는 하둡에서 데이터를 직렬화하는데 선호되는 도구이다.
스키마
스키마는 JSON을 사용하여 정의된다
[User에 대한 스키마 예제 (user.avsc)]
{
"namespace": "example.avro",
"type": "record",
"name": "User",
"fields": [
{"name": "name", "type": "string"},
{"name": "favorite_number", "type": ["int", "null"]},
{"name": "favorite_color", "type": ["string", "null"]}
]
}
스키마는 파일에 에이브로 데이터와 함께 저장된다.
에이브로와 유사하게 하둡에는 다른 직렬화 메커니즘들이 있다. 시퀀스 파일, 프로토콜 버퍼, Thrift 등
Primitive 데이터 타입
- null
- int
- long
- float
- double
- bytes
- string
Complex 데이터 타입
- Record
- Enum
- Arrays
- Maps
- Unions
예제 코드
User user1 = new User();
user1.setName("Alyssa");
user1.setFavoriteNumber(256);
// Leave favorite color null
// Alternate constructor
User user2 = new User("Ben", 7, "red");
// Construct via builder
User user3 = User.newBuilder()
.setName("Charlie")
.setFavoriteColor("blue")
.setFavoriteNumber(null)
.build();
// Serialize user1, user2 and user3 to disk
DatumWriter<User> userDatumWriter = new SpecificDatumWriter<User>(User.class);
DataFileWriter<User> dataFileWriter = new DataFileWriter<User>(userDatumWriter);
dataFileWriter.create(user1.getSchema(), new File("users.avro"));
dataFileWriter.append(user1);
dataFileWriter.append(user2);
dataFileWriter.append(user3);
dataFileWriter.close();
// Deserialize Users from disk
DatumReader<User> userDatumReader = new SpecificDatumReader<User>(User.class);
DataFileReader<User> dataFileReader = new DataFileReader<User>(file, userDatumReader);
User user = null;
while (dataFileReader.hasNext()) {
// Reuse user object by passing it to next(). This saves us from
// allocating and garbage collecting many objects for files with
// many items.
user = dataFileReader.next(user);
System.out.println(user);
/*
[output]
{"name": "Alyssa", "favorite_number": 256, "favorite_color": null}
{"name": "Ben", "favorite_number": 7, "favorite_color": "red"}
{"name": "Charlie", "favorite_number": null, "favorite_color": "blue"}
*/
}
특징
- 에이브로는 압축할 수 있고 쪼갤 수 있는 구조화된 바이너리 포맷을 생성한다. 따라서 하둡 맵리듀스 입력으로 효율적으로 사용될 수 있다.
- 풍부한 데이터 구조를 지원한다. 배열, enum, sub record 같은 것들.
장점
- 다양한 언어를 지원한다
파케이 (Parquet)
데이터를 저장하는 방식(파일포맷) 중 하나이다.
하둡에서 운영되는 언어, 프레임워크에 제한되지 않는 모든 프로젝트에서 사용 가능한 컬럼 기반의 저장 포맷이다.
트위터에서 개발되어 소스 코드 공개 이후 아파치에서 관리되고 있다.
컬럼 기반 포맷의 업계 표준에 가깝다.
컬럼 기반의 저장 포맷이란 무엇인가?
빅데이터 처리는 보통 많은 시간과 비용이 들어가므로 압축률을 높이거나 데이터를 효율적으로 정리해서 데이터 크기를 줄일 수 있다면 매우 큰 이득이다.
데이터를 극적으로 줄일 수 있는 아이디어 중 하나가 컬럼 기반 포맷이다.
컬럼 기반 포맷은 같은 종류의 데이터가 모여있으므로 압축률이 높고, 일부 컬럼만 읽어 들일 수 있어 처리량을 줄일 수 있다.
만약 한 컬럼 데이터들만 읽기를 원할 경우
- 행 기반인 경우 : 각각의 레코드들을 모두 로드하고 각 필드로 파싱한 뒤 읽으려는 컬럼 데이터를 추출해야 한다
- 컬럼 기반인 경우 : 읽기 원하는 컬럼으로 가서 같이 저장되어 있는 값들을 함께 읽으면 된다
=> seek time이 줄어들기 때문에 쿼리 성능이 좋아진다
Primitive data types
- BOOLEAN: 1 bit boolean
- INT32: 32 bit signed ints
- INT64: 64 bit signed ints
- INT96: 96 bit signed ints
- FLOAT: IEEE 32-bit floating point values
- DOUBLE: IEEE 64-bit floating point values
- BYTE_ARRAY: arbitrarily long byte arrays.
파케이 파일 포맷
- Row group : 각 컬럼을 위한 Column Chunk들로 구성
- Column Chunk : 특정 컬럼에 대한 데이터 조각
참고 자료 : 하둡 완벽 가이드 4판 (톰 화이트 저)
반응형
'개발 > Data Engineering' 카테고리의 다른 글
Apache Airflow DAG 간의 dependency 설정 (0) | 2022.01.25 |
---|---|
Apache Hudi 소개 - HDFS upsert/delete (0) | 2021.07.11 |
태블로 데이터 원본 구성 방법 - 관계와 조인 (0) | 2021.04.16 |
HDFS 네임노드 OutOfMemory 에러 (0) | 2016.09.27 |
직접해보는 하둡 프로그래밍 - 1. 빅데이터와 하둡이해하기 - 하둡이해하기 (0) | 2016.09.25 |