Hive LZO 압축

Hive LZO 압축 (LanguageManual LZO)

LZO는 무손실 데이터 압축 라이브러리로 압축률보다 속도를 우선해요. Hive에서 데이터를 LZO로 압축해 저장하고 읽는 방법을 정리했어요.

출처: 문서

본문

일반 LZO 개념

LZO는 압축률보다 속도를 선호하는 무손실 데이터 압축 라이브러리입니다. LZO에 대한 일반 정보는 http://www.oberhumer.com/opensource/lzohttp://www.lzop.org를, Hive의 압축에 대한 정보는 Compressed Data Storage를 참고하세요.

세 개의 컬럼을 가진 간단한 데이터 파일을 상상해 봅시다.

  • id
  • first name
  • last name

4개의 레코드를 담은 데이터 파일을 채워 봅시다:

19630001     john          lennon
19630002     paul          mccartney
19630003     george        harrison
19630004     ringo         starr

이 데이터 파일을 /path/to/dir/names.txt라고 합시다.

이것을 LZO 파일로 만들려면 lzop 유틸리티를 사용할 수 있으며 names.txt.lzo 파일이 생성됩니다.

이제 names.txt.lzo 파일을 HDFS로 복사합니다.

사전 요구 사항

Lzo/Lzop 설치

lzolzop은 Hadoop 클러스터의 모든 노드에 설치되어야 합니다. 설치 세부 사항은 이 문서의 범위를 벗어납니다.

core-site.xml

core-site.xml에 다음을 추가합니다:

  • com.hadoop.compression.lzo.LzoCodec
  • com.hadoop.compression.lzo.LzopCodec

예를 들어:

<property>
<name>io.compression.codecs</name>
<value>org.apache.hadoop.io.compress.GzipCodec,org.apache.hadoop.io.compress.DefaultCodec,org.apache.hadoop.io.compress.BZip2Codec,com.hadoop.compression.lzo.LzoCodec,com.hadoop.compression.lzo.LzopCodec</value>
</property>

<property>
<name>io.compression.codec.lzo.class</name>
<value>com.hadoop.compression.lzo.LzoCodec</value>
</property>

다음으로 LZO 인덱스 파일을 만드는 명령을 실행합니다:

hadoop jar /path/to/jar/hadoop-lzo-cdh4-0.4.15-gplextras.jar com.hadoop.compression.lzo.LzoIndexer  /path/to/HDFS/dir/containing/lzo/files

이 명령은 HDFS에 names.txt.lzo를 만듭니다.

테이블 정의

다음 hive -e 명령은 LZO 압축 외부 테이블을 만듭니다:

hive -e "CREATE EXTERNAL TABLE IF NOT EXISTS hive_table_name (column_1  datatype_1......column_N datatype_N)
         PARTITIONED BY (partition_col_1 datatype_1 ....col_P  datatype_P)
         ROW FORMAT DELIMITED FIELDS TERMINATED BY '\t'
         STORED AS INPUTFORMAT  \"com.hadoop.mapred.DeprecatedLzoTextInputFormat\"
                   OUTPUTFORMAT \"org.apache.hadoop.hive.ql.io.HiveIgnoreKeyTextOutputFormat\";

참고: 'hive -e' 명령이 올바르게 동작하려면 큰따옴표를 이스케이프해야 합니다.

명령 구문에 대한 정보는 CREATE TABLE과 Hive CLI를 참고하세요.

Hive 쿼리

옵션 1: LZO 파일 직접 생성

  1. Hive 쿼리의 출력으로 LZO 파일을 직접 만듭니다.
  2. lzop 명령 유틸리티 또는 커스텀 Java를 사용해 .lzo 파일에 대한 .lzo.index를 생성합니다.

Hive 쿼리 매개변수

SET mapreduce.output.fileoutputformat.compress.codec=com.hadoop.compression.lzo.LzoCodec
SET hive.exec.compress.output=true
SET mapreduce.output.fileoutputformat.compress=true

예를 들어:

hive -e "SET mapreduce.output.fileoutputformat.compress.codec=com.hadoop.compression.lzo.LzoCodec; SET hive.exec.compress.output=true;SET mapreduce.output.fileoutputformat.compress=true; <query-string>"

참고: 데이터 세트가 크거나 출력 파일 수가 많으면 이 옵션은 동작하지 않습니다.

옵션 2: 커스텀 Java를 작성해 LZO 파일 생성

  1. Hive 쿼리의 출력으로 텍스트 파일을 만듭니다.
  2. 다음을 수행하는 커스텀 Java 코드를 작성합니다.
    1. Hive 쿼리가 생성한 텍스트 파일을 .lzo 파일로 변환
    2. 위에서 생성된 .lzo 파일에 대한 .lzo.index 파일 생성

Hive 쿼리 매개변수

쿼리 문자열 앞에 다음 매개변수를 붙입니다:

SET hive.exec.compress.output=false
SET mapreduce.output.fileoutputformat.compress=false

예를 들어:

hive -e "SET hive.exec.compress.output=false;SET mapreduce.output.fileoutputformat.compress=false;<query-string>"

더 알아보기 (Learn more)

Hive의 압축 전반에 대한 내용은 Compressed Data Storage 문서를 참고하세요. LZO는 스플릿 가능한 압축이 필요할 때 유용하며, 인덱스 생성이 중요해요.