Hive?

MapReduce 코드를 HiveQl을 이용하여 간편화 시킨 쿼리 엔진

  • 배치성 작업을 실행시킬 때 주로 사용
    • MapReduce,Tez, Spark등을 Engine으로 사용 가능
  • HiveQl
    • SQL과 유사한 Query 제공
    • 0.14.0 이후 버전부터 Update/Delete 지원
    • Insert는 덮어쓰기, 빈 테이블에만 사용 가능
    • Select문에서 Having절은 사용 불가하다

버전별 차이

  1. Hive 1.X
    • SQL을 이용하여 MapReduce 가능
    • 파일 데이터를 논리적 표현
  2. Hive 2.X
    • LLAP구조 추가
      • LLAP : 작업을 실행한 데몬을 유지하여 핫 데이터 케싱을 통해 빠른 데이터 처리
    • HPLSQL 추가
      • HPL/SQL를 보면 사용법이 나온다.
      • Hive의 PL/SQL이라고 보면 된다.
    • 기본 실행엔진 MapReduce -> TEZ
  3. Hive 3.X
    • MapReduce엔진, Hive CLI,Hcat CLI, WebHCat삭제
      • TEZ엔진, BeeLine 사용

요소

Pasted image 20230925110547.png

Metastore

  • Hive 테이블 및 파티션의 모든 Meta 정보 및 HDFS 맵핑 정보 저장
    • Hive는 RDB처럼 Schema에 맞춰 데이터를 적재하는 것이 아닌 데이터를 적재 후 Schema를 입히는 방식
      Pasted image 20230925112308.png

DataBase

  • Embedded
    • Derby를 이용하여 사용
    • 1번에 1개의 프로세스만 접근가능
      • 단위 테스트 용도로만 사용!
  • Local / Remote
    • Mysql과 같은 외부 RDBMS를 사용

Server

  • Embeded / Local
    • Hive Client내에 Library처럼 사용되는 서버
    • 주로 HiveServer2와 함께 사용
  • Remote
    • Metastore가 독립 Server로 구동
      • Client는 Thrift 통신을 이용하여 접근
        • Thrift : 서버에  있는 서로 다른 언어로 작성된 함수 혹은 프로시저를 호출해서 사용
      • 위와 같이 구동되는 서버를 Hcat 서버라 부름

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 형식이 있다.

  1. Managed Table( Internal Table )
    1. Location을 따로 설정하지 않은 Table
    2. 외부 위치가 아닌 서버 내에 Table저장
    3. Drop table/partition시 메타스토어 정보 및 데이터가 삭제됨
    4. 주로 임시테이블, 생명 주기 관리에 사용
  2. External Table
    1. Location을 따로 설정하는 Table
    2. 외부 위치에 정의하는 테이블
    3. 파일이 이미 존재 혹은 원격 위치에 사용 시 적용
      1. HDFS, S3…
    4. Drop table/partition시 메타스토어 정보 만 제거됨

Partition

  • Hive의 Partition은 HDFS에 Tree구조로 적재된다.
  • Partition은 순서에 따라 디렉토리가 구성되기 때문에 cardinality에 따라 순서를 잘 정해야함.
  • 테이블의 크기가 너무 커지면 모든 것을 Row를 읽는 것과 같이 불필요한 I/O가 발생할 수 있어 필수적으로 넣는 것을 추천
  1. 동적 Partition
    • 내부 Column을 기준으로 자동 생성하는 Partition
    • 기본값 : 200개, 최대값 : 10000+ 가능 참조
      • 너무 많은 동적 Partition은 성능 저하 야기
        • 2K이상이면 30초 쿼리가 발생 할 수 있다함.
    • e.g. : insert into table tb_sample2 partition ( year,month,day ) select userid,viewtime,year,month,day from tb_sample;
  2. 정적 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;

Pasted image 20230925125709.png

  • HDFS에서 위와 같은 형태로 생성된다.
  • Partition의 위치 정보는 Metastore 에 적재됨
  • PARTITIONS
    • 파티션 기본 정보
    • Pasted image 20230925125840.png
  • PARTITION_KEYS
    • Partition에서 사용된 Column리스트
    • Pasted image 20230925130003.png
  • PART_KEY_VALS
    • partition의 필드값
    • Pasted image 20230925130124.png
  • PART_PARAMS
    • partition의 속성 정보
    • Pasted image 20230925130214.png

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 알파벳을 적재하는 테이블이 존재
      1. a,b가 다른 알파벳에 비해 많이 유입됨
      2. a,b를 Skew로 등록
      3. 테이블은 a , b , c-z로 적재 시작
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

이전 사유

HDP 라이센스 문제로 Hadoop-EchoSystem 재구축함에 따라 HDFS, Hive의 버전을 변경하게 됬다

  • HDFS 2.7.3 -> 3.1.1
  • Hive 1.6.3 -> 3.1.2

이전 방법

데이터 복사

# hdfs dfs -cp -f -p src dist
hdfs dfs -cp -f -p hdfs://기존HDFS 주소/기존 테이블 경로/*  hdfs://이전될 HDFS 주소/기존 테이블 경로  
  • (hdfs://이전될 HDFS 주소) 은 명령어 실행위치가 loacal이면 생략해도 된다.
  • option ( 필요 없다면 생략 가능 )
    • f : 덮어쓰기
    • p : 파일정보 그대로 가져가기 e.g 생성일자, 생성 user, group.. 등

복사(전송) 확인

# hdfs dfs -ls path
hdfs dfs -ls /apps/hive/dbName/tbName
drwxr-xr-x   - hive hadoop          0 2022-09-15 19:38 /apps/hive/dbName/tbName
.....
  • 위와 같이 기존과 동일한 hive partition 구조로 디렉토리 및 파일이 잘 전송됬으면 된다.
  • (hdfs://이전될 HDFS 주소) 은 명령어 실행위치가 loacal이면 생략해도 된다.

테이블 인식

msck repair table bd명.tb명;
  • 위와 같이 테이블 복구(msck repair)를 해주면 끝이다.
    • hdfs에는 옮겨졌지만, metastore은 인식하고 있지 않으니 msck repair을 해줘야한다
    • 궁금하다면 msck를 하기전에 조회를 해보고, msck를 한 후 조회를 해보면 msck를 한 기점으로 조회가 되는 것을 확인할 수 있을 것 이다.

결론

우연치 않은 기회로 Hive Records 이전 작업을 수행했다.

처음에는 cp 명령어로 간단하게 될까 했는데 진짜 되서 당황스러웠다,

그래도 막히는 부분이 있어서 여러 문제에 봉착할 줄 알았지만, 기존 테이블과 동일한 조건으로 생성한 후 진행해서 그런지 첫 시도에 해결을 했고 시간을 많이 안 잡아먹어서 다행이다.

이제 저것을 기반으로 shell script만 만들고 성공하면 운영 서버 데이터 이전할 때 편안하게 사용해야겠다.

작성 후 작업중 추가로 발생한 에러

데이터 이전 후 추가로 발생한 에러

'프로그래밍 및 IT > Hive' 카테고리의 다른 글

Hive  (0) 2023.10.24

+ Recent posts