하이브에서는 테이블 생성 시 'STORED AS 저장형식명' 옵션을 사용하여 테이블별로 파일 형식을 지정할 수 있습니다.

 

  파일 형식을 그냥 쉽게 표현하자면
  하이브에서 테이블 형태로 보여지는 데이터를
  어떤 구조로 HDFS에 저장하며,
  어떤 압축 방식을 사용할 것인지 정의한 저장 방식이라고 보시면 됩니다.

 

  하둡 개발자 입장에서는 이전 포스트(맵리듀스(Map-Reduce) 상세 작동 방법)에서 언급했었던 InputFormat과 OutputFormat을 확장하여 구현한 것이며, 추가로 <key, value> 형태의 데이터를 레코드 형태로 보여주는 SerDe까지 구현 한 라이브러리라고 보시면 이해가 쉬울 것 같습니다.

 

맵리듀스(Map-Reduce) 상세 작동 방법

맵리듀스(Map-Reduce) 데이터 흐름 하둡 맵리듀스는 클러스터 환경에서 대량의 데이터를 병렬로 처리하는 응용 프로그램을 쉽게 작성할 수 있는 소프트웨어 프레임워크입니다. 맵리듀스 작업은 일

sparkdia.tistory.com

 

  파일 형식기본 값TEXTFILE이며(hive.default.fileformat 옵션으로 변경 가능), 그 외에도 하이브에서는 아래와 같이 다양한 파일 형식을 제공하고 있습니다.

TEXTFILE
SEQUENCEFILE
RCFILE
ORC
PARQUET
AVRO  
JSONFILE

  물론, 하이브는 오픈 소스이므로 사용자 정의의 파일 형식도 적용할 수도 있습니다.

  이 포스트에서는 Hive에서 기본적으로 제공하고 있는 파일형식에 대해 살펴보도록 하겠습니다.

 

1. TEXTFILE

  말 그대로 텍스트 파일입니다. 우리가 메모장이나 vi에디터를 통해서 읽을 수 있는 그 텍스트 파일 맞습니다.

  일반적으로 TEXTFILE 파일 형식은 External 테이블 생성 시 사용합니다. 원천 시스템에서 수집한 데이터나 테스트 등의 목적으로 사용자가 생성한 데이터를 Hive에서 조회하기 위해서는 데이터를 텍스트 파일 형태로 HDFS에 저장한 뒤 External 테이블을 생성하면 됩니다.

  텍스트 파일 내 데이터는 구분자로 필드와 로우가 구별되어야 하며, 테이블 생성 시 DELIMITED 옵션을 사용하여 구분자를 명시해주면 됩니다.

[출처] https://cwiki.apache.org/confluence/display/Hive/LanguageManual+DDL#LanguageManualDDL-StorageFormats

 

  TEXTFILE은 기본적으로 압축되지 않은 파일형식이기 때문에(GZip같은 툴로 압축될 수는 있습니다.) 다른 파일형식에 비해 저장 공간을 많이 필요로한다는 단점이 있습니다.
  지속적으로 ODS 영역에 보관할 원천 시스템 데이터라면 압축된 파일형식의 테이블을 생성하여 데이터를 이관하여 보관해야 합니다. 압축된 파일형식의 테이블을 사용하는 것이 쿼리 성능과 저장 공간 활용도를 높이는 방법입니다. 

 

 

2. SEQUENCEFILE 

  SEQUENCEFILE 파일 형식은 데이터를 압축하여 저장합니다.

  SEQUENCEFILE 파일 형식은 로우 기반으로 데이터를 저장합니다.

  위 특징 때문에 코드 테이블, 디멘전 테이블처럼 데이터와 컬럼이 적은 테이블에 적용합니다. 

 

 

3. RCFile (Record Columnar File)

  RCFile은 컬럼 기반으로 데이터를 압축하여 저장하는 파일 형식입니다.

  아래 테이블의 데이터를 예를 들어 로우 기반(Row-oriented)컬럼 기반(Column-oriented) 저장 방식 차이점을 살펴보도록 하겠습니다. 

EmpId Lastname Firstname Salary
10 Smith Joe 40000
12 Jones Mary 50000
11 Johnson Cathy 44000
22 Jones Bob 55000

 

  아래 그림은 위 예제 데이터를 로우 기반 테이블과 컬럼 기반 테이블에 각각 저장하는 경우 저장되는 데이터 순서를 나타내는 예제입니다.

  로우 기반 저장 방식은 아래 예제처럼 데이터의 각 로우 내 데이터를 순서대로 저장(Serialize) 합니다. (각 로우별 저장 순서는 테이블 조회 시 보여지는 로우의 순서와 상이할 수 있습니다.)

001:10,Smith,Joe,40000;002:12,Jones,Mary,50000;003:11,Johnson,Cathy,44000;004:22,Jones,Bob,55000;

  위 방식은 로우의 전체 컬럼 데이터를 한번에 액세스 하는 경우에 효과적입니다.

  대표적으로 Oracle이 로우 기반 방식으로 데이터를 저장합니다.

 

  컬럼 기반 저장 방식아래 예제처럼 한 컬럼의 데이터를 먼저 저장(Serialize)한 후 다음 컬럼의 데이터를 저장합니다.

