Hive?
MapReduce 코드를 HiveQl을 이용하여 간편화 시킨 쿼리 엔진
- 배치성 작업을 실행시킬 때 주로 사용
- MapReduce,Tez, Spark등을 Engine으로 사용 가능
- HiveQl
- SQL과 유사한 Query 제공
- 0.14.0 이후 버전부터
Update/Delete
지원 - Insert는 덮어쓰기, 빈 테이블에만 사용 가능
- Select문에서 Having절은 사용 불가하다
버전별 차이
- Hive 1.X
- SQL을 이용하여 MapReduce 가능
- 파일 데이터를 논리적 표현
- Hive 2.X
- LLAP구조 추가
- LLAP : 작업을 실행한 데몬을 유지하여 핫 데이터 케싱을 통해 빠른 데이터 처리
- HPLSQL 추가
- HPL/SQL를 보면 사용법이 나온다.
- Hive의 PL/SQL이라고 보면 된다.
- 기본 실행엔진 MapReduce -> TEZ
- LLAP구조 추가
- Hive 3.X
- MapReduce엔진, Hive CLI,Hcat CLI, WebHCat삭제
- TEZ엔진, BeeLine 사용
- MapReduce엔진, Hive CLI,Hcat CLI, WebHCat삭제
요소
Metastore
- Hive 테이블 및 파티션의 모든 Meta 정보 및 HDFS 맵핑 정보 저장
- Hive는 RDB처럼 Schema에 맞춰 데이터를 적재하는 것이 아닌 데이터를 적재 후 Schema를 입히는 방식
- Hive는 RDB처럼 Schema에 맞춰 데이터를 적재하는 것이 아닌 데이터를 적재 후 Schema를 입히는 방식
DataBase
- Embedded
- Derby를 이용하여 사용
- 1번에 1개의 프로세스만 접근가능
- 단위 테스트 용도로만 사용!
- Local / Remote
- Mysql과 같은 외부 RDBMS를 사용
Server
- Embeded / Local
- Hive Client내에 Library처럼 사용되는 서버
- 주로 HiveServer2와 함께 사용
- Remote
- Metastore가
독립 Server로 구동
- Client는 Thrift 통신을 이용하여 접근
- Thrift : 서버에 있는 서로 다른 언어로 작성된 함수 혹은 프로시저를 호출해서 사용
- 위와 같이 구동되는 서버를 Hcat 서버라 부름
- Client는 Thrift 통신을 이용하여 접근
- Metastore가
HCatalog
- Grid Computing 상에서 다양한 Processing tools를 이용하여 Read/Write를 보다 쉽게 할 수 있게 만들어주는 관리 계층
- Grid Computing : 원격 병렬 컴퓨팅. Cluster Compung을 WAN으로 연결시킨 상태
- Hive 0.11.0부터 Hcatalog와 Hive가 통합됨
- SerDe( Serializer-Deserializer )할 수 있는 모든 Read/Write를 지원
- e.g csv, Json …
- SerDe : Hive가 데이터를 해석하는 방법 row data -> hdfs , hdfs-> row data
- WebHCat
- HCataLog를 REST API로 제공하는 것
HiveServer2
- Client가 HiveQl을 수행할 수 있게 해주는 서비스
- Thrift ,JDBC,ODBC등의 API 제공
- Thrift 기반으로 동작하여 Thrift Server라고도 부름
Beeline
- JDBC를 사용하여 HiveServer2에 접근하는 SQLline 기반도구
- SQLLine : Java기반으로 DB와 연결하여 SQL을 실행하는 명령줄 유틸리티
- Thrift통신으로 접속하고 , Comman Line을 이용
- XML, CSV, TSV로 출력할 수 있다.
Table
Hive에는 크게 2종류의 Table 형식이 있다.
- Managed Table( Internal Table )
- Location을 따로 설정하지 않은 Table
- 외부 위치가 아닌 서버 내에 Table저장
- Drop table/partition시 메타스토어 정보 및 데이터가 삭제됨
- 주로 임시테이블, 생명 주기 관리에 사용
- External Table
- Location을 따로 설정하는 Table
- 외부 위치에 정의하는 테이블
- 파일이 이미 존재 혹은 원격 위치에 사용 시 적용
- HDFS, S3…
- Drop table/partition시 메타스토어 정보 만 제거됨
Partition
- Hive의 Partition은 HDFS에 Tree구조로 적재된다.
- Partition은 순서에 따라 디렉토리가 구성되기 때문에 cardinality에 따라 순서를 잘 정해야함.
- 테이블의 크기가 너무 커지면 모든 것을 Row를 읽는 것과 같이 불필요한 I/O가 발생할 수 있어 필수적으로 넣는 것을 추천
- 동적 Partition
- 내부 Column을 기준으로 자동 생성하는 Partition
- 기본값 : 200개, 최대값 : 10000+ 가능 참조
- 너무 많은 동적 Partition은 성능 저하 야기
- 2K이상이면 30초 쿼리가 발생 할 수 있다함.
- 너무 많은 동적 Partition은 성능 저하 야기
- e.g. : insert into table tb_sample2 partition ( year,month,day ) select userid,viewtime,year,month,day from tb_sample;
- 정적 Partition
- Partition 정보를 직접 삽입
- eg. insert into table tb_sample partition(year = 2021, month = 05, day =04) values(555,444);
-- 테이블 생성 ( 정적 파티선 )
Create table tb_sample(
userid bigint ,
viewtime int
)
partition by ( year int , month int , date int)
-- 레코드 삽입 < 정적 Partition >
insert into table tb_sample
partition(year = 2021, month = 05, day =07)
values(123,456);
-- 레코드 삽입 < 동적 Partition >
insert into table tb_sample2
partition ( year,month,day )
select userid,viewtime,year,month,day from tb_sample;
- HDFS에서 위와 같은 형태로 생성된다.
- Partition의 위치 정보는 Metastore 에 적재됨
- PARTITIONS
- 파티션 기본 정보
- PARTITION_KEYS
- Partition에서 사용된 Column리스트
- PART_KEY_VALS
- partition의 필드값
- PART_PARAMS
- partition의 속성 정보
Bucketing
- Partition처럼 테이블의 데이터를 분할하는 방식
- N개의 파일로 나누어 저장하는 것.
- Bucketing을 하면 Join시
SMB Join
으로 수행되어 속도 향상을 야기- SMB Join(Sort Merge Bucket Join): Bucketing된 키의 정보를 이용한 Join
CREATE TABLE tbl1(
col1 STRING,
col2 STRING
) CLUSTERED BY (col2) INTO 5 BUCKETS
stored as orc
location 'Path'
tblproperties('orc.compress' = 'SNAPPY')
CREATE TABLE tbl2(
col1 STRING,
col2 STRING
) CLUSTERED BY (col2) SORTED BY (col1) INTO 5 BUCKETS
- 위와 같이
CLUSTERED BY (칼럼) [SORTED BY (칼럼)] INTO 버켓수 BUCKETS
을 추가하여 설정
Skew
- Hive에서 Skew는 데이터 쏠림 현상이라고 볼 수 있다.
- Partition을 나눠놨는데, 특정 Partition에만 데이터가 몰려 있으면 특정 Partition만 비약적으로 커지는 현상이라고 보면 된다.
- Skew는 Partition과 유사한 기능을 하지만, 특정 데이터만 나눠주는 효과를 낼 수 있다.
- e.g 알파벳을 적재하는 테이블이 존재
- a,b가 다른 알파벳에 비해 많이 유입됨
- a,b를 Skew로 등록
- 테이블은 a , b , c-z로 적재 시작
- e.g 알파벳을 적재하는 테이블이 존재
CREATE TABLE tbl (
col1 STRING,
col2 STRING
) SKEWED BY (col1)on ('a', 'b' )
[ STORED as DIRECTORIES ]
location 'Path'
;
- 위와 같은 형식으로 사용 가능
- STORED as DIRECTORIES : 디렉토리 구분 여부
개인적으로 공부한 내용 포스팅 중
잘못된 정보는 지적해주시면 좋겠습니다!
'프로그래밍 및 IT > Hive' 카테고리의 다른 글
Hive 레코드 HDFS 이전 (0) | 2023.08.09 |
---|