Hive - 압축, 시퀀스 파일

Posted 09 11, 2015 09:17, Filed under: BigData/Hive



# hive의 설치된 코덱 확인

[hive@hdfs ~]$ hive -e "set io.compression.codecs"

io.compression.codecs=
org.apache.hadoop.io.compress.GzipCodec,
org.apache.hadoop.io.compress.DefaultCodec,
org.apache.hadoop.io.compress.SnappyCodec

압축을 사용하면 파일 저장에 필요한 디스크 공간 사용을 최소화하고 디스크와 네트워크의 부하를 줄여주는 장점이 있다.
그러나 파일을 압축하고 푸는 작업은 CPU에 많은 부하를 준다.
그러므로 여분의 CPU 용량이 있거나 디스크 공간이 매우 중요한 I/O 바운드 잡에서 압축을 사용하는 것이 좋다.

압축 속도와 압축률은 서로 반비례한다.
BZip2는 가장 높은 압축률을 보이지만 CPU를 가장 많이 쓴다.
속도 대비 압축률에 있어서 GZip이 그 다음이다.
그러므로 만약 적은 디스크 공간 사용과 I/O 부하가 중요하면 둘 다 매력적인 선택이 될 수 있다.

LZO와 Snappy는 압축률이 낮아 비교적 큰 파일을 만들지만 압축 속도가 빠르며 특히 압축을 풀 때는 훨씬 빠르다.
만약 빠르게 압축을 푸는 것이 디스크 공간과 I/O 오버헤드보다 중요하다면 이런 압축 방식을 선택하는 것이 좋다.


# Hadoop 라이브러리 추가
http://code.google.com/p/hadoop-snappy
LZO : http:wiki.apache.org/hadoop/UsingLzoCompression


하이브는 파일 포맷을 두 가지 관점에서 본다.
첫 번째는 어떻게 파일을 로우(레코드)로 나누냐는 것이다.
텍스트 파일은 \n(줄 바꿈 문자)을 기본 로우 구분자로 사용한다.
텍스트 파일 포맷을 사용하지 않으면 하이브에게 사용할 InputFormat과 OutputFormat의 이름을 알려줘야 한다.
실제로는 이러한 포맷을 구현한 자바 클래스 이름을 알려줘야 한다.
InputFormat은 어떻게 스플릿을 읽고 레코드로 나누는지 알고 있고, OutputFormat은 어떻게 스플릿을 파일 또는 콘솔에 출력하는지에 대해 알고 있다.

두 번째는 레코드를 어떻게 필드(또는 컬럼)로 나누냐에 대한 것이다.
하이브는 텍스트 파일의 레코드를 필드로 나눌 때 ^A문자를 기본 구분자로 사용한다.
하이브는 들어오는 레코드를 쪼개고(deserializer) 레코드를 해당 포맷으로 다시 쓰는 방법을 아는(serializer) SerDe라는 모듈을 이용하다.


# 중간 과정 압축

중간 과정 압축(intermediate compression)은 맵에서 리듀스로 보내는 데이터량을 줄인다.
중간 과정 압축에서는 압축률보다는 CPU 사용량이 낮은 압축을 선택하는 것이 중요하다.
hive.exec.compress.intermediate 속성의 기본값은 false이나 true로 설정해야 한다.


# 최종 출력 압축

하이브는 테이블로 결과를 출력할 때 내용을 압축할 수 있다.
hive.exec.compress.output 속성으로 설정할 수 있다.
전역 설정 파일에 이 값을 false로 설정하여 기본 출력은 압축이 안된 텍스트로 하고 쿼리 또는 스크립트에서 true로 설정하여 해당 쿼리 또는 스크립트만 최종 출력을 압축시킬 수도 있다.

