Hive 파티션 테이블에서 where  없는 쿼리 실행 방지

 

·       Version : Hive

 

하이브에서 테이블 파티셔닝을 하는 가장 이유는 빠르게 데이터를 검색하기 위해서이다. 아주 데이터가 있더라도 파티션 스키마가 검색하려는 범위 필터링을 반영한다면 파티셔닝 테이블은 쿼리의 성능을 극적으로 올려준다. 그래서 특정값을 필터하는 WHERE 절에 파티션 조건을 포함하는데 이러한 조건을 파티션 필터라고 부른다.

그러나 파티셔닝이 되어 있다고 하더라도, 테이블 데이터가 많거나 파티션 개수가 많다면 거대한 맵리듀스 작업을 유발할 있다. 이러한 맵리듀스의 부하를 방지하기 위해 WHERE 절에  파티션 필터가 없는경우 쿼리 실행이 되지 않도록 옵션을 설정할 있다.

 

아래 스크립트는 WHERE절에 파티션 필터가 없는경우 쿼리가 실행되지 않도록 적용한 예시이다.

hive> set hive.mapred.mode = strict;

hive> select * from campaign;

FAILED: SemanticException [Error 10056]: Queries against partitioned tables without a partition filter are disabled for safety reasons. If you know what you are doing, please set hive.strict.checks.no.partition.filter to false and make sure that hive.mapred.mode is not set to 'strict' to proceed. Note that you may get errors or incorrect results if you make a mistake while using some of the unsafe features. No partition predicate for Alias "campaign" Table "campaign"

hive>

 

 

 

아래 스크립트는 WHERE 절에 파티션 필터가 없을 경우에도 쿼리가 실행된다.

hive> set hive.mapred.mode = nonstrict;

hive> select * from campaign;

OK

Time taken: 0.671 seconds

hive>

 

현재 테이블에 생성되어 있는 파티션키 정보를 확인하려면 아래 명령을 실행한다.

hive> show partitions campaign;

OK

date_local=20200616

date_local=20200617

date_local=20200630

Time taken: 0.13 seconds, Fetched: 3 row(s)

hive>

 

 

 

 

2020-07-01 / Sungwook Kang / http://sungwookkang.com

 

 

Hadoop, Big Data, 하둡, 빅데이터, 데이터분석, HDFS, 하둡 파일 시스템, Hive, 하이브, 하이브 테이블, Hive table, 하이브쿼리, Hive SQL, 하이브파티션, 파티션필터, partition filter

Hive 매니지드 테이블 외부 테이블

 

·       Version : Hive

 

하이브에는 매니지드 테이블과 외부 테이블이라고 불리는 테이블 저장 방식이 있다. 둘의 차이점은 데이터 소유자가 하이브이냐, 아니냐로 크게 구분할 있다.

 

매지니드 테이블 (Managed Table) 내부 테이블이라고도 불리며 하이브 속성(hive.metastore.warehouse.dir)에서 정의한 디렉터리의 하위 디렉터리를 만들어서 데이터를 저장한다. 하이브에서 매니지드 테이블을 삭제할때 테이블내의 데이터가 삭제된다.

 

외부 테이블은 테이블을 생성할때, EXTERNAL 키워드를 사용하며, LOCATION절에서 지정한 위치에 데이터가 존재한다는것을 하이브에게 알려준다. 하이브에서 외부 테이블을 삭제하면, 하이브 내에서 스키마만 삭제될 데이터는그대로 존재한다. 그래서 중요한 데이터의 경우 실수를 방지하기 위해 외부 테이블로 만드는것을 권장한다.

 

테이블의 속성이 매니지드 또는 외부인지 확인할 있는 방법은 DESCRIBE EXTENDED 명령을 사용한다.

DESCRIBE EXTENDED 테이블명;

  

 

 

아래 스크립트는 매니지드 테이블처럼 스키마만 복사하여 외부 테이블로 생성한다.

create external table if not exists testdb.tbl_b

like testdb.tbl_a

location '/user/data/';

 

스키마를 복사하려는 원본 테이블이 외부 테이블인 경우 EXTERNAL 명령을 생략하여도 외부 테이블로 생성된다.

 

 

 

