
이 글은 하이브 완벽 가이드 책을 읽고 그 중 일부 내용을 정리한 글입니다.
데이터를 특정 포맷에 강제로 맞추지 않는 것은 하이브만의 고유 기능입니다. 하이브는 하둡의 입력 포맷 API를 이용해 텍스트 파일, 시퀀스 파일, 사용자 정의 파일과 같은 다양한 소스로부터 데이터를 읽습니다.
하둡이 압축하지 않은 데이터인 경우에 파일 저장소 내에서 선형 확장을 제공하지만 데이터 압축은 다양한 이점이 있습니다. 많은 양의 디스크를 절약하고, 처리량과 성능을 향상시키고, 네트워크 성능에도 이롭습니다.
하둡 잡은 CPU보다 I/O를 많이 쓰는 경향이 있기 때문에 그런 경우 압축은 성능을 향상시키지만 CPU를 많이 쓰는 경우에는 압축은 오히려 성능을 떨어뜨립니다. 실제로 압축이 성능을 향상시키는지 확인하는 길은 여러 가지 옵션을 적용하여 실험하고 결과를 측정하는 방법뿐입니다.
설치된 코덱 확인
하둡 버전에 따라 사용 가능한 코덱이 다릅니다. 하이브의 io.compression.codec 속성을 통해 확인할 수 있습니다.
압축 코덱 선택
GZip, BZip2, Snappy, LZO 압축 등 여러 가지 압축 방식이 필요한 까닭은 압축 속도와 압축률은 서로 반비례하기 때문입니다. BZip2는 가장 높은 압축률을 보이지만 CPU를 가장 많이 씁니다. 속도 대비 압축률에 있어서 GZip이 그 다음입니다. LZO, Snappy는 압축률이 낮아 비교적 큰 파일을 만들지만 압축 속도가 빠르며 특히 압축을 풀 때는 훨씬 빠릅니다.
또한 압축한 포맷의 분할 여부도 중요한 고려사항입니다. GZip, Snappy는 경계를 확인할 수 없기 때문에 블록 단위의 압축을 지원하지 않지만 Bzip2와 LZO는 각각의 블록이 완전한 레코드를 포함하고 있는 블록 단위의 압축을 지원합니다.
하이브는 파일 포맷을 다음과 같은 두 가지 관점에서 봅니다.
- 어떻게 파일을 로우(레코드)로 나누냐는 것입니다. 텍스트 파일은 \n을 기본 로우 구분자로 사용합니다.
- 레코드를 어떻게 필드(또는 컬럼)로 나누냐는 것입니다. 하이브는 텍스트 파일의 레코드를 필드로 나눌 때 ^A 문자를 기본 구분자로 사용합니다.
중간 과정 압축
중간 과정 압축은 맵에서 리듀스로 보내는 데이터양을 줄입니다. hive.exec.compress.intermediate 속성은 맵과 리듀스 간에 생기는 중간 파일의 압축 여부를 설정합니다. 중간 과정 압축에서는 압축률보다는 CPU 사용량이 낮은 압축을 선택하는 것이 중요합니다. SnappyCodec은 압축 성능이 좋고 CPU를 덜 사용하기 때문에 중간 과정 압축에 적합합니다. mapred.map.output.compression.codec 속성을 설정하여 다른 코덱으로 바꿀 수 있습니다.
SET mapred.map.output.compression.codec=org.apache.hadoop.io.compress.SnappyCodec;
최종 출력 압축
하이브는 테이블로 결과를 출력할 때 내용을 압축할 수 있습니다. hive.exec.compression.output 속성을 true로 설정하여 최종 출력을 압축할 수 있습니다. 해당 속성을 true로 설정하면 코덱을 선택할 수 있습니다. GZip 압축은 보통 파일의 크기를 상당히 줄여주기 때문에 출력 압축으로 사용하기에 알맞습니다. GZip으로 압축한 파일은 맵리듀스 잡으로 분할해서 보내지 않고 단일 파일로 단일 맵 프로세스에게 전달됩니다.
SET mapred.map.output.compression.codec=org.apache.hadoop.io.compress.GzipCodec;
시퀀스 파일
파일 압축은 공간을 절약하는 결과를 줄 수 있으나 원래 압축 파일 형태 그대로 하둡에 저장하면 파일이 분할되지 않는 단점이 있습니다. 하둡은 분할 가능한 파일을 여러 조각으로 나눠 여러 맵퍼로 보내 병렬로 수행할 수 있게 합니다.
하둡이 지원하는 시퀀스파일 포맷은 파일을 블록으로 나눌 수 있고 선택적으로 블록을 압축할 수 있습니다. 하이브에서 시퀀스 파일을 사용하려면 다음과 같이 CREATE TABLE 절에 STORED AS SEQUENCEFILE 절을 추가하면 됩니다.
CREATE TABLE a_sequence_file_table STORED AS SEQUENCEFILE;
시퀀스파일은 세 가지 압축 옵션이 있습니다. NONE, RECORD, BLOCK이 있고 RECORD가 기본입니다. 일반적으로 BLOCK 압축이 좀 더 효율적일 뿐만 아니라 분할 가능한 포맷입니다. mapred.output.compression.type 속성을 이용하여 설정합니다.
SET mapred.output.compression.type=BLOCK;'Hadoop Ecosystem > Hive' 카테고리의 다른 글
| [하이브 완벽 가이드] Ch18. 보안 (0) | 2022.10.29 |
|---|---|
| [하이브 완벽 가이드] Ch15. 하이브 파일과 레코드 포맷 사용자화 (0) | 2022.10.29 |
| [하이브 완벽 가이드] Ch10. 튜닝 (0) | 2022.10.10 |
| [하이브 완벽 가이드] Ch9. 스키마 설계 (0) | 2022.10.06 |
| [하이브 완벽 가이드] Ch8. HiveQL : 색인(Index) (0) | 2022.10.04 |