[hive@hdfs conf]$ vi hive-site.xml
    <property>
      <name>hive.exec.compress.intermediate</name>
      <value>true</value>
      <description>맵과 리듀스 간에 생기는 중간 파일의 압축 여부를 설정한다.
        압축 코덱과 기타 옵션은 하둡 설정 변수인 mapred.output.compress.* 로 설정한다.       
      </description>
    </property>

    <property>
      <name>hive.exec.compress.output</name>
      <value>false</value>
      <description>이 값은 로컬/HDFS 파일 또는 하이브 테이블에 저장할 쿼리 출력의 압축 여부를 정한다.
       압축 코덱과 기타 설정은 하둡 설정 변수 mapred.output.compress.* 로 정한다.
      </description>
    </property>

    <property>
      <name>hive.exec.dynamic.partition</name>
      <value>true</value>
    </property>

    <property>
      <name>hive.exec.dynamic.partition.mode</name>
      <value>strict</value>
    </property>


# 시퀀스 파일
파일 압축은 공간을 절약하는 결과를 줄 수 있으나 원래 압축 파일 형태 그대로 하둡에 저장하면 파일이 분할 되지 않는 단점이 있다.
하둡은 분할 가능한 파일을 여러 조각으로 나눠 여러 맵퍼로 보내 병렬로 수행될 수 있게 한다.
대부분의 압축 파일은 나눌 수 없다. 왜냐하면 무조건 처음부터 읽어야 하기 때문이다.

하둡이 지원하는 시퀀스파일 포맷은 파일을 불록으로 나눌 수 있고 선택적으로 블록을 압축할 수 있다.(압축을 하더라도 여전히 나눌 수 있다.)
하이브에서 시퀀스파일을 사용하려면 CREATE TABLE 절에 STORED AS SEQUENCEFILE 절을 추가하면 된다.
CREATE TABLE a_sequence_file_table STORED AS SEQUENCEFILE;

시퀀스 파일은 세 가지 압축 옵션이 있다.
NONE, RECORD, BLOCK이고 RECORD가 기본이다.
일반적으로 BLOCK 압축이 좀 더 효율적일 뿐만 아니라 여전히 분할 가능한 포맷이다.
다른 압축 속성과 같이 이 속성도 하이브가 아니라 하둡 속성이다.
하둡의 mapred-site.xml 또는 하이브의 hive-site.xml 에 전역으로 설정할 수 있다.
또는 스크립트, 쿼리마다 개별 설정할 수도 있다.

    <property>
      <name>mapred.output.compression.type</name>
      <value>BLOCK</value>
      <description>만약 잡 결과가 시퀀스 파일로 압축되면 어떤 방법으로 압축하는지 설정한다.
      NONE, RECORD, BLOCK 중 하나이다.
      </description>
    </property>

하이브가 직접 압축 파일을 처리하지는 않는다.
하둡의 TextInputFormat이 압축 파일을 처리한다.
이름이 혼란스러울 수 있으나 TextInputFormat은 .default나 .gz 같은 확장자를 인식하고 바로 압축을 푼다.
하이브는 파일이 압축되었는지 또는 어떤 압축 방식으로 파일이 압축되었는지 모른다.



hive> create table a(a int, b int)

hive> insert into table a values(2, 3);
hive> insert into table a values(4, 5);



hive> set hive.exec.compress.intermediate=true;
-------------------------------------------------
CREATE TABLE intermediate_comp_on
ROW FORMAT DELIMITED FIELDS TERMINATED BY '\t'
AS SELECT * FROM a;
-------------------------------------------------
hive> CREATE TABLE intermediate_comp_on
    > ROW FORMAT DELIMITED FIELDS TERMINATED BY '\t'
    > AS SELECT * FROM a;
Query ID = hive_20150909153917_e8d52008-8adc-4003-af6a-0a96b3a94611
Total jobs = 1
Launching Job 1 out of 1


Status: Running (Executing on YARN cluster with App id application_1441779891681_0001)

--------------------------------------------------------------------------------
        VERTICES      STATUS  TOTAL  COMPLETED  RUNNING  PENDING  FAILED  KILLED
