이번 글에서는 빅데이터 처리할 경우 사용하는 파일 포맷(Parquet, ORC, Avro)에 대해 살펴볼 예정이며 그 중에서도 Parquet에 대해 자세히 살펴보자.
Parquet, ORC, Avro의 공통점과 차이점은 아래와 같다.
Parquet와 ORC는 column 기반으로 저장하고, Avro는 row 기반으로 저장한다.
row 기반은 데이터를 쓸 때 용이하고, column 기반은 읽어서 분석해야 하는 경우 용이하다.
column 기반은 row 기반에 비해 압축률이 좋지만, 전체 데이터를 재구성하는데 시간이 오래 걸린다는 단점이 있다.
따라서 한번에 모든 필드를 접근해서 데이터를 읽고 쓰고자 할 때는 Avro 파일 포맷을 쓰는 것이 좋고, 특정 필드에만
반복적으로 접근해야 하는 경우 Parquet이나 ORC를 사용하는 것이 좋다.
데이터를 저장하는 방식 중 하나로 하둡생태계에서 많이 사용되는 파일 포맷이다.
빅데이터를 처리할 때는 많은 시간과 비용이 들어가기 때문에
빠르게 읽고, 압축률이 좋아야 한다.
이러한 특징을 가진 파일 포맷으로는 Parquet(파케이), ORC 가 있다.
Parquet가 압축률이 좋은 이유는 컬럼기반 저장포맷이기 때문이다.
먼저, 컬럼기반이 무엇인지 알아보자.
다음과 같은 데이터베이스를 이용하여 이해해보자.
행 기반으로 저장되는 건 아래와 같이 저장된다.
열 기반으로 저장되는 건 아래와 같이 저장 된다.
그럼 왜 열 기반으로 저장되는 것이 압축률이 더 좋을까?
같은 컬럼에는 종종 유사한 데이터가 나열된다.
특히 같은 문자열의 반복은 매우 작게 압축할 수 있다.
데이터의 종류에 따라 다르지만, 열 지향 데이터베이스는 압축되지 않은 행 지향 데이터 베이스와
비교하면 1/10 이하로 압축 가능하다.
또한, 데이터를 전체 컬럼 중에서 일부 컬럼을 선택해서 가져오는 형식이므로
선택되지 않는 컬럼의 데이터에서는 I/O가 발생하지 않게 된다.
즉 컬럼 기반 포맷은 같은 종류의 데이터가 모여 있으므로 압축률이 더 높고,
일부 컬럼만 읽어 들일 수 있어 처리량을 줄일 수 있다.
데이터 분석에서는 종종 일부 컬럼만이 집계 대상이기 때문에, 이렇게 열 기반으로 압축하면 필요한 컬럼만을 빠르게 읽고 집계할 수 있다.
그렇다면 열 기반으로만 저장하는게 무조건 좋은게 아닌가?
MySQL의 경우 대표적인 행 기반 저장 방식의 데이터베이스이다.
행 기반 데이터베이스는 매일 발생하는 대량의 트랜잭션을 지연 없이 처리하기 위해
데이터 추가를 효율적으로 할 수 있도록 하는 것이 행 지향 데이터베이스의 특징이다.
즉, 새로운 레코드를 추가할 경우 끝부분에 추가되기 때문에 고속으로 쓰기가 가능하다.
파케이 파일은 header, 하나 이상의 block, footer 순으로 구성된다.
header와 footer는 meta 정보이며 1개씩만 존재한다.
block은 list 형식이며 여기에 실제 N 개의 데이터가 저장된다.
여기서 block은 hdfs의 block 이며, 한번에 읽을 때 단위를 의미한다.
Parquet는 데이터를 저장하기 위해 hierarchical structure를 사용한다.
Parquet 파일 하나는 1개 이상의 Row group이 있고,
Row group 은 column 별로 저장되어 있다.
Row group 단위로 데이터를 읽고 쓰는 것이 가능하며, 이는 스캔 속도를 높이는데 기여한다.
일반적으로 Row group은 512MB ~ 1GB 사이로 설정하는 것이 권장되며, parquet.block.size 옵션으로 수정할 수 있다.
column chunk는 여러 개의 page로 구성되며, 실제 데이터와
인코딩, 압축 정보 등이 저장된다.
page 단위로 압축을 적용하고, page 헤더의 통계 정보를 담아서 pruning에 활용할 수도 있다.
각 페이지는 동일한 컬럼의 값만 포함하고 있다.
따라서 페이지에 있는 값은 비슷한 경향이 있기 때문에 페이지를 압축할 때 매우 유리하다.
데이터의 가장 최소 단위인 페이지에는 동일 컬럼의 데이터만 존재한다. 그래서 인코딩/압축을 할 때, 페이지 단위로 수행하면 된다.
위 구조가 머리속에 그려지면 파케이 파일을 만들 때 아래 설정 값이 이해된다.
생성된 파케이 파일을 확인하기 위해 duckdb를 사용할 수 있다.
// 설치
$ brew install duckdb
$ duckdb
$ D * from read_parquet('/Users/jang-won-yong/Downloads/cities.parquet') limit 3
ORC(Optimized Row Columnar)는 컬럼 기반의 파일 저장 방식으로 Hadoop, Hive, Pig, Spark 등에 적용이 가능하다.

parquet 에서 row group 단위로 하나의 파일에서 나눠서 읽을 수 있는 역할을 orc는 stripe 라는 이름으로 제공한다.
ORC 파일 확인하기 위해서 orc-tools를 이용하여 확인 가능하다.
링크에서 orc-tools-1.9.2-uber.jar 를 다운 받은 후 사용할 수 있다.
Apache Avro 는 row 기반으로 저장되는 포맷이다.
파일 형식 중 하나인 tar 와 함께 .tar.gz 형식으로 자주 사용된다.
Reference
https://devidea.tistory.com/92
https://amazelimi.tistory.com/entry/File-Format-For-Big-Data-Parquer-vs-ORC-vs-Avro-LIM
https://amazelimi.tistory.com/78
https://blog-tech.tadatada.com/2018-05-23-parquet-and-spark