2020-06-24 / Sungwook Kang / http://sungwookkang.com

 

 

Hadoop, Big Data, 하둡, 빅데이터, 데이터분석, HDFS, 하둡 파일 시스템, Hive, 하이브, 하이브 테이블, Hive table, 하이브쿼리, Hive SQL

HDFS 저장소에 데이터를 압축해서 저장하면 좋을까?

 

·       Version : HDFS

 

HDFS 클러스터에서 데이터를 저장할때, 압축을 해서 보관하는것이 좋을까? 그냥 저장하는 것이 좋을까? 결론부터 말하면 반은 맞고 반은 틀리다. , 압축의 특성을 이해하고 사용하면 좋지만, 그렇지 못할경우 오히려 HDFS 장점을 활용하지 못할 수도 있다.

 

맵리듀스가 처리할 데이터를 압축하는 방법을 고려할때, 압축 포맷이 분할을 지원하는지 여부를 이해하는것이 중요하다. 예를들어 HDFS 1GB 데이터 파일을 저장한다고 가정한다.  64MB 블록으로 처리할 경우 16개의 블록으로 나뉘어 HDFS 저장된다. 리듀스에서 파일을 입력 데이터로 사용할 경우 16개의 독립적으로 처리되는 입력 분할을 생성할 것이다.

 

 

 

그런데 압축 크기가 1GB 하나의 gzip 압축 파일이 있다고 가정한다. 기존처럼 HDFS 16개의 블록에 저장할 것이다. 그러나 블록에 대한 분할 생성은 gzip 스트림이 특정 위치에서 읽기를 지원하지 않기 때문에 동작을 하지 않을것이다.  , 맵태스크가 나머지 블록의 분할을 개별적으로 읽는것은 불가능하므로 gzip 포맷을 저장하기 위해 DEFLATE 사용하고, DEFLATE 데이터를 일련의 압축된 블록으로 저장한다. 리더가 다음 블록의 시작으로 이동하려면 스트림과 동기화되어 스트림의 특정 지점에 있을 있는 어떤 방법을 지원해야 하는데, DEPLATE 압축 방식은 블록의 시작점을 구분할 없기 때문에  gzip 분할을 지원하지 않는다. 그래서 맵리듀스는 gzip 분할을 지원하지 않는다는 것을 인식하고, 파일을 분할하려고 하지 않을것이다. 그러면 단일 지역으로 데이터가 편향되어 지역성 비용이 증가하게 된다. , 단일 맵이 16개의 HDFS 블록을 처리할 것이고, 블록은 대부분 맵의 로컬에 있지 않을 가능성이 크다. 소수의 맵과 함께 잡은 일반적인 잡보다 세분화 되지 않아 오랫동안 수행될 확률이 크다.

 

압축파일이 bzip2 어떨까? bzip2 파일은 블록 사이에서 동기화 표시가를 제공(파이의 48비트 근사치)하고 결과적으로 분할을 지원한다.

 

ZIP파일은 아카이브 포맷이기 때문에 다중 파일을 단일 ZIP 아카이브로 결합시킬 있다. 파일은 개별적으로 압축되고 아카이브에 있는 모든 파일 위치는 ZIP 파일의 끝에서 중앙 디렉터리에 저장된다. 이러한 속성은 ZIP 파일이 파일 단위로 분할을 지원한다는 것을 의미한다. 그리고 분할은 ZIP 아카이브로부터 하나 이상의 파일들을 포함한다. (zip 지원 여부는 확인이 필요하다.)

 

LZO 파일의 경우 기존의 압축 포맷의 리더가 스트림과 동기화되는 방법을 제공하지 않기 때문에 분할이 불가능하다.

 

아래표는 하둡에서 지원하는 압축 분할 여부이다.

Compression format

Tool

Algorithm

File extention

Splittable

gzip

gzip

DEFLATE

.gz

No

bzip2

bizp2

bzip2

.bz2

Yes

LZO

lzop

LZO

.lzo

Yes if indexed

Snappy

N/A

Snappy

.snappy

No

 