--------------------------------------------------------------------------------
Map 1 ..........   SUCCEEDED      1          1        0        0       0       0
--------------------------------------------------------------------------------
VERTICES: 01/01  [==========================>>] 100%  ELAPSED TIME: 2.22 s    
--------------------------------------------------------------------------------
Moving data to: hdfs://hdfs.innoquartz:8020/apps/hive/warehouse/ing_db.db/intermediate_comp_on
Table ing_db.intermediate_comp_on stats: [numFiles=1, numRows=2, totalSize=8, rawDataSize=6]
OK
Time taken: 3.287 seconds

hive> dfs -ls hdfs://hdfs.innoquartz:8020/apps/hive/warehouse/ing_db.db/intermediate_comp_on;
Found 1 items
-rwxrwxrwx   3 hive hdfs          8 2015-09-09 15:39 hdfs://hdfs.innoquartz:8020/apps/hive/warehouse/ing_db.db/intermediate_comp_on/000000_0

hive> dfs -ls /apps/hive/warehouse/ing_db.db/intermediate_comp_on;
Found 1 items
-rwxrwxrwx   3 hive hdfs          8 2015-09-09 15:39 /apps/hive/warehouse/ing_db.db/intermediate_comp_on/000000_0

hive> dfs -cat /apps/hive/warehouse/ing_db.db/intermediate_comp_on/000000_0 ;
2       3
4       5


# GZip 형식
hive> set mapred.map.output.compression.codec=org.apache.hadoop.io.compress.GzipCodec;
hive> set hive.exec.compress.intermediate=true;
-------------------------------------------------
CREATE TABLE intermediate_comp_on_gz
ROW FORMAT DELIMITED FIELDS TERMINATED BY '\t'
AS SELECT * FROM a;
-------------------------------------------------
hive> CREATE TABLE intermediate_comp_on_gz
    > ROW FORMAT DELIMITED FIELDS TERMINATED BY '\t'
    > AS SELECT * FROM a;
Query ID = hive_20150909154525_f8badc19-f7d6-4ee3-8e9f-e6d53acd11a2
Total jobs = 1
Launching Job 1 out of 1


Status: Running (Executing on YARN cluster with App id application_1441779891681_0001)

--------------------------------------------------------------------------------
        VERTICES      STATUS  TOTAL  COMPLETED  RUNNING  PENDING  FAILED  KILLED
--------------------------------------------------------------------------------
Map 1 ..........   SUCCEEDED      1          1        0        0       0       0
--------------------------------------------------------------------------------
VERTICES: 01/01  [==========================>>] 100%  ELAPSED TIME: 2.42 s    
--------------------------------------------------------------------------------
Moving data to: hdfs://hdfs.innoquartz:8020/apps/hive/warehouse/ing_db.db/intermediate_comp_on_gz
Table ing_db.intermediate_comp_on_gz stats: [numFiles=1, numRows=2, totalSize=8, rawDataSize=6]
OK
Time taken: 3.42 seconds

hive> dfs -cat /apps/hive/warehouse/ing_db.db/intermediate_comp_on_gz/000000_0 ;
2       3
4       5


hive> set hive.exec.compress.output=true;
-------------------------------------------------
CREATE TABLE final_comp_on
ROW FORMAT DELIMITED FIELDS TERMINATED BY '\t'
AS SELECT * FROM a;
-------------------------------------------------
hive> CREATE TABLE final_comp_on
    > ROW FORMAT DELIMITED FIELDS TERMINATED BY '\t'
    > AS SELECT * FROM a;
Query ID = hive_20150909154746_45fe7a75-f6c8-4908-9050-08db9e545a73
Total jobs = 1
Launching Job 1 out of 1


Status: Running (Executing on YARN cluster with App id application_1441779891681_0001)