10 : 001,12 : 002,11 : 003,22 : 004; Smith : 001, Jones : 002, Johnson : 003, Jones : 004; Joe : 001, Mary : 002, Cathy : 003, Bob : 004; 40000 : 001,50000 : 002,44000 : 003,55000 : 004;

  만약에 컬럼 내 동일한 데이터가 존재한다면, 아래와 같은 방법으로 동일한 데이터를 한번만 저장하여 저장 공간을 절약할 수도 있습니다.

...; Smith : 001, Jones : 002,004, Johnson : 003; ...

 

  컬럼 기반 저장 방식은 아래와 같은 장점이 존재합니다.

  • 열 단위인 경우 데이터가 더 균일하므로 압축률이 향상됩니다. 압축률의 향상되면 부수적으로 저장 공간이 절약되고 액세스 시 Disk I/O가 감소됩니다.
  • 쿼리 시 쿼리문에 명시된 컬럼이 저장된 블록만 액세스하면 되므로 I/O가 감소됩니다.
  • 다양한 데이터 액세스 패턴을 적용하는게 수월해집니다.

 

 

 

4. ORC (Optimized Row Columnar)

  ORC는 Full name 그대로 RCFile을 개선시킨 파일 형식입니다. 물론 RCFile과 마찬가지로 ORC도 컬럼 기반 저장 방식을 사용합니다.

  현재 파일 형식중에서 가장 많이 사용되는 파일 형식이라고 말할 수 있습니다.

  ORC에 관해서는 정리할 내용이 많은 관계로 아래 별도의 포스트로 작성하였으니 참고 바랍니다.

 

ORC(Optimized Row Columnar) in 하이브(Hive)

하이브에서는 다양한 형식의 파일을 읽고 저장할 수 있도록 테이블 별로 파일 형식을 지정할 수 있습니다. https://sparkdia.tistory.com/56 하이브에서 기본적으로 제공하는 파일 형식 중에서 현재 가장

sparkdia.tistory.com

 

 

5. PARQUET 

  PARQUET도 컬럼 기반 저장 방식을 사용하는 파일 형식입니다.

  하이브와 피그만 지원되는 ORC에 비해 더 다양한 하둡 에코 시스템을 지원하고 있습니다.

  • Apache Hive
  • Apache Drill
  • Cloudera Impala
  • Apache Crunch
  • Apache Pig
  • Cascading
  • Apache Spark

  그리고 PARQUET는 Google Protocol Buffers와 비슷한 모델을 사용합니다. 이로 인해 복잡하게 중첩된 데이터 구조(List, Maps, Sets)를 효율적으로 저장할 수 있습니다. (참고 : Dremel made simple with Parquet)

 

 


6. AVRO  

  아파치 에이브로(AVRO)는 데이터 직렬화(Serialization) 시스템입니다.
  하이브에서는 이 에이브로의 파일을 하이브에서도 액세스 할 수 있도록 AVRO SerDe를 제공해줍니다.

  에이브로는 하둡의 직렬화 방식(Writable)방식의 단점인 언어 이식성을 해결하기 위해 만들어진 프로젝트 입니다. 데이터 파일에 스키마 정보를 같이 저장하므로 사전에 스키마 정보를 알지 못해도 데이터를 읽는 시점에 스키마 정보를 파악할 수 있게 됩니다. 이러한 방식으로 데이터를 관리하므로 다양한 개발 언어를 이용해 데이터 셋을 공유할 수 있는 것입니다.

  상세한 내용은 아파치 에이브로 홈페이지를 참고하시길 바랍니다.

  

 


7. JSONFILE

  Hive 4.0 버전에서부터 JSONFILE 파일 형식도 지원한다고 하네요. 

  기존에는 사용자 정의의 파일 형식을 이용하거나 전처리 과정을 통해 CSV 파일 형태로 만든 뒤 TEXTFILE 파일 형식을 사용하여 데이터를 액세스했었는데, 이런 번거로움이 사라지겠네요.

 

 

  이상으로 하이브의 파일 형식에 대해 알아보았습니다.
  위 내용중에서 추가/보완해야 할 사항있으면 친철한 댓글 부탁드립니다.
  감사합니다.

 

 

[Ref.] https://cwiki.apache.org/confluence/display/Hive/LanguageManual+DDL#LanguageManualDDL-StorageFormats
  https://cwiki.apache.org/confluence/display/Hive/FileFormats
  https://cwiki.apache.org/confluence/display/Hive/LanguageManual
  https://en.wikipedia.org/wiki/RCFile
  https://blog.twitter.com/engineering/en_us/a/2013/dremel-made-simple-with-parquet.html
  Hadoop, The Definitive Guide

 

+ Recent posts