외에도 시퀀스 파일을 사용하거나,  청크 단위로 파일을 나누어서(이때 청크는 HDFS 블록 하나 정도 크기로 생성한다.) 개별적으로 압축을 하여 사용하면 압축 파일 분할 여부와 관계없이 어느정도 효율성을 발휘할 있다.  

 

 

[참고자료]

·       Choosing a Data Compression Format : https://docs.cloudera.com/documentation/enterprise/5-3-x/topics/admin_data_compression_performance.html

·       Data Compression in Hadoop : http://comphadoop.weebly.com/

 

 

 

2020-06-22 / Sungwook Kang / http://sungwookkang.com

 

 

Hadoop, Big Data, 하둡, 빅데이터, 데이터분석, HDFS, 하둡 파일 시스템, 하둡 파일 압축, 분산 처리, 분산 저장

Hive 테이블

 

·       Version : Hive

 

하이브에서 테이블을 생성 할때에는 SQL 규칙을 따르지만 테이블의 데이터 파일 생성 위치나 사용할 포맷등 확장기능을 사용하여 유연성을 제공한다.

CREATE [TEMPORARY] [EXTERNAL] TABLE [IF NOT EXISTS] [db_name.]table_name    -- (Note: TEMPORARY available in Hive 0.14.0 and later)

  [(col_name data_type [column_constraint_specification] [COMMENT col_comment], ... [constraint_specification])]

  [COMMENT table_comment]

  [PARTITIONED BY (col_name data_type [COMMENT col_comment], ...)]

  [CLUSTERED BY (col_name, col_name, ...) [SORTED BY (col_name [ASC|DESC], ...)] INTO num_buckets BUCKETS]

  [SKEWED BY (col_name, col_name, ...)                  -- (Note: Available in Hive 0.10.0 and later)]

     ON ((col_value, col_value, ...), (col_value, col_value, ...), ...)

     [STORED AS DIRECTORIES]

  [

   [ROW FORMAT row_format]

   [STORED AS file_format]

     | STORED BY 'storage.handler.class.name' [WITH SERDEPROPERTIES (...)]  -- (Note: Available in Hive 0.6.0 and later)

  ]

  [LOCATION hdfs_path]

  [TBLPROPERTIES (property_name=property_value, ...)]   -- (Note: Available in Hive 0.6.0 and later)

  [AS select_statement];   -- (Note: Available in Hive 0.5.0 and later; not supported for external tables)

 

“IF NOT EXISTS” 명령은 테이블의 존재 유무를 확인하여, 테이블이 없을 경우 명령을 실행한다. 명령을 사용하면, 동일한 이름의 테이블이 있을경우 에러를 발생시키지 않고 다음 단계로 진행 있다. 하지만 이름만 확인할 스키마 구조까지 확인하는것은 아니다.

 

아래 스크립트는 Hive에서 테이블의 데이터를 제외한 스키마만 복사한다.

CREATE [TEMPORARY] [EXTERNAL] TABLE [IF NOT EXISTS] [db_name.]table_name

  LIKE existing_table_or_view_name

[LOCATION hdfs_path];

 

ex) CREATE TABLE IF NOT EXISTS testdb.mytable2 LIKE testdb.mytable;

 

테이블 정보를 확인하기 위해서는 DESCRIBE 명령을 사용한다.

describe tlb_a;

 

 

테이블의 정보를 자세히 확인할 때에는 EXTENDED 명령을 추가한다. EXTENDED 사용할 경우 자세한 정보가 출력되지만, 사람이 읽기에는 줄바꿈 등이 되지 않아 가독성이 불편하다.

describe extended tlb_a;

 

 

 

EXTENDED 대신 FROMATTED 사용하면 줄바꿈등이 적용되어 가독성이 뛰어나다.

describe formatted tlb_a;

 

 

EXTENDED 옵션을 사용한 출력에서 location 항목은 테이블의 데이터를 저장하는 HDFS 디렉터리 전체 URI 경로를 보여준다.

 

 

[참고자료]

 

 

 

2020-06-22 / Sungwook Kang / http://sungwookkang.com

 

 

Hadoop, Big Data, 하둡, 빅데이터, 데이터분석, HDFS, 하둡 파일 시스템, Hive, 하이브, 하이브 테이블, Hive table, 하이브쿼리, Hive SQL

 

+ Recent posts