--------------------------------------------------------------------------------
        VERTICES      STATUS  TOTAL  COMPLETED  RUNNING  PENDING  FAILED  KILLED
--------------------------------------------------------------------------------
Map 1 ..........   SUCCEEDED      1          1        0        0       0       0
--------------------------------------------------------------------------------
VERTICES: 01/01  [==========================>>] 100%  ELAPSED TIME: 3.21 s    
--------------------------------------------------------------------------------
Moving data to: hdfs://hdfs.innoquartz:8020/apps/hive/warehouse/ing_db.db/final_comp_on
Table ing_db.final_comp_on stats: [numFiles=1, numRows=2, totalSize=16, rawDataSize=6]
OK
Time taken: 4.17 seconds

hive> dfs -ls /apps/hive/warehouse/ing_db.db/final_comp_on ;
Found 1 items
-rwxrwxrwx   3 hive hdfs         16 2015-09-09 15:47 /apps/hive/warehouse/ing_db.db/final_comp_on/000000_0.deflate

hive> dfs -cat /apps/hive/warehouse/ing_db.db/final_comp_on/000000_0.deflate ;
0000000:      78 9c 33 e2 34 e6 32 e1 34 e5 02 00 04 9a 00 f5       x.3.4.2.4.......

hive> select * from final_comp_on;
OK
2       3
4       5


# GZip 형식, output=true

hive> set mapred.output.compression.codec=org.apache.hadoop.io.compress.GzipCodec;
hive> set hive.exec.compress.output=true;
-------------------------------------------------
CREATE TABLE final_comp_on_gz
ROW FORMAT DELIMITED FIELDS TERMINATED BY '\t'
AS SELECT * FROM a;
-------------------------------------------------
hive> CREATE TABLE final_comp_on_gz
    > ROW FORMAT DELIMITED FIELDS TERMINATED BY '\t'
    > AS SELECT * FROM a;
Query ID = hive_20150909162335_87f15298-4d21-46da-b952-38bbde4f4476
Total jobs = 1
Launching Job 1 out of 1


Status: Running (Executing on YARN cluster with App id application_1441779891681_0002)

--------------------------------------------------------------------------------
        VERTICES      STATUS  TOTAL  COMPLETED  RUNNING  PENDING  FAILED  KILLED
--------------------------------------------------------------------------------
Map 1 ..........   SUCCEEDED      1          1        0        0       0       0
--------------------------------------------------------------------------------
VERTICES: 01/01  [==========================>>] 100%  ELAPSED TIME: 3.02 s    
--------------------------------------------------------------------------------
Moving data to: hdfs://hdfs.innoquartz:8020/apps/hive/warehouse/ing_db.db/final_comp_on_gz
Table ing_db.final_comp_on_gz stats: [numFiles=1, numRows=2, totalSize=28, rawDataSize=6]
OK
Time taken: 4.079 seconds
hive>
hive> dfs -ls /apps/hive/warehouse/ing_db.db/final_comp_on_gz ;
Found 1 items
-rwxrwxrwx   3 hive hdfs         28 2015-09-09 16:23 /apps/hive/warehouse/ing_db.db/final_comp_on_gz/000000_0.gz

hive> dfs -cat /apps/hive/warehouse/ing_db.db/final_comp_on_gz/000000_0.gz
바이너리 파일 출력

hive> SELECT * FROM final_comp_on_gz;
OK
2       3
4       5
Time taken: 0.027 seconds, Fetched: 2 row(s)

이처럼 출력 압축을 사용하면 작은 크기의 바이너리 압축 파일이 생기고 매우 빠르게 실행된다.
그러나 우리는 출력 파일의 개수가 이 파일을 처리하는 맵 또는 리듀스의 숫자를 결정한다는 것을 배웠다.
최악의 경우에 하나의 나누어지지 않는 큰 바이너리 파일을 남긴다.
이는 이어지는 과정을 병렬 처리할 수 없음을 의미한다.
이 문제의 해답은 시퀀스파일을 사용하는 것이다.



hive> set mapred.output.compression.type=BLOCK;
hive> set hive.exec.compress.output=true;
hive> set mapred.output.compression.codec=org.apache.hadoop.io.compress.GzipCodec;
-------------------------------------------------
CREATE TABLE final_comp_on_gz_seq
ROW FORMAT DELIMITED FIELDS TERMINATED BY '\t'
STORED AS SEQUENCEFILE
AS SELECT * FROM a;
-------------------------------------------------
hive>
    > CREATE TABLE final_comp_on_gz_seq
    > ROW FORMAT DELIMITED FIELDS TERMINATED BY '\t'
    > STORED AS SEQUENCEFILE
    > AS SELECT * FROM a;
Query ID = hive_20150909165024_a8ad963a-ba6c-4daa-b69e-b300130a98d0
Total jobs = 1
Launching Job 1 out of 1
Tez session was closed. Reopening...
Session re-established.


Status: Running (Executing on YARN cluster with App id application_1441779891681_0003)

--------------------------------------------------------------------------------
        VERTICES      STATUS  TOTAL  COMPLETED  RUNNING  PENDING  FAILED  KILLED
--------------------------------------------------------------------------------
Map 1 ..........   SUCCEEDED      1          1        0        0       0       0
--------------------------------------------------------------------------------
VERTICES: 01/01  [==========================>>] 100%  ELAPSED TIME: 2.24 s    
--------------------------------------------------------------------------------
Moving data to: hdfs://hdfs.innoquartz:8020/apps/hive/warehouse/ing_db.db/final_comp_on_gz_seq
Table ing_db.final_comp_on_gz_seq stats: [numFiles=1, numRows=2, totalSize=247, rawDataSize=6]
OK
Time taken: 6.592 seconds

hive> dfs -ls /apps/hive/warehouse/ing_db.db/final_comp_on_gz_seq;
Found 1 items
-rwxrwxrwx   3 hive hdfs        247 2015-09-09 16:50 /apps/hive/warehouse/ing_db.db/final_comp_on_gz_seq/000000_0
hive>
hive> dfs -cat /apps/hive/warehouse/ing_db.db/final_comp_on_gz_seq/000000_0;
바이너리 파일 출력

> 시퀀스 파일의 헤더를 제외하고 압축 해제된 내용을 출력 : 하둡 명령, dfs -text
hive> dfs -text /apps/hive/warehouse/ing_db.db/final_comp_on_gz_seq/000000_0;
        2       3
        4       5

hive> SELECT * FROM final_comp_on_gz_seq;
OK
2       3
4       5
Time taken: 0.029 seconds, Fetched: 2 row(s)


# 중간 과정 압축과 결과 압축 동시 사용
각각 다른 압축 코덱을 사용하고 최종 결과는 시퀀스파일로 설정.
이 설정은 데이터셋이 큰 실제 환경에서 자주 사용된다.
그리고 이 설정은 성능을 향상 시킨다.


hive> set mapred.map.output.compression.codec=org.apache.hadoop.io.compress.SnappyCodec;
hive> set hive.exec.compress.intermediate=true;

hive> set mapred.output.compression.type=BLOCK;
hive> set hive.exec.compress.output=true;
hive> set mapred.output.compression.codec=org.apache.hadoop.io.compress.GzipCodec;
-------------------------------------------------
CREATE TABLE final_comp_on_gz_int_compress_snappy_seq
ROW FORMAT DELIMITED FIELDS TERMINATED BY '\t'
STORED AS SEQUENCEFILE
AS SELECT * FROM a;
-------------------------------------------------
hive>
    > CREATE TABLE final_comp_on_gz_int_compress_snappy_seq
    > ROW FORMAT DELIMITED FIELDS TERMINATED BY '\t'
    > STORED AS SEQUENCEFILE
    > AS SELECT * FROM a;
Query ID = hive_20150909170328_7ac6b7e0-b7da-4d88-903c-85041b7df8cd
Total jobs = 1
Launching Job 1 out of 1
Tez session was closed. Reopening...
Session re-established.


Status: Running (Executing on YARN cluster with App id application_1441779891681_0004)

--------------------------------------------------------------------------------
        VERTICES      STATUS  TOTAL  COMPLETED  RUNNING  PENDING  FAILED  KILLED
--------------------------------------------------------------------------------
Map 1 ..........   SUCCEEDED      1          1        0        0       0       0
--------------------------------------------------------------------------------
VERTICES: 01/01  [==========================>>] 100%  ELAPSED TIME: 3.02 s    
--------------------------------------------------------------------------------
Moving data to: hdfs://hdfs.innoquartz:8020/apps/hive/warehouse/ing_db.db/final_comp_on_gz_int_compress_snappy_seq
Table ing_db.final_comp_on_gz_int_compress_snappy_seq stats: [numFiles=1, numRows=2, totalSize=247, rawDataSize=6]
OK
Time taken: 7.336 seconds

hive> dfs -ls /apps/hive/warehouse/ing_db.db/final_comp_on_gz_int_compress_snappy_seq;
Found 1 items
-rwxrwxrwx   3 hive hdfs        247 2015-09-09 17:03 /apps/hive/warehouse/ing_db.db/final_comp_on_gz_int_compress_snappy_seq/000000_0

hive> dfs -text /apps/hive/warehouse/ing_db.db/final_comp_on_gz_int_compress_snappy_seq/000000_0;
        2       3
        4       5



참고 도서 : 하이브 완벽 가이드


※ 위 내용은, 여러 자료를 참고하거나 제가 주관적으로 정리한 것입니다.
   잘못된 정보나 보완이 필요한 부분을, 댓글 또는 메일로 보내주시면 많은 도움이 되겠습니다.
09 11, 2015 09:17 09 11, 2015 09:17


Trackback URL : http://develop.sunshiny.co.kr/trackback/1033

Leave a comment

« Previous : 1 : ... 17 : 18 : 19 : 20 : 21 : 22 : 23 : 24 : 25 : ... 648 : Next »

Recent Posts

  1. HDFS - Python Encoding 오류 처리
  2. HP - Vertica ROS Container 관련 오류...
  3. HDFS - Hive 실행시 System Time 오류
  4. HP - Vertica 사용자 쿼리 이력 테이블...
  5. Client에서 HDFS 환경의 데이터 처리시...

Recent Comments

  1. Right away I am ready to do my bre... 골목게임 11 17,
  2. Terrific article! That is the type... 선릉야구장 11 16,
  3. Yes! Finally someone writes about /. / 11 16,
  4. Круто, круто! Некот... карточные игры на... 11 13,
  5. 안녕하세요^^ 배그핵

Recent Trackbacks

  1. master djs bozeman master djs bozeman %M
  2. wedding dj bozeman mt wedding dj bozeman mt 17 11
  3. joes dj bozeman joes dj bozeman 17 11
  4. Mysql - mysql 설치후 Character set... 멀고 가까움이 다르기 때문 %M

Calendar

«   11 2019   »
          1 2
3 4 5 6 7 8 9
10 11 12 13 14 15 16
17 18 19 20 21 22 23
24 25 26 27 28 29 30

Bookmarks

  1. 위키피디아
  2. MysqlKorea
  3. 오라클 클럽
  4. API - Java
  5. Apache Hadoop API
  6. Apache Software Foundation
  7. HDFS 생태계 솔루션
  8. DNSBL - Spam Database Lookup
  9. Ready System
  10. Solaris Freeware
  11. Linux-Site
  12. 윈디하나의 솔라나라

Site Stats

TOTAL 2755902 HIT
TODAY 144 HIT
YESTERDAY 638